Сообщение об ошибке
[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+ выполняет строгие проверки X.509 в OpenSSL, а 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