Ruby
openssl

homebrew で入れた openssl を使って Ruby をコンパイルすると SSL 利用時に証明書エラーが発生する場合の対応

More than 5 years have passed since last update.

さて、皆さん割と homebrew で openssl 入れて brew link しちゃってる人も多いと思います。そんな環境でその openssl を使って Ruby をコンパイルすると、OpenSSL 利用時に証明書エラーが発生します。

$ pry
[1] pry(main)> require 'open-uri'
=> true
[2] pry(main)> open('https://www.google.com/').read
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
from ~/.rbenv/versions/2.0.0-rc2/lib/ruby/2.0.0/net/http.rb:917:in `connect'

エラーをぐぐると山ほど出てきます。ただ大抵書かれてる対応方法が

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

して出てくる標準証明書のパスに

$ wget -O /usr/local/etc/openssl/cert.pem http://curl.haxx.se/ca/cacert.pem

で対応してね、という方法でいささか気持ちが悪かったのでちょっと調べました。

curl.haxx.se って?

cURL のサイトです。

に詳しく書いてありますが、curl のサイト上で配布してる cacert.pem は、Mozilla で利用している証明書です。

(しかしハッシュ値も表示されて無くて https でもないので、いささかこの証明書を突っ込むの不安ですね…)

homebrew から証明書を入れる

同等の証明書は curl-ca-bundle という formula で提供されているので、

$ brew install curl-ca-bundle
$ brew list curl-ca-bundle
/usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt
$ cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem

することで、証明書を設置でき、SSL でのエラーは発生しません。