herokuの環境変数にRSA公開鍵を登録し、それを使ってOpenSSLオブジェクトを生成する際に手間取ったのでまとめます。
## はじめに
はじめに、以下の様な形でコードを書きました。
open_ssl_obj = OpenSSL::PKey::RSA.new ENV['RSA_PRIVATE_KEY']
そしてherokuの環境変数は以下のように設定しました。
$ heroku config:set RSA_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...中略...-----END PRIVATE KEY-----\n"
しかし、このコードを実行した際に以下のエラーが起こりました。
OpenSSL::PKey::RSAError (Neither PUB key nor PRIV key: nested asn1 error)
色々と試していくと以下のようなことが分かりました。
- ローカル環境にて環境変数ではなく、直接RSA公開鍵の内容を入れて実行する → 成功!
- ローカル環境にて環境変数にRSA公開鍵を設定し、実行する → 成功!
- herokuにて環境変数ではなく、直接RSA公開鍵の内容を入れて実行する → 成功!
heroku config
で ENV['RSA_PRIVATE_KEY']
の値を確認したのですが、値自体は合っていました。
解決方法
またもや色々と調べた結果、以下のコードで解決しました。
open_ssl_obj = OpenSSL::PKey::RSA.new ENV['RSA_PRIVATE_KEY'].gsub("\\n", "\n")
どうもherokuの環境変数に設定した値に \n
や '&' などがあった場合は、エスケープされる様子。
なので、コード上で読み込む際にそのエスケープされた部分を消してあげることが必要なようです。