AWS Secrets Manager更新Secret String时额外JSON编码问题求助
问题描述
使用AWS CLI更新包含X509证书的JSON密钥时,传入--secret-string的Payload编码符合预期,但AWS Secrets Manager存储时会对换行符进行额外编码。导致Go应用调用tls.X509KeyPair()时无法识别证书内容;但手动将Payload粘贴到网页端更新密钥,格式可正常保留,代码也能正常运行。需要修复上传时的编码问题,而非在Go中获取密钥后再格式化/转义PEM/密钥内容。
示例
- 执行的CLI命令:
aws secretsmanager update-secret --secret-id my-secret --secret-string '{"PEM":"-----BEGIN CERTIFICATE----- ... ... ... -----END CERTIFICATE----- ","KEY":"..."}'
- 实际存储的密钥:
{"PEM":"-----BEGIN CERTIFICATE-----\\n...\\n...\\n...\\n-----END CERTIFICATE-----\\n","KEY":"..."}
当前使用的命令:
- 拼接PEM内容:
STRING_PEM=$(awk '{printf "%s\n", $0}' $PemFile) - 生成JSON字符串:
SECRET_STRING=$(jq -r 'tostring' $UPDATED_SECRET)
解决方案
问题出在当前的PEM处理和JSON序列化流程上,awk的拼接会引入不必要的换行处理,而jq -r 'tostring'会将JSON对象转为字符串,导致换行符被双重转义。改用以下方式直接生成正确的JSON:
- 直接用
jq读取PEM和密钥文件内容,自动处理换行符转义:
SECRET_STRING=$(jq -n \ --arg pem "$(cat "$PemFile")" \ --arg key "$(cat "$KeyFile")" \ '{PEM: $pem, KEY: $key}')
- 执行AWS CLI更新命令:
aws secretsmanager update-secret --secret-id my-secret --secret-string "$SECRET_STRING"
原理说明
jq -n用于创建新的JSON对象,--arg参数会自动将文件内容中的换行符转义为\n,生成符合JSON规范的字符串。- 直接将
jq输出的JSON传给--secret-string,避免了shell对字符串的二次转义,确保AWS Secrets Manager存储的是正确的单转义换行符,Go应用调用tls.X509KeyPair()时可直接识别。
内容的提问来源于stack exchange,提问作者Tony M
相关产品推荐
相关产品推荐

