在 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 的内容,我能够成功使用证书。
作为回顾,这是我成功的做法:
- 生成新密钥
- 使用命令“pbcopy < id_rsa”将本地密钥放入剪贴板
- 已将其粘贴到 Secret Manager 中的新机密中
- 使用上面的第一组代码让构建规范文件将内容检索到环境变量中,然后使用上面的 '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
在 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 的内容,我能够成功使用证书。
作为回顾,这是我成功的做法:
- 生成新密钥
- 使用命令“pbcopy < id_rsa”将本地密钥放入剪贴板
- 已将其粘贴到 Secret Manager 中的新机密中
- 使用上面的第一组代码让构建规范文件将内容检索到环境变量中,然后使用上面的 '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