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

我有一些证书文件,即一个.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-----" 

是的,我根据Heroku中的多行配置变量切换了\n for explicits \\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"等等……

我很确定它与文件格式有关,但我完全没有想法,如果你遇到类似我的问题,也许你可以提供帮助。

我终于找到了办法做到这一点……把它混合起来!

所以文件,例如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")) 

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

我根据Heroku中的多行配置变量切换了\n for explicits \\n

…如果我使用调试控制台,我得到的读取文件看起来像"Line 1\\nLine3\\nLinea3" ……

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

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

省去一些麻烦,只在证书或密钥体中存储环境变量。 无需输入换行符。

 SECRET = <<-SECRET -----BEGIN PRIVATE KEY----- #{ENV['SECRET_KEY']} -----END PRIVATE KEY----- SECRET CERTIFICATE = <<-CERT -----BEGIN CERTIFICATE----- #{ENV['CERT']} -----END CERTIFICATE----- CERT