動かざることバグの如し

近づきたいよ 君の理想に

MacOS RubyでOpenSSL::SSL::SSLErrorになる

環境

問題

以下のコードが正常に実行できれば問題ない。

require 'net/http'
require 'uri'

uri = URI('https://httpbin.io/post')

request = Net::HTTP::Post.new(uri)

Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  response = http.request(request)で
  puts response.body
end

自分のMacbookだと以下のようなエラーになってしまった

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 peeraddr=1.1.1.1:443 state=error: certificate verify failed (unable to get certificate CRL) (OpenSSL::SSL::SSLError)

原因

MacOS上でOpenSSL 3.6.0を使用している場合に発生する問題。OpenSSL 3.6.0での仕様変更が原因で、Rubyのopensslライブラリが正常に動かなくなってしまった。

具体的には

  • OpenSSL 3.6.0で証明書の失効確認に関するフラグの挙動が変更された
  • V_FLAG_CRL_CHECK_ALLがV_FLAG_CRL_CHECKを暗黙的に有効にするようになった
  • しかしmacOSのOpenSSLビルドがCRLバンドルを提供していないため、証明書の検証に失敗する

インストールされているopensslのバージョンは以下のコマンドで確認できる

❯ openssl version
OpenSSL 3.6.0 1 Oct 2025 (Library: OpenSSL 3.6.0 1 Oct 2025)

対応策

opensslライブラリをアップデートする方法(推奨

この問題はopensslライブラリのバージョンv3.1.2, v3.2.2, v3.3.1で修正されている。Gemfileに別途opensslを追加して bundle install すればアップデートされる

gem "openssl"

MacOSにインストールされているopensslのバージョンをダウングレードする方法

homebrewは原則最新バージョンしかインストールできないので自分専用のtapをローカルに新規作成してオレオレhomebrewでインストールする。

詳細のコマンドは以下が大変詳しい

qiita.com

参考リンク