cURLで「SSL peer certificate or ERL is not OK」というエラーに直面し、お困りではありませんか?ご安心ください、このエラーはSSL/TLS証明書の検証に関する一般的な問題であり、適切な手順を踏めば解決できます。
この記事では、Windowsユーザー向けに、このエラーの概要から、今すぐ試せる最速の解決策、そして恒久的な対策まで、分かりやすく解説します。結論から申し上げると、一時的なデバッグ目的であれば、-k または --insecure オプションを使うことで、すぐに通信を試すことができます。 ただし、これはセキュリティリスクを伴うため、根本原因の特定と解決が重要です。
目次
1. cURL: SSL peer certificate or ERL is not OK とは?(概要と緊急度)
このエラーメッセージは、cURLが接続しようとしているサーバーのSSL/TLS証明書を検証できなかったことを示しています。具体的には、以下のいずれかの問題が発生している可能性が高いです。
- SSL peer certificate: サーバーが提示した証明書自体に問題がある(例:期限切れ、発行元が不明、ドメイン名不一致、中間証明書が不足しているなど)。
- ERL (Certificate Revocation List): 証明書失効リスト(CRL)またはOCSP(Online Certificate Status Protocol)による証明書の失効状態の確認に失敗した。つまり、証明書が失効しているか、失効情報を取得できない。
このエラーが発生すると、cURLは安全な通信ができないと判断し、データの送受信を停止します。したがって、緊急度は高く、対象のサービスやシステムとの通信が完全にブロックされている状態と言えます。Web API連携やデータ取得など、SSL/TLS通信を必要とするあらゆる処理が停止するため、早急な対応が必要です。
2. 【最速】今すぐ試すべき解決策
このセクションでは、まず一時的にエラーを回避し、緊急で通信を試したい場合に有効な解決策をご紹介します。これはあくまでデバッグや一時的な回避策であり、本番環境での常用は推奨しません。セキュリティリスクを理解した上でご使用ください。
解決策1:SSL/TLS証明書の検証を一時的に無効にする
cURLには、SSL/TLS証明書の検証をスキップするオプションが用意されています。これにより、証明書の問題が原因で発生しているエラーを一時的に無視して通信を試すことができます。
注意: この方法は、セキュリティ上のリスクを伴います。中間者攻撃(Man-in-the-Middle attack)に対して脆弱になるため、信頼できないサイトや本番環境では絶対に避けてください。あくまでデバッグ目的や、信頼できる内部システムでの一時的な利用に限定してください。
実行コマンド(PowerShell または Cmd)
# cURLコマンドに -k または --insecure オプションを追加します
curl -k https://your-untrusted-server.com/api/data
# または
curl --insecure https://your-untrusted-server.com/api/data
https://your-untrusted-server.com/api/data の部分は、あなたがアクセスしようとしている実際のURLに置き換えてください。
このコマンドを実行すると、cURLはサーバーの証明書が有効かどうかをチェックせずに通信を試みます。もしこれで通信が成功した場合は、間違いなくSSL/TLS証明書に関する問題が原因であることが確定します。
3. cURL: SSL peer certificate or ERL is not OK が発生する主要な原因(複数)
一時的な回避策でエラーが解消された場合でも、根本原因を特定し、恒久的な対策を講じることが重要です。このエラーが発生する主な原因は以下の通りです。
3.1. 中間証明書の不足またはチェーンの不備
- サーバーがWebブラウザには提供されるが、cURLのようなコマンドラインツールには提供されない中間証明書を省略している場合があります。クライアント側がルート証明書だけでなく、すべての中間証明書を検証できないとエラーになります。
- これは特に、新しい証明機関(CA)や特定のSSLプロバイダで発生しやすい問題です。
3.2. 証明書が無効または信頼されていない
- 証明書の期限切れ: サーバー証明書の有効期限が切れている。
- 自己署名証明書: サーバーが自己署名証明書を使用しており、cURLがその証明書を信頼できないと判断している。
- 信頼されていないCA: サーバー証明書を発行した認証局(CA)が、クライアント(WindowsシステムまたはcURLが使用するCAバンドル)によって信頼されていない。
- ドメイン名の不一致: 証明書に記載されているコモンネーム(CN)またはサブジェクト代替名(SAN)が、アクセスしているURLのホスト名と一致しない。
3.3. 証明書失効情報(CRL/OCSP)の問題
- ERL (Certificate Revocation List) の問題: 証明書失効リスト(CRL)またはオンライン証明書状態プロトコル(OCSP)のURLにアクセスできない、または応答がない場合。
- ネットワーク障害やファイアウォールの設定により、失効情報を取得できないことがあります。
3.4. クライアント側の問題(Windowsシステム)
- ルート証明書ストアの不備: Windowsシステムに最新のルート証明書がインストールされていない、または破損している。
- cURLのCA証明書バンドルの問題: cURLが使用するCA証明書バンドル(通常は
curl-ca-bundle.crtのようなファイル)が古い、または不足している。
3.5. プロキシサーバーによるSSLインスペクション
- 企業ネットワークなどで使用されるプロキシサーバーが、セキュリティ目的でSSL/TLS通信を傍受し、独自の証明書に置き換えている(SSLインスペクション/ディープパケットインスペクション)。
- この場合、cURLはそのプロキシサーバーが発行した証明書を信頼できないと判断し、エラーを発生させます。
4. cURLで恒久的に再発を防ぐには
一時的な回避策ではなく、根本的にこのエラーを解決し、安全かつ安定した通信を確保するための対策を講じましょう。
4.1. 適切なCA証明書バンドルを使用する
cURLは、通信相手のSSL証明書を検証するために、信頼できる認証局(CA)の証明書リスト(CAバンドル)を使用します。このCAバンドルを最新に保つか、カスタムで指定することで問題を解決できます。
- CAバンドルの更新:Windows版のcURLは通常、システムにインストールされているルート証明書ストアを利用します。しかし、場合によってはcURL独自のCAバンドルファイル(例:
curl-ca-bundle.crt)が使われることもあります。以下の手順で、最新のCAバンドルを取得し、cURLに指定することができます。- MozillaのCA証明書リストから最新の
cacert.pemファイルをダウンロードします。
https://curl.se/docs/caextract.html の「A comment about the cacert.pem file」セクションからリンクを見つけられます。通常は https://curl.haxx.se/ca/cacert.pem です。 - ダウンロードした
cacert.pemファイルを、cURLの実行パスまたは任意の安全な場所に保存します(例:C:\curl\cacert.pem)。 - cURLコマンド実行時に
--cacertオプションでこのファイルを指定します。
実行コマンド(PowerShell または Cmd)
curl --cacert C:\path\to\cacert.pem https://your-server.com/api/data - MozillaのCA証明書リストから最新の
- 環境変数の設定:常に特定のCAバンドルを使用したい場合、
CURL_CA_BUNDLE環境変数を設定することもできます。これにより、毎回--cacertオプションを指定する手間が省けます。
実行コマンド(PowerShell)
# 環境変数(一時的 - 現在のセッションのみ) $env:CURL_CA_BUNDLE = "C:\path\to\cacert.pem" curl https://your-server.com/api/data # 環境変数(永続的 - システム全体またはユーザー) # システム全体に設定する場合は管理者権限が必要です # [System.Environment]::SetEnvironmentVariable('CURL_CA_BUNDLE', 'C:\path\to\cacert.pem', 'Machine') # ユーザープロファイルに設定 [System.Environment]::SetEnvironmentVariable('CURL_CA_BUNDLE', 'C:\path\to\cacert.pem', 'User') # 設定後、新しいPowerShellセッションを開くか、PCを再起動する必要がある場合があります。実行コマンド(Cmd)
:: 環境変数(一時的 - 現在のセッションのみ) set CURL_CA_BUNDLE=C:\path\to\cacert.pem curl https://your-server.com/api/data :: 環境変数(永続的 - システム全体またはユーザー) :: システム全体に設定する場合は管理者権限が必要です :: setx CURL_CA_BUNDLE "C:\path\to\cacert.pem" /M :: ユーザープロファイルに設定 setx CURL_CA_BUNDLE "C:\path\to\cacert.pem" :: 設定後、新しいコマンドプロンプトを開くか、PCを再起動する必要がある場合があります。
4.2. サーバー側の証明書設定を確認・修正する
もしあなたがサーバー管理者である場合、サーバーのSSL/TLS証明書の設定を見直してください。
- 中間証明書のバンドル: ルート証明書だけでなく、必要なすべての中間証明書がWebサーバーの設定ファイル(例: Apacheの
SSLCertificateChainFile、Nginxのssl_certificateに結合)に含まれているか確認します。多くのSSLチェッカーツール(例: SSL Labs SSL Server Test)で確認できます。 - 証明書の有効期限: 証明書が期限切れでないか確認し、必要であれば更新します。
- 正しい証明書: ホスト名に一致する正しい証明書が使用されているか確認します。
4.3. システムのルート証明書ストアを更新する
Windows Updateを通じて、システムのルート証明書ストアは定期的に更新されます。Windowsが最新の状態になっていることを確認してください。
- Windows Updateの実行: 「設定」>「更新とセキュリティ」>「Windows Update」から、最新の更新プログラムを適用します。
4.4. プロキシサーバー設定の調整
企業ネットワーク内でプロキシサーバーがSSLインスペクションを行っている場合、そのプロキシサーバーのルート証明書をWindowsの信頼されたルート証明機関ストアにインストールする必要があります。具体的な手順は、ネットワーク管理者にお問い合わせください。
また、cURL自体にプロキシ設定を明示的に指定する必要がある場合もあります。
実行コマンド(PowerShell または Cmd)
# HTTPプロキシを設定
curl -x http://proxy.example.com:8080 https://your-server.com/api/data
# HTTPSプロキシを設定
curl -x https://secure-proxy.example.com:8080 https://your-server.com/api/data
# 環境変数による設定(一時的)
$env:HTTP_PROXY = "http://proxy.example.com:8080"
$env:HTTPS_PROXY = "http://secure-proxy.example.com:8080"
curl https://your-server.com/api/data
4.5. 自己署名証明書への対応
開発環境などで自己署名証明書を使用している場合は、以下のいずれかの方法で対応します。
- 信頼された証明書としてインポート: 自己署名証明書をWindowsの「信頼されたルート証明機関」ストアにインポートすることで、システム全体でその証明書を信頼させる。
- 特定用途でのみ
--insecureを使用: 前述の-k/--insecureオプションを、その特定のエンドポイントにアクセスする場合にのみ使用する。ただし、本番環境では避けるべきです。
これらの対策を一つずつ確認し、原因を特定して適切な解決策を講じることで、「cURL: SSL peer certificate or ERL is not OK」エラーから解放され、安心してcURLを使用できるようになります。不明な点があれば、ネットワーク管理者やシステム管理者に相談することも有効な手段です。