由于嵌套的asn1错误导致Rails无法从环境中读取证书信息

时间:2016-07-01 00:32:35

标签: ruby-on-rails ruby heroku

我有一些证书文件,即一个.key文件,上面写着:

-----BEGIN RSA PRIVATE KEY-----
IEpAIBAAKCAQEAwAwxt4edIh3UuK8r5
....blablabla..................
QSNoquaasdsaKDybrezemVqCxsQjg==
-----END RSA PRIVATE KEY-----

所以它是RSA私钥。

我曾经从像这样的文件中加载它们:

@private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))

但是由于我使用Heroku,我打算将我的证书保存为环境变量中的值。

所以我将它们粘贴在我的.env文件中

COMPANY_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKC.....\n-----END RSA PRIVATE KEY-----"

是的,我根据Multi-line config variables in Heroku\n换成了明确\\n。所以现在我的代码看起来像这样:

@private_key = OpenSSL::PKey::RSA.new(ENV['COMPANY_KEY'])

如果我从控制台运行它,我会得到构建的对象。但是,如果我尝试从Web服务器(Puma 3.4.0 over Rails 4.2.6,Ruby 2.2.3)运行它,它就会悲惨地说: Neither PUB key nor PRIV key:: nested asn1 error 当试图运行同一行时。

如果我使用调试控制台,我会得到读取文件的样子 "Line 1\\nLine3\\nLinea3"等等......

我很确定它与文件格式有关,但我想出了所有想法,如果你遇到像我这样的问题,也许你可以提供帮助。

2 个答案:

答案 0 :(得分:4)

我终于找到了办法......把它混合起来!

所以文件,例如company.key看起来像

-----BEGIN PRIVATE RSA KEY ----
Mumbojumbomummbojumbo
-----END RSA PRIVATE KEY----

所以我将它切换到一个衬里,在字符串中明确地显示\ n(所以它是真正的\ n)

COMPANY_KEY=""-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA+ztKEj\n-----END RSA PRIVATE KEY-----\n"

不要忘记文件中的最后一个\ n。

现在,最后一部分,在我以前的地方

@private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))

现在我做

@private_key = OpenSSL::PKey::RSA.new(ENV['COMPANY_KEY'].gsub("\\n", "\n"))

现在就像一个魅力!没有公共证书,环境变量中的每一条信息。

答案 1 :(得分:0)

  

我在Heroku中根据Multi-line config variables切换\n以获得明确\\n

     

...   如果我使用调试控制台,我会认为读取文件看起来像"Line 1\\nLine3\\nLinea3" ...

你的问题应该在这里。你链接的帖子不建议双重逃避你的新行,它建议将你的多行文字换成“双引号”。在bash中,它允许在终端输入多行文本。该帖还建议以更容易的方式做到这一点:

heroku config:add MASISA_KEY ="$(cat your_private_key.pem)"