プログラマでありたい

おっさんになっても、プログラマでありつづけたい

RubyのHTTPS通信で、OpenSSL::SSL::SSLErrorが出たら?

 Mac OSのバージョンアップする度に出しているような気がするのが、RubyのHTTPS通信でのエラー。ルート証明書が見つからなくてエラーがでます。

/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)


 そんな場合は、まずはRubyの慌てず騒がずNet::HTTPがどこに証明書を探しにいっているかを確認します。

$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"/etc/openssl/cert.pem"


 指し示された場所に、あるのでしょうか? 

$ ls /etc/openssl/cert.pem
ls: /etc/openssl/cert.pem: No such file or directory

 ないですね。OSをバージョンアップすると、何故か消えるっぽいです。


 フォルダ作って、証明書をダウンロードします。

$ sudo mkdir /etc/openssl
Password:
$ cd /etc/openssl/
$ sudo wget http://curl.haxx.se/ca/cacert.pem
--2014-05-17 17:10:23--  http://curl.haxx.se/ca/cacert.pem
Resolving curl.haxx.se... 80.67.6.50, 2a00:1a28:1200:9::2
Connecting to curl.haxx.se|80.67.6.50|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 250283 (244K)
Saving to: 'cacert.pem'

100%[======================================>] 250,283      214KB/s   in 1.1s   

2014-05-17 17:10:25 (214 KB/s) - 'cacert.pem' saved [250283/250283]
$ sudo mv cacert.pem cert.pem


 解決!!

OpenSSL::SSL::SSLError



 このエラーは、当然ながらWindowsでも起こりえます。Macの場合と同様に、デフォルトパスの場所にファイルを配置すれば、問題は解決します。それでは、Windows rubyの場合は、デフォルトの証明書のパスは、どこでしょう?RubyInstallerで入れた場合は、次のようになっていました。

>ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
"C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem"

 ダメだ。このフォルダは作れない。誰だよ、Luisって!!そういう場合は、環境変数でしています。

>set SSL_CERT_FILE=C:\Ruby200\cacert.pem

 解決!!