由于嵌套的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