如何规范存储在 AWS Secrets Manager 上的私有密钥

Jos*_*ard 16 amazon-web-services aws-cli aws-secrets-manager

编辑:截至 2020 年 2 月,AWS 似乎已修复此错误。不再需要 BASE64ing 和其他明智的选择。


我将我的秘密存储为字符串,但当然,当 aws 存储秘密时,它会删除空格和换行符。最重要的是,它将值包装在 json 中。

当我运行aws secretsmanager get-secret-value --secret-id my-private-key > private.pem它返回类似的东西。

{
    "Name": "ai-data-devops-ansible-deploy-key",
    "VersionId": "fedafe24-d3eb-4964-9a8f-7f4ecb375a35",
    "SecretString": "-----BEGIN RSA PRIVATE KEY-----\nasdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=\n-----END RSA PRIVATE KEY-----\n",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1568147513.11,
    "ARN": "arn:aws:secretsmanager:us-east-1:13726472r4:secret:my-private-key-XQuwafs"
}
Run Code Online (Sandbox Code Playgroud)

所以我需要:

  • 剥离从 json 中获取值
  • 重新格式化字符串以使其更像
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

Jas*_*ele 24

另一种选择是对 PEM 进行 base64 编码以进行存储:

对密钥进行编码:

$ cat private_key 
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
$ base64 private_key > encoded_private_key

$ cat encoded_private_key
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQphc2RrbW5hc2Vma2xqenNka2ZmanNsZGtnZmpsemttc2RmbGtOT1RBUkVBTEtFWWFzZGRram5zZmRsenhkZnZsa21kZ2dvPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
Run Code Online (Sandbox Code Playgroud)

取回钥匙:

$ base64 -D encoded_private_key
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

编辑:假设秘密是 base64 编码的,这将起作用:

编码和推送:

aws secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem`
Run Code Online (Sandbox Code Playgroud)

拉取和解码:

aws secretsmanager get-secret-value --secret-id my-private-key --query 'SecretString' --output text |base64 -D > private.pem
Run Code Online (Sandbox Code Playgroud)

执行 --query --output text 操作可能会使解析更简单,即使您也不想对它进行 base64 编码。

  • 您可以告诉 aws cli 使用 jsonpath 表达式来为您处理该问题。完整命令为 $ aws Secretsmanager get-secret-value --secret-id (secret id) --query 'SecretString' --output text |base64 -D (2认同)
  • 顺便说一句,推送秘密的命令是:``aws Secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem` ``。 (2认同)
  • 在我的计算机(Ubuntu 18.04)上,我必须将上述命令更改为: `aws Secretsmanager create-secret --name my-private-key --secret-string "$(base64 private.pem)"` 和 `aws Secretsmanager获取秘密值 --secret-id my-private-key --query 'SecretString' --输出文本 | base64 -d > private.pem` (2认同)

小智 9

我想出了一个解决方案,利用将秘密以纯文本形式存储在秘密管理器中。

  1. 将机密以纯文本形式存储在机密管理器中。他们的控制台将有 JSON 括号,但我删除了它们。
  2. 使用 cli 以纯文本形式获取秘密输出。现在文本中的 \n 和 \s 将被转换为它们应该是的换行符和空格

    aws secretsmanager get-secret-value --secret-id privatekey --query 
    'SecretString' --output text > private.pem
    
    Run Code Online (Sandbox Code Playgroud)

pem 文件现在将被正确格式化

    -----BEGIN RSA PRIVATE KEY-----
    MIIG3DCCBM
    -----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)