エラーメッセージ
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Missing Authority Key Identifier
Python 3.13 以降(厳格モードがデフォルトで有効)と openssl verify -x509_strict で表示されます。Python は「(_ssl.c:1082)」のようなソースの位置を付け加えます。
Python 3.13+ ssl module — VERIFY_X509_STRICT in create_default_context(), X509_V_ERR_MISSING_AUTHORITY_KEY_IDENTIFIER
このエラーの意味
Python 3.13 以降は OpenSSL の厳格な X.509 チェックを実行します。RFC 5280 は、CA が発行する証明書に、発行者の鍵を示す authorityKeyIdentifier 拡張を含めることを必須としています。チェーン内のある証明書にこの拡張がないため、署名にもトラストアンカーにも問題がないにもかかわらず、検証が失敗します。
発生する理由
発行ツールが鍵識別子を追加しない
よくある手書きの OpenSSL 拡張ファイル、一部のスクリプト、古い社内 CA ソフトウェアは、authorityKeyIdentifier を含まない(多くの場合 subjectKeyIdentifier も含まない)証明書を発行します。
クライアントが Python 3.13 以降にアップグレードされた
よくあるPython 3.12 以前は厳格なチェックを適用していなかったため、これまではこうした証明書でも動作していました。
以前の PKI 構成で発行された有効期間の長い証明書
ときどき何年も前、プロファイルが修正される前に発行された機器やサービスの証明書は、期限切れになるまで使われ続けます。
修正方法
- 1.
欠けている拡張を確認する
リーフ証明書と中間証明書の鍵識別子の拡張を出力し、openssl verify -x509_strict を実行して、厳格モードで検出される問題をすべて一覧表示してください。
bash openssl x509 -in server.pem -noout -ext authorityKeyIdentifier,subjectKeyIdentifier openssl verify -x509_strict -CAfile ca.pem server.pem - 2.
鍵識別子を含めて証明書を再発行する
発行プロファイルに subjectKeyIdentifier = hash と authorityKeyIdentifier = keyid:always を追加してから、影響を受ける証明書を再発行してください。
bash # Issue leaves with both key identifiers printf 'subjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always\nsubjectAltName=DNS:api.example.com\n' > leaf.ext openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -days 90 -extfile leaf.ext -out server.pem - 3.
一時的な回避策:VERIFY_X509_STRICT をクリアする
チェーン、日付、ホスト名の検証は維持したまま、このコンテキストに限って RFC 5280 のプロファイルチェックを省略します。証明書を再発行したら削除してください。
python # Temporary workaround until certificates are reissued import ssl ctx = ssl.create_default_context(cafile="ca.pem") ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT