在 CodeBuild 中从 AWS Secrets Manager 检索 RSA 密钥损坏密钥 "invalid format"

Retrieving RSA key from AWS Secrets Manager in CodeBuild corrupts key "invalid format"

在 CodeBuild 运行 期间,我正在从 SecretsManager 中检索一个 rsa 密钥,这是用于访问 BitBucket 中私有源的私有密钥。为此,我已将私钥复制到一个秘密中,然后在我的构建规范文件中有以下代码段:

  "env": {
    "secrets-manager": {
      "LOCAL_RSA_VAR": "name-of-secret"
    }
  },

在构建规范的安装部分:

"install": {
  "commands": [
    "echo $LOCAL_RSA_VAR" > ~/.ssh/id_rsa,
    "chmod 600 ~/.ssh/id_rsa",
    "yarn install"
  ]
},

然而,这总是以错误结束:

Load key "/root/.ssh/id_rsa": invalid format
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

为了确定密钥是否错误,我尝试将 rsa_id 文件上传到 S3,然后从那里下载并使用这些命令代替:

"install": {
  "commands": [
    "aws s3 cp s3://the-bucket-name/id_rsa ~/.ssh/id_rsa",
    "chmod 600 ~/.ssh/id_rsa",
    "yarn install"
  ]
},

这很好用。

所以我想问题是...有没有人试过这个并且取得了更好的成功?有没有我做的不对你能想到的?

通过比较 Env Var 的输出与 S3 文件中的文件内容,我能够得到答案。 ('cat' 不会打印出秘密 mgr 环境变量的内容)最终环境变量的内容已被 'echo' 命令更改。

最终对我有用的解决方案是:

printenv LOCAL_RSA_VAR > ~/.ssh/id_rsa

此命令没有改变 rsa 的内容,我能够成功使用证书。

作为回顾,这是我成功的做法:

  1. 生成新密钥
  2. 使用命令“pbcopy < id_rsa”将本地密钥放入剪贴板
  3. 已将其粘贴到 Secret Manager 中的新机密中
  4. 使用上面的第一组代码让构建规范文件将内容检索到环境变量中,然后使用上面的 'printenv' 命令,在构建规范文件的安装命令部分,将其保存到默认 ssh 位置。

希望这对遇到相同问题的任何人有所帮助。

更新:我发现如果将 RSA 作为自己的秘密存储为一大块文本,则此方法有效。如果您尝试将其添加为 json 对象的一部分,即:

{
  "some": "thing",
  "rsa_id": "<the rsa key here>"
}

这似乎不起作用。我发现内容被空格代替了换行符。这是我在每个 运行 一个 'od -ax' 并比较它们时发现的:

own secret:
R   I   V   A   T   E  sp   K   E   Y   -   -   -   -   -  nl

json secret:
R   I   V   A   T   E  sp   K   E   Y   -   -   -   -   -  sp

我遇到了同样的问题。 在 S3 中复制从命令 echo $LOCAL_RSA_VAR > ~/.ssh/id_rsa 生成的 id_rsa 我注意到新行没有被保留。

我已经解决了将 var env 放在双引号之间的问题 "":

echo "$LOCAL_RSA_VAR" > ~/.ssh/id_rsa