クイックアンサー
プロキシでのSSL: CERTIFICATE_VERIFY_FAILEDとは何を意味していますか?
CERTIFICATE_VERIFY_FAILED はクライアントがウェブサイトのTLS証明書を検証できなかったことを意味します。CrawlRelayゲートウェイのようなCONNECTプロキシではTLSは終端まで暗号化されているため、プロキシが原因ではありません。クライアント側の古いCAバンドル、HTTPSを検査するアンチウイルスや企業ファイアウォール、または時計の誤りを確認してください。本番環境でverify=Falseでの対応は絶対に避けてください。
SSL: CERTIFICATE_VERIFY_FAILEDを一目で理解する
| エラー | SSL: CERTIFICATE_VERIFY_FAILED |
|---|---|
| タイプ | クライアントのTLS証明書エラー |
| 送信元 | TLSライブラリが、ウェブサイトの証明書を検証できない場合 |
| 定義されている場所 | X.509 path validation: RFC 5280; TLS 1.3: RFC 8446 |
| 再試行しますか? | いいえ。信頼ストアかネットワークを修正してください |
| まず確認すること | 同じマシンでプロキシなしの同じURLをテストする |
SSL: CERTIFICATE_VERIFY_FAILEDとは何ですか?
TLSハンドシェイク中にウェブサイトは証明書チェーンを送信します。クライアントは信頼された認証機関リスト(信頼ストア)と照合し、名前や有効期限をチェックします。いずれかが失敗すると処理を停止します。
CONNECTトンネルではプロキシはハンドシェイクをそのまま通すため、見えている証明書はウェブサイト自身のものです。検査ソフトのように独自証明書を挿入するものや、マシンの古い信頼ストアが一般的な原因です。
CERTIFICATE_VERIFY_FAILEDはPython、curl、Node.js、ブラウザではどのように表示されますか?
同じ失敗でもツールごとに異なる表示になります。ログ検索用のメッセージは以下の通りです:
- Python:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate - Node.js:
UNABLE_TO_GET_ISSUER_CERT_LOCALLYまたはSELF_SIGNED_CERT_IN_CHAIN - curl:
curl: (60) SSL certificate problem: unable to get local issuer certificate - ブラウザ:
NET::ERR_CERT_AUTHORITY_INVALID
CERTIFICATE_VERIFY_FAILEDの原因は何ですか?
最も可能性が高いのは次の通りです:
- 古いCAバンドル、例えばPythonの古い
certifiパッケージ。 - アンチウイルス、企業ファイアウォール、またはデバッグ用プロキシによるHTTPS検査。独自の証明書を提示します。
- システム時計の誤りにより有効な証明書が期限切れまたは未有効となる場合。
- 中間証明書が欠落した壊れた証明書チェーンのウェブサイト。
- システムのCA証明書パッケージが含まれていないコンテナイメージ。
CERTIFICATE_VERIFY_FAILEDを段階的に診断するには?
- プロキシなしで同じリクエストを実行し、失敗するか確認してください。失敗すればプロキシは関係ありません。
openssl s_clientかcurl-vで証明書発行者を表示します。アンチウイルスやファイアウォールの名前があれば検査されています。- システムの日付と時刻をチェックします。
- CAバンドルを更新して再テストしてください。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLCERTIFICATE_VERIFY_FAILEDをどう修正しますか?
certifi(pip install -U certifi) やシステムのCAパッケージを更新する。- ネットワークで検査が必要な場合は会社の検査証明書を信頼ストアに追加するか、そのネットワーク外でスクレイピングを行う。
- ネットワーク時刻同期で時計を正しく設定する。
- slimなコンテナイメージにCA証明書をインストールする。例えば
ca-certificatesパッケージ。 - 認証情報を送信したり結果を信頼するコードで検証無効化は絶対にしない。
CERTIFICATE_VERIFY_FAILEDの後に再試行すべきですか?
再試行は避けてください:同じ信頼ストアは同じく失敗します。信頼ストア、時計、またはネットワーク経路を修正した後に再実行してください。
SSL: CERTIFICATE_VERIFY_FAILEDはCrawlRelayにどう関係しますか?
CrawlRelayのHTTPポートはCONNECTでHTTPSをトンネルするため、クライアントが確認する証明書はウェブサイトが送るものです。エラーがゲートウェイ経由のみで発生し、直接アクセスで発生しない場合は、対象ホスト名と完全なエラーを添えてサポートにお問い合わせください。出口側を確認します。
ゲートウェイ:gw.crawlrelay.com、ポート7777(HTTP、HTTPSはCONNECT経由)、ポート7778(SOCKS5)。ユーザー名形式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。関連情報:SSL: WRONG_VERSION_NUMBER · Connection reset · Python guide。
SSL: CERTIFICATE_VERIFY_FAILED:開発者がよく尋ねる質問
プロキシはSSL証明書エラーを起こしますか?
インターセプティングプロキシは独自の証明書を提示するためエラーを引き起こす可能性があります。CONNECTトンネルプロキシは暗号化されたバイトを単に転送するだけでハンドシェイクの内容は見ないので起こしません。プロキシなしで同じリクエストを実行し、エラーが残る場合はマシンかネットワークの問題です。
verify=Falseはスクレイピングで安全ですか?
修正としては不適切です。検査や壊れたチェーンを隠すため、経路上の攻撃者にトークンやクッキーなど通信内容を読み取られたり改ざんされたりする恐れがあります。素早いローカルテスト以外では、認証情報を送るジョブや無人運用では絶対に使わないでください。
なぜDockerで失敗し、ラップトップで動くのですか?
slimなコンテナイメージはCA証明書なしで配布されることが多いため、証明書検証ができません。コンテナイメージにシステムのCAパッケージをインストールするか、Pythonのcertifiバンドルを利用してください。コンテナ内部の時計が正しいかもご確認ください。
他のプロキシエラーのリファレンス
HTTPステータスコード
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
ブラウザとクライアントのエラー
接続とTLSエラー
失敗ケースを網羅したドキュメント付きレジデンシャルプロキシ
$0.50/GB発のCrawlRelayレジデンシャルプロキシ、期限切れがないトラフィック。