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

Lom*_*fin 2 ruby ruby-on-rails heroku

我有一些证书文件,即.key文件,其中说:

-----BEGIN RSA PRIVATE KEY-----
IEpAIBAAKCAQEAwAwxt4edIh3UuK8r5
....blablabla..................
QSNoquaasdsaKDybrezemVqCxsQjg==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

因此,这是RSA私钥。

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

@private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))
Run Code Online (Sandbox Code Playgroud)

但是,由于我使用的是Heroku,所以我打算将证书另存为它们在环境变量中的值。

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

COMPANY_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKC.....\n-----END RSA PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)

是的,我在Heroku中基于多行配置变量切换了\nfor显式。所以现在我的代码看起来像这样:\\n

@private_key = OpenSSL::PKey::RSA.new(ENV['COMPANY_KEY'])
Run Code Online (Sandbox Code Playgroud)

而且,如果我从控制台运行它,则会得到构建的对象。但是,如果我尝试从Web服务器(基于Rails 4.2.6的Puma 3.4.0,Ruby 2.2.3)运行它,它会惨不忍睹:Neither PUB key nor PRIV key:: nested asn1 error在尝试运行同一行时。

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

我很确定这与文件格式有关,但是我全都没有想法,如果遇到像我这样的问题,也许可以帮上忙。

Lom*_*fin 6

我终于找到了一种方法...将所有内容混合在一起!

因此文件,例如company.key看起来像

-----BEGIN PRIVATE RSA KEY ----
Mumbojumbomummbojumbo
-----END RSA PRIVATE KEY----
Run Code Online (Sandbox Code Playgroud)

所以我将其切换为一个内衬,在字符串中使用显式\ n(因此它是真实的\ n)

COMPANY_KEY=""-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA+ztKEj\n-----END RSA PRIVATE KEY-----\n"
Run Code Online (Sandbox Code Playgroud)

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

现在,最后一部分,在我曾经做过的地方

@private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))
Run Code Online (Sandbox Code Playgroud)

现在我做

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

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