我有一些证书文件,即一个.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"
等等......
我很确定它与文件格式有关,但我想出了所有想法,如果你遇到像我这样的问题,也许你可以提供帮助。
答案 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)"