如何规范化存储在 AWS secrets manager 上的私钥
How to normalize a private key stored on AWS secrets manager
编辑:截至 2020 年 2 月,AWS 似乎已修复此错误。不再需要 BASE64ing 和其他方式。
我将我的秘密存储为字符串,但当然,当 aws 存储秘密时,它会删除白色 space 和换行符。在它之上,它将值包装在 json.
中
当我运行aws secretsmanager get-secret-value --secret-id my-private-key > private.pem
它returns类似的东西。
{
"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"
}
所以我需要:
- Strip 从 json
中获取值
- 重新格式化字符串使其更像
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
您需要通过几个步骤将输出管道化 (|)
- 到return只是来自json的键的值使用
jq ".SecretString"
- 要格式化 public 键,请使用
cut -b 2- |tr -d '"' |sed -En "s/\\n/\n/pg"
这将return你想要的。
另请注意,您需要将 private.pem 设置为只读。 (chmod 400 private.pem
)
在夏季,完整的命令将如下所示:
aws secretsmanager get-secret-value --secret-id my-private-key | jq ".SecretString" |cut -b 2- |tr -d '"' |sed -En "s/\\n/\n/pg" > private.pem
另一种选择是对 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=
拿回钥匙:
$ base64 -D encoded_private_key
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
编辑:
假设秘密是 base64 编码的,这将有效:
编码并推送:
aws secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem`
拉取并解码:
aws secretsmanager get-secret-value --secret-id my-private-key --query 'SecretString' --output text |base64 -D > private.pem
执行 --query --output 文本操作可能会使解析更简单,即使您不想对它进行 base64 编码也是如此。
我想出了一个解决方案,利用以纯文本形式在机密管理器中存储机密。
- 将机密以纯文本形式存储在机密管理器中。他们的控制台会有 JSON 括号,但我删除了它们。
使用 cli 以纯文本形式获取机密输出。现在文本中的 \n 和 \s 将被转换为它们应该是的换行符和空格
aws secretsmanager get-secret-value --secret-id privatekey --query
'SecretString' --output text > private.pem
pem 文件现在将被正确格式化
-----BEGIN RSA PRIVATE KEY-----
MIIG3DCCBM
-----END RSA PRIVATE KEY-----
最近遇到了类似的“问题”。
简要说明
- 我们生成了通常的
public
| private
{file-name}.pem 密钥,其格式为:
---BEGIN RSA ... KEY---
...
---END RSA ... KEY---
- 我们存储了那些
public
| private
使用 SecureString
值类型的 AWS SSM(参数存储)服务中的 {file-name}.pem 键。
- 之后我们不得不使用 boto3 获取这些密钥。
分辨率
--> 这段代码会return你base64 ENcoded representation of your key
from boto3 import client
parameter_name = '/ssm/parameter/name/to/fetch'
key = client('ssm').get_parameter(Name=parameter_name).get('Parameter', {}).get('Value', '')
--> 这段代码会return你base64 DEcoded representation of your key
from boto3 import client
parameter_name = '/ssm/parameter/name/to/fetch'
key = client('ssm').get_parameter(Name=parameter_name, WithDecryption=True).get('Parameter', {}).get('Value', '')
因此,请务必在client('ssm').get_parameter()
中使用附加参数WithDecryption=True
,这将自动解决字符串的解码问题。
参考:
灵感来自 Jason Steele 的解决方案。
我知道问题是针对 AWS-CLI 提出的,我在 Java.
中检索信息时遇到了类似的问题
解法:
在AWS控制台配置public/私钥时,使用Base64解码整个密钥内容(也可以使用Notepad++)
在检索数据的同时,解码并获取它。它解决了这个问题。 PFB java 代码。
secret = getSecretValueResult.getSecretString(); // gets the entire secret object
Object obj=JSONValue.parse(secret);
//creating an object of JSONObject class and casting the object into JSONObject type
JSONObject jsonObject = (JSONObject) obj;
//getting values form the JSONObject and casting that values into corresponding types
String vendorPublicKey = (String) jsonObject.get("vendorPublicKey");
String decodedKey = vendorPublicKey != null ? new String(Base64.getDecoder().decode(vendorPublicKey)) : "";
decodedKey
将具有有效格式的 public/private 密钥。
编辑:截至 2020 年 2 月,AWS 似乎已修复此错误。不再需要 BASE64ing 和其他方式。
我将我的秘密存储为字符串,但当然,当 aws 存储秘密时,它会删除白色 space 和换行符。在它之上,它将值包装在 json.
中当我运行aws secretsmanager get-secret-value --secret-id my-private-key > private.pem
它returns类似的东西。
{
"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"
}
所以我需要:
- Strip 从 json 中获取值
- 重新格式化字符串使其更像
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
您需要通过几个步骤将输出管道化 (|)
- 到return只是来自json的键的值使用
jq ".SecretString"
- 要格式化 public 键,请使用
cut -b 2- |tr -d '"' |sed -En "s/\\n/\n/pg"
这将return你想要的。
另请注意,您需要将 private.pem 设置为只读。 (chmod 400 private.pem
)
在夏季,完整的命令将如下所示:
aws secretsmanager get-secret-value --secret-id my-private-key | jq ".SecretString" |cut -b 2- |tr -d '"' |sed -En "s/\\n/\n/pg" > private.pem
另一种选择是对 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=
拿回钥匙:
$ base64 -D encoded_private_key
-----BEGIN RSA PRIVATE KEY-----
asdkmnasefkljzsdkffjsldkgfjlzkmsdflkNOTAREALKEYasddkjnsfdlzxdfvlkmdggo=
-----END RSA PRIVATE KEY-----
编辑: 假设秘密是 base64 编码的,这将有效:
编码并推送:
aws secretsmanager create-secret --name my-private-key --secret-string `base64 private.pem`
拉取并解码:
aws secretsmanager get-secret-value --secret-id my-private-key --query 'SecretString' --output text |base64 -D > private.pem
执行 --query --output 文本操作可能会使解析更简单,即使您不想对它进行 base64 编码也是如此。
我想出了一个解决方案,利用以纯文本形式在机密管理器中存储机密。
- 将机密以纯文本形式存储在机密管理器中。他们的控制台会有 JSON 括号,但我删除了它们。
使用 cli 以纯文本形式获取机密输出。现在文本中的 \n 和 \s 将被转换为它们应该是的换行符和空格
aws secretsmanager get-secret-value --secret-id privatekey --query 'SecretString' --output text > private.pem
pem 文件现在将被正确格式化
-----BEGIN RSA PRIVATE KEY-----
MIIG3DCCBM
-----END RSA PRIVATE KEY-----
最近遇到了类似的“问题”。
简要说明
- 我们生成了通常的
public
|private
{file-name}.pem 密钥,其格式为:
---BEGIN RSA ... KEY---
...
---END RSA ... KEY---
- 我们存储了那些
public
|private
使用SecureString
值类型的 AWS SSM(参数存储)服务中的 {file-name}.pem 键。 - 之后我们不得不使用 boto3 获取这些密钥。
分辨率
--> 这段代码会return你base64 ENcoded representation of your key
from boto3 import client
parameter_name = '/ssm/parameter/name/to/fetch'
key = client('ssm').get_parameter(Name=parameter_name).get('Parameter', {}).get('Value', '')
--> 这段代码会return你base64 DEcoded representation of your key
from boto3 import client
parameter_name = '/ssm/parameter/name/to/fetch'
key = client('ssm').get_parameter(Name=parameter_name, WithDecryption=True).get('Parameter', {}).get('Value', '')
因此,请务必在client('ssm').get_parameter()
中使用附加参数WithDecryption=True
,这将自动解决字符串的解码问题。
参考:
灵感来自 Jason Steele 的解决方案。
我知道问题是针对 AWS-CLI 提出的,我在 Java.
中检索信息时遇到了类似的问题解法:
在AWS控制台配置public/私钥时,使用Base64解码整个密钥内容(也可以使用Notepad++)
在检索数据的同时,解码并获取它。它解决了这个问题。 PFB java 代码。
secret = getSecretValueResult.getSecretString(); // gets the entire secret object
Object obj=JSONValue.parse(secret);
//creating an object of JSONObject class and casting the object into JSONObject type
JSONObject jsonObject = (JSONObject) obj;
//getting values form the JSONObject and casting that values into corresponding types
String vendorPublicKey = (String) jsonObject.get("vendorPublicKey");
String decodedKey = vendorPublicKey != null ? new String(Base64.getDecoder().decode(vendorPublicKey)) : "";
decodedKey
将具有有效格式的 public/private 密钥。