【问题标题】:How to set multiline RSA private key environment variable for AWS Elastic Beans如何为 AWS Elastic Beans 设置多行 RSA 私钥环境变量
【发布时间】:2017-08-22 07:34:50
【问题描述】:

我正在使用 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: 既不是 PUB 密钥也不是 PRIV 密钥:嵌套 asn1 错误

我认为这是因为 RSA 密钥格式错误。

但与 Heroku 不同的是,AWS EB 不接受多行输入(见下文),因此我必须使用 \n 来创建新行。

我尝试了几种不同的样式,但似乎都没有正确插入 \n,而且我总是遇到同样的错误。

我尝试使用\n 和每行的结尾,然后使用\\n 并尝试使用双引号\" 来包装密钥,但我仍然遇到同样的错误。

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

【问题讨论】:

  • 你的钥匙是用来做什么的?如果它应该是 SSH 密钥,那么您需要使用 OpenSSH 格式。
  • 密钥不适用于 SSH。它用于初始化名为 cloudfront-signer 的 gem
  • 这与您将密钥导出到环境中的方式有​​关。用 $'...' 括起来。请参阅下面的 nethsix 的答案。

标签: ruby-on-rails amazon-web-services rsa amazon-elastic-beanstalk


【解决方案1】:

您可以使用 \n 在 EB 中设置它,然后将 '\n' 转换为换行符,然后再将其传递给 config.key - 类似这样(注意对 gsub 的调用中的单引号和双引号) :

single_line_key = ENV.fetch('CLOUDFRONT_KEY')
multi_line_key = single_line_key.gsub('\n', "\n")
config.key = multi_line_key

【讨论】:

  • 嗨!是否有节点解决方案。我一直在尝试+错误。密钥中是否需要包含“\n”字符?
  • 我已经有几年没用过EB了,但是类似的解决方案应该适用于Node。您需要将两个非转义字符 (\n) 放入单行字符串中,然后在运行时将它们转换为换行符,这将为您提供预期的多行字符串。
  • 出于某种原因,我的replace 没有在 Beanstalk 上运行,但它在本地运行。我花了几个小时在这上面,然后就放弃了。我最终使用的快速解决方案只是将密钥编码为 Base64 字符串,然后在代码中解码。理想的解决方案可能是使用 Secrets Manager,但这也可能是矫枉过正
【解决方案2】:

我在使用 Golang 和弹性豆茎时遇到了同样的问题, 我做了这个 转到 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)

【讨论】:

  • 请确保您不要在 Stackoverflow 等公共平台上发布您的个人密钥
【解决方案3】:

您需要将您的多行字符串(例如,您的私钥或公钥)正确“导出”到环境中。

在您的 shell 导出语句中包含 $'.....' 其中......是您的多行字符串,例如,您的私钥或公钥。

示例: export KEY = $'-----BEGIN RSA PRIVATE KEY-----\nSpvpksXQIBA65ICOgQxV2TvMIICAiMeV9prhdJSKjjsk2tYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkkktYdz8lhn/ibROQW71utuHLAyHGMBxz3kIaaIq1kjdkk\n-----END RSA PRIVATE KEY-----'

【讨论】:

    【解决方案4】:

    您可以在 base64 中转换您的私钥,然后将该 base64 存储为环境变量。需要时,您可以解码此变量。

    在 unix 中:

    $ base64 path/to/your/private_key_file
    

    在您的应用程序中:

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

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 2018-09-02
      • 2017-11-05
      • 2016-02-29
      • 2020-02-14
      • 2021-04-08
      • 2015-08-05
      • 1970-01-01
      • 2016-01-26
      相关资源
      最近更新 更多