如何为AWS Elastic Beans设置多行RSA私钥环境变量

20

我正在使用 Elastic Beanstalk 将 Ruby on Rails 应用部署到 AWS,必须将私钥设置为环境变量。

例如:

-----BEGIN RSA PRIVATE KEY----- SpvpksXQIBA65ICOgQxV2TvMIICAiMeV9prhdJSKjjsk2 tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk -----END RSA PRIVATE KEY-----

但是,在部署应用程序时,似乎无法正常工作,因为始终会出现以下错误:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error

我认为这是由于 RSA 密钥格式不正确造成的。

不过,与 Heroku 不同,AWS EB 不接受多行输入(请参见下面的截图),因此我必须使用 \n 来创建新行。

enter image description here

我尝试了几种不同的样式,但似乎没有一个能够正确插入 \n,我总是会收到相同的错误。

我已经尝试了在每行末尾使用 \n,然后尝试使用 \\n,还尝试使用双引号 \" 来包装密钥,但仍然无法解决该错误。

如何在 AWS Elastic Beanstalk 中正确设置多行环境变量?


你的密钥将用于什么?如果它应该是一个SSH密钥,那么你需要使用OpenSSH格式。 - Artjom B.
该密钥不是用于SSH,而是用于初始化名为cloudfront-signer的gem。 - Ranhiru Jude Cooray
这与您将密钥导出到环境中的方式有关。用$'...'括起来。请参见nethsix下面的答案。 - nethsix
4个回答

13

您可以将私钥转换为base64格式,然后将该字符串存储为环境变量。需要时,您可以对此变量进行解码。

在UNIX系统中:

$ base64 path/to/your/private_key_file

在你的应用程序中:

def private_key
  Base64.decode64(ENV['PRIVATE_KEY'])
end

7
您可以使用\n在EB中设置它,然后在将其传递给config.key之前将'\n'转换为换行符 - 就像这样(请注意,在调用gsub时的单引号和双引号):
single_line_key = ENV.fetch('CLOUDFRONT_KEY')
multi_line_key = single_line_key.gsub('\n', "\n")
config.key = multi_line_key

1
你好!有没有Node的解决方案?我已经试错了很久,把自己的头发都拔光了。这个键需要包含“\n”字符吗? - user2402616
我已经好几年没用EB了,但是一个类似的解决方案应该适用于Node。你需要在单行字符串中放置两个非转义字符(\n),然后在运行时将它们转换为换行符,这样就可以得到预期的多行字符串。 - Brian
1
由于某种原因,我的 replace 在 Beanstalk 上没有运行,但在本地上却可以。我在这上面花了几个小时,最终放弃了。我最终使用的快速解决方案是将键编码为 Base64 字符串,然后在代码中解码。理想的解决方案可能是使用 Secrets Manager,但那也可能会过度设计。 - user2402616

4

我曾在使用Golang和弹性Beanstalk时遇到了同样的问题,我采取了如下措施:前往AWS控制台并设置值如下:

-----BEGIN RSA PRIVATE KEY-----\nSpvpksXQIBA65ICOgQxV2TvMIICAiMeV9prhdJSKjjsk2\ntYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk\ntYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk\ntYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk\ntYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkk\n-----END RSA PRIVATE KEY-----  

在我的代码内部

key := os.Getenv("PUSH_AUTH_KEY")
key = strings.Replace(key, `\n`, "\n", 5)

11
请确保您不要在公共平台(如 Stackoverflow)上发布个人密钥。 - Ankit Kante

1
您需要将多行字符串(例如私钥或公钥)正确地导出到环境中。在您的shell export语句中使用$'.....'括起来,其中......是您的多行字符串(例如私钥或公钥)。
示例: export KEY = $'-----BEGIN RSA PRIVATE KEY-----\nSpvpksXQIBA65ICOgQxV2TvMIICAiMeV9prhdJSKjjsk2tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkk\n-----END RSA PRIVATE KEY-----'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接