2

在引导 wiki ( https://github.com/boot-clj/boot/wiki/S3-Repositories ) 中,它指定您可以内联 AWS 凭证以将 S3 用作 Maven 存储库。从安全角度来看,这是次优的,因为我不想签入 AWS 凭据,即使它们的权限有限。

在带有 s3-wagon-private 的 leiningen 中,您可以通过环境变量指定访问密钥和密钥:

{:url "s3p://acme/repo/"
 :username :env
 :passphrase :env} 

或者,从特定的环境变量,使用:

{:url "s3p://acme/repo/"
 :username :env/aws_access_key_id
 :passphrase :env/aws_secret_access_key}

或者使用 GPG 加密~/.lein/credentials.clj.gpg文件:

{:url "s3p://acme/repo/"
 :creds :gpg}

boot 中的push任务似乎支持 GPG 加密凭据以部署到 Clojars(https://github.com/boot-clj/boot/wiki/Deploying-with-Boot)中$BOOT_HOME/credentials.clj.gpg。所以,一般来说,boot 似乎支持 GPG。

当我尝试任一环境变量方法时,我收到以下错误,表明不支持这种形式的凭据:

java.lang.IllegalArgumentException: No matching ctor found for class org.sonatype.aether.repository.Authentication
                                                 ...                                        
      cemerick.pomegranate.aether/set-authentication  aether.clj:  165
         cemerick.pomegranate.aether/make-repository  aether.clj:  185
cemerick.pomegranate.aether/resolve-dependencies*/fn  aether.clj:  712
...

GPG 方法似乎无法获取凭据,并导致 S3 出现 403 错误。

我想我可以(System/getenv "AWS_ACCESS_KEY_ID")用来直接读取存储库映射中的 env 变量,但如果有一个受支持的机制,我宁愿使用它。如果可以从安全角度以及设置多个 S3 Wagon 而无需处理环境变量,那么 GPG 加密凭证将是我们的理想解决方案。

我在 OS X El-Capitan 上使用最新的 Boot (2.4.2)。GPG 可以在命令行上成功解密凭证,即使在安静模式下(gpg --quiet --batch --decrypt ~/.boot/credentials.clj.gpg有效)。将凭证直接放在存储库映射中确实有效,并且相同的credentials.clj.gpg文件在 lein 中有效。不过,我是 Boot 新手,所以我可能遗漏了一些明显的东西!

4

1 回答 1

3

请更新到 Boot-clj 2.5.0,它大大简化了 gpg 签名和加密。它现在利用gpg二进制文件,无需进一步配置即可获取您的设置。

通过内置configure-repositories!工具支持 GPG 加密的凭据和环境变量。它接受将在存储库映射上运行的函数。只要您返回存储库映射,您就可以在正文中做任何您想做的事情。

因此,在您的情况下,对于 GPG 加密的凭据:

(configure-repositories!
  (let [creds-file (File. (boot.App/bootdir) "credentials.gpg")
        creds-data (gpg-decrypt creds-file :as :edn)]
          (fn [{:keys [url] :as repo-map}]
             (merge repo-map (creds-data url)))))

对于环境变量:

(configure-repositories!
  (fn [{:keys [url] :as repo-map}]
    (->> (condp re-find url
            #"^https://example\.org/repo"
            {:username (get-sys-env "EXAMPLE_USER" :required)
            :password (get-sys-env "EXAMPLE_PASS" :required)}
            #".*" nil)
         (merge repo-map))))

把它放在你的boot.profile.

有关维基的更多信息

于 2015-12-17T02:51:15.727 回答