発生する事象
Net::HTTP
を使って一部のサイトにHTTPS接続すると以下のようにOpenSSL::SSL::SSLError
が発生します。
/Users/hideki/.rbenv/versions/2.2.1/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
前提条件
- OS X 10.10.3
- HomebrewからOpenSSLをインストール (10.10.3にアップデートしてからインストールされたもの)
- rbenvなどからHomebrewのOpenSSLをリンクしてRubyをインストール
原因
HomebrewからOpenSSLをインストールすると、Keychainから/usr/local/etc/openssl/cert.pem
を生成するようになっています。1
そして、Homebrewの28b03c2
のコミットにEquifaxの証明書を/usr/local/etc/openssl/certs
配下に追加するワークアラウンドが追加されています。2
このワークアラウンドのコメントを見ると、AppleがEquifax Secure CA rootをOS X 10.10.3で削除したためと書かれています。
しかし、どうやらRubyからはOpenSSL::X509::DEFAULT_CERT_FILE
3に定義されている/usr/local/etc/openssl/cert.pem
しか参照せず、/usr/local/etc/openssl/certs
配下の証明書は見ていないようです。
対処方法
乱暴ですが、/usr/local/etc/openssl/cert.pem
のバックアップを取り、cert.pem
と/usr/local/etc/openssl/certs
配下にあるEquifaxの証明書を結合したものを新たにcert.pem
として置くことで解決しました。
$ cd /usr/local/etc/openssl
$ mv cert.pem cert.pem.backup
$ cat cert.pem.backup certs/Equifax_Secure_Certificate_Authority.pem > cert.pem
ひとまずこれでOS X側が修正されるのを待てばよいと思います。
OS X側が修正されたならば、certs/Equifax_Secure_Certificate_Authority.pem
とcerts/578d5c04.0
を削除し、次のコマンドで再度Keychainからcert.pem
を再生成するとよいでしょう。
$ security find-certificate -a -p /Library/Keychains/System.keychain /System/Library/Keychains/SystemRootCertificates.keychain > cert.pem
Equifax_Secure_Certificate_Authority.pem
を自分でKeychainに入れて上記コマンドを実行するの方法もありますが、SystemのKeychainにホイホイ証明書を入れてしまうのはどうかなと思ってやめました。
他に綺麗な解決法、例えばRubyからも/usr/local/etc/openssl/certs
を使えるようにする方法などがあれば教えて欲しいです
おまけ
以前はHomebrewからcurl-ca-bundleというFomulaをインストールするのが定番でしたが、現在では削除されています。4
-
https://github.com/Homebrew/homebrew/blob/28b03c2f9ee5dcf861a6ff7de750b147fe3138e4/Library/Formula/openssl.rb#L121 ↩
-
https://github.com/Homebrew/homebrew/commit/28b03c2f9ee5dcf861a6ff7de750b147fe3138e4 ↩
-
$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
で確認できます。 ↩