はじめに
Ruby 3.4.1 と OpenSSL 3.6.0 の組み合わせで、AWS SDK を使用した際に下記のようなエラーが発生しました。
Seahorse::Client::NetworkingError: SSL_connect returned=1 errno=0 peeraddr=3.5.154.3:443
state=error: certificate verify failed (unable to get certificate CRL)
調べた結果、OpenSSLの2025年10月のバージョン変更(3.5.x → 3.6.0)が原因のようでしたが、AIにエラーを投げるだけでは有効な解決策がすぐには見つからなかったため、こちらの記事で解決策についてまとめていきます。
目次
1. 発生した問題
エラーの概要
Railsアプリケーションの起動時、AWSサービス(S3など)への接続で以下のエラーが発生しました。
Seahorse::Client::NetworkingError: SSL_connect returned=1 errno=0 peeraddr=3.5.154.3:443
state=error: certificate verify failed (unable to get certificate CRL)
エラーのポイント
-
certificate verify failed- 証明書の検証に失敗 -
unable to get certificate CRL- CRL(証明書失効リスト)を取得できない
2. 環境情報
| 項目 | バージョン |
|---|---|
| Ruby | 3.4.1 |
| OpenSSL | 3.6.0 |
| OS | macOS (Apple Silicon) |
| Rubyインストール | mise(rbenvでも同様) |
| OpenSSLインストール | Homebrew (openssl@3) |
OpenSSLのバージョン確認方法
ruby -ropenssl -e "puts OpenSSL::OPENSSL_VERSION"
# => OpenSSL 3.6.0 1 Oct 2025
3. SSL証明書の基礎知識
SSL証明書とは
SSL証明書は、インターネット通信における「身分証明書」です。
あなたのアプリ 📱 ←──────→ 🏢 AWSサーバー
HTTPS通信
1. アプリ「本当にAWSさん?証明書を見せて」
2. AWS「はい、これが私の証明書です 📜」
3. アプリ「信頼できる機関が発行してるね、OK!」
CA証明書バンドルとは
「信頼できる認証局(CA)のリスト」です。macOSでは Homebrew の ca-certificates パッケージで提供されます。
/opt/homebrew/etc/openssl@3/cert.pem
↓ シンボリックリンク
/opt/homebrew/etc/ca-certificates/cert.pem
└─ Mozillaが管理する信頼できるCAのリスト
4. CRL(Certificate Revocation List)とは
CRLの役割
CRL(Certificate Revocation List)は「失効した証明書のリスト」です。
証明書が有効期限内でも、以下の理由で取り消されることがあります:
| 理由 | 説明 |
|---|---|
| 秘密鍵の漏洩 | ハッキングで鍵が盗まれた |
| 組織の変更 | 会社の倒産、買収など |
| 不正発行 | 誤って発行された証明書 |
CRLの仕組み
証明書には「CRL配布ポイント」が記載されている
↓
例: http://crl.r2m01.amazontrust.com/r2m01.crl
↓
必要なときにインターネットからダウンロードして確認
CA証明書とCRLの違い
| 項目 | CA証明書 | CRL |
|---|---|---|
| 内容 | 信頼できる認証局のリスト | 失効した証明書のリスト |
| 保存場所 | ローカルファイル | インターネット上(URLでアクセス) |
| 更新頻度 | OS/パッケージ更新時 | 通常24時間ごと |
5. なぜエラーが発生したのか
原因:OpenSSL 3.6.0 の仕様変更
OpenSSL 3.6.0 で X509_V_FLAG_CRL_CHECK_ALL フラグの挙動が変更されました。
【OpenSSL 3.5.x 以前】
V_FLAG_CRL_CHECK_ALL だけでは CRLチェックは動かない
(V_FLAG_CRL_CHECK と組み合わせる必要があった)
【OpenSSL 3.6.0】
V_FLAG_CRL_CHECK_ALL だけで CRLチェックが動くようになった
Ruby openssl gem のデフォルト設定
Ruby の openssl gem は、デフォルトで V_FLAG_CRL_CHECK_ALL を有効にしていました。
# OpenSSL 3.5 以前 → 問題なし(フラグがあっても動かない)
# OpenSSL 3.6.0 → CRLチェックが走る → CRLをダウンロードできない → エラー!
エラーの流れ
Rails起動
↓
Aws.config.update(**args)
↓
AWSへのSSL接続を準備
↓
証明書検証(OpenSSL 3.6.0)
├─ CA証明書チェック: OK ✅
└─ CRLチェック: CRLをダウンロードできない 💥
↓
エラー: "unable to get certificate CRL"
6. 解決策
推奨:openssl gem のアップデート
openssl gem 3.1.2 以降 では、V_FLAG_CRL_CHECK_ALL がデフォルトから削除されました。
参考: ruby/openssl v3.1.2 Release Notes
gem openssl 3.3.1 以降であれば、ruby 3.2.x 〜 3.4.x に対応しています。
Ruby on Mac - Certificate verify failed
【インストール例】
# Gemfile
gem 'openssl', '>= 3.3.1'
bundle install
7. まとめ
問題の要点
- OpenSSL 3.6.0 で CRLチェックの挙動が変更された
- Ruby の openssl gem がデフォルトで CRLチェックを有効にしていた
- macOS にはCRLがローカルに存在しないため、エラーが発生
解決策
gem 'openssl', '>= 3.3.1' を Gemfile に追加するのが最も推奨される解決策です。
学んだこと
- SSL証明書検証には「CA証明書」と「CRL」の2つの仕組みがある
- バージョンアップで予期しない挙動変更が起きることがある
8. 参考リンク
- Rails Issue #55886 - SSL certificate verification fails on macOS (OpenSSL 3.6 + Ruby 3.4)
- ruby/openssl Issue #949 - certificate verify failed (unable to get certificate CRL)
- OpenSSL Issue #28752 - OpenSSL 3.6.0 changed the behavior of X509_V_FLAG_CRL_CHECK_ALL
- ruby/openssl v3.1.2 Release
- Ruby on Mac - Certificate verify failed