2016-07-01 160 views
1

我有一些證書文件,即.key文件它說:的Rails無法讀取從環境證書信息因嵌套ASN1錯誤

-----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-----" 

呀粘貼他們,我切換了\n基於Multi-line config variables in Heroku清楚地表達\\n。所以現在我的代碼看起來像這樣:

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

如果我從控制檯運行它,我會得到構建的對象。但是如果我嘗試從網絡服務器(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

請創建一個測試私鑰,然後發佈它。雖然你這樣做,看看[如何使用openssl生成RSA私鑰?](http://stackoverflow.com/a/30493975/608639)。注意*** ***公鑰***和***公鑰***信息***之間的區別與預封裝頭(***'----- BEGIN RSA PUBLIC KEY ---- ***'與***'----- BEGIN PUBLIC KEY ----- ***)。這同樣適用於私鑰。 – jww

回答

0

根據Heroku中的Multi-line config variables,我轉換了\n以說明\\n

... 如果我使用調試控制檯我得到讀取文件看起來像"Line 1\\nLine3\\nLinea3" ...

你的問題應該在這裏。您所鏈接的文章並不是建議將您的新行加倍轉義,而是建議將多行文本包裝爲「雙引號」。在bash中,它允許在終端輸入多行文本。該帖子還建議以更簡單的方式做到這一點:

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

也許這可能會幫助我將密鑰上傳到Heroku,但我正試圖在我的開發機器上測試我的代碼。所以我覺得需要試試證書是否正確加載在我的.env文件中。 – Lomefin

2

我終於找到了一種方法來做到這一點...混合起來!

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

現在就像一個魅力!沒有公共證書,環境變量中的每一條信息。

0

節省自己的一些麻煩,並只將證書或密鑰體存儲在環境變量中。無需放入換行符。

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

CERTIFICATE = <<-CERT 
-----BEGIN CERTIFICATE----- 
#{ENV['CERT']} 
-----END CERTIFICATE----- 
CERT