Как проверить / проверить цепочку доверия сертификатов X509 в Python?

Я работаю над внедрением веб-приложения, использующего API. Во время ответа сервер API отправляет по ссылке на сертификат X509 (в формате PEM, состоящий из сертификата подписи и одного или нескольких промежуточных сертификатов в корневой сертификат ЦС), которые я должен загрузить и использовать для дальнейшей проверки.

Прежде чем использовать сертификат, мне нужно убедиться, что все сертификаты в цепочке объединяются, чтобы создать цепочку доверия к доверенному корневому сертификату ЦС (для обнаружения и предотвращения любых вредоносных запросов). Мне сложно делать это на питоне, и мое исследование предмета не приносит ничего полезного.

Сертификат легко захватывается и загружается с использованием запросов и M2Crypto

import requests from M2Crypto import RSA, X509 mypem = requests.get('https://server.com/my_certificate.pem') cert = X509.load_cert_string(str(mypem.text), X509.FORMAT_PEM) 

Однако проверка цепи сертификатов является проблемой. Невозможно записать сертификат на диск, чтобы использовать утилиту командной строки, например openssl через что-то вроде подпроцесса, поэтому это должно выполняться через python. У меня также нет открытых подключений, поэтому использование решения для проверки соединения основано (например, упоминается в этом ответе / потоке: https://stackoverflow.com/a/1088224/4984533 ) тоже не будет работать.

В другом потоке об этой проблеме (на https://stackoverflow.com/a/4427081 ) abbot объясняет, что m2crypto не может выполнить эту проверку и говорит, что он написал расширение, чтобы разрешить проверку (используя модуль m2ext ), но его патч никогда не кажется работой, всегда возвращающей ложь, хотя я знаю, что это действительно:

 from m2ext import SSL ctx = SSL.Context() ctx.load_verify_locations(capath='/etc/ssl/certs/') # I have run c_rehash in this directory to generate a list of cert files with signature based names if not ctx.validate_certificate(cert): # always happens print('Invalid certificate!') 

Там также есть ответ на подобную тему: https://stackoverflow.com/a/9007764/4984533, в которой Джон Мэтьюз утверждает, что написал патч, который сделает это, но, к сожалению, ссылка на патч теперь мертва – и все равно там это комментарий к этой теме, в котором говорится, что патч не работал с openssl 0.9.8e.

Все ответы, относящиеся к проверке цепочки доверия сертификатов на m2ext похоже, либо связаны с мертвым патчем, либо возвращаются к m2ext .

Есть простой и простой способ проверить правильность моей доверенной цепи сертификатов на Python?

One Solution collect form web for “Как проверить / проверить цепочку доверия сертификатов X509 в Python?”

Я просмотрел библиотеку pyopenssl и нашел это для проверки цепочки сертификатов. Следующий пример – из их тестов и, похоже, делает то, что вы хотите, который проверяет цепочку доверия на доверенный корневой сертификат. Вот соответствующие документы для X509Store и X509StoreContext

 from OpenSSL.crypto import load_certificate, load_privatekey from OpenSSL.crypto import X509Store, X509StoreContext from six import u, b, binary_type, PY3 root_cert_pem = b("""-----BEGIN CERTIFICATE----- MIIC7TCCAlagAwIBAgIIPQzE4MbeufQwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UE BhMCVVMxCzAJBgNVBAgTAklMMRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdU ZXN0aW5nMRgwFgYDVQQDEw9UZXN0aW5nIFJvb3QgQ0EwIhgPMjAwOTAzMjUxMjM2 NThaGA8yMDE3MDYxMTEyMzY1OFowWDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAklM MRAwDgYDVQQHEwdDaGljYWdvMRAwDgYDVQQKEwdUZXN0aW5nMRgwFgYDVQQDEw9U ZXN0aW5nIFJvb3QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPmaQumL urpE527uSEHdL1pqcDRmWzu+98Y6YHzT/J7KWEamyMCNZ6fRW1JCR782UQ8a07fy 2xXsKy4WdKaxyG8CcatwmXvpvRQ44dSANMihHELpANTdyVp6DCysED6wkQFurHlF 1dshEaJw8b/ypDhmbVIo6Ci1xvCJqivbLFnbAgMBAAGjgbswgbgwHQYDVR0OBBYE FINVdy1eIfFJDAkk51QJEo3IfgSuMIGIBgNVHSMEgYAwfoAUg1V3LV4h8UkMCSTn VAkSjch+BK6hXKRaMFgxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJJTDEQMA4GA1UE BxMHQ2hpY2FnbzEQMA4GA1UEChMHVGVzdGluZzEYMBYGA1UEAxMPVGVzdGluZyBS b290IENBggg9DMTgxt659DAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GB AGGCDazMJGoWNBpc03u6+smc95dEead2KlZXBATOdFT1VesY3+nUOqZhEhTGlDMi hkgaZnzoIq/Uamidegk4hirsCT/R+6vsKAAxNTcBjUeZjlykCJWy5ojShGftXIKY w/njVbKMXrvc83qmTdGl3TAM0fxQIpqgcglFLveEBgzn -----END CERTIFICATE----- """) intermediate_cert_pem = b("""-----BEGIN CERTIFICATE----- MIICVzCCAcCgAwIBAgIRAMPzhm6//0Y/g2pmnHR2C4cwDQYJKoZIhvcNAQENBQAw WDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAklMMRAwDgYDVQQHEwdDaGljYWdvMRAw DgYDVQQKEwdUZXN0aW5nMRgwFgYDVQQDEw9UZXN0aW5nIFJvb3QgQ0EwHhcNMTQw ODI4MDIwNDA4WhcNMjQwODI1MDIwNDA4WjBmMRUwEwYDVQQDEwxpbnRlcm1lZGlh dGUxDDAKBgNVBAoTA29yZzERMA8GA1UECxMIb3JnLXVuaXQxCzAJBgNVBAYTAlVT MQswCQYDVQQIEwJDQTESMBAGA1UEBxMJU2FuIERpZWdvMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQDYcEQw5lfbEQRjr5Yy4yxAHGV0b9Al+Lmu7wLHMkZ/ZMmK FGIbljbviiD1Nz97Oh2cpB91YwOXOTN2vXHq26S+A5xe8z/QJbBsyghMur88CjdT 21H2qwMa+r5dCQwEhuGIiZ3KbzB/n4DTMYI5zy4IYPv0pjxShZn4aZTCCK2IUwID AQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDQUAA4GBAPIWSkLX QRMApOjjyC+tMxumT5e2pMqChHmxobQK4NMdrf2VCx+cRT6EmY8sK3/Xl/X8UBQ+ 9n5zXb1ZwhW/sTWgUvmOceJ4/XVs9FkdWOOn1J0XBch9ZIiFe/s5ASIgG7fUdcUF 9mAWS6FK2ca3xIh5kIupCXOFa0dPvlw/YUFT -----END CERTIFICATE----- """) intermediate_server_cert_pem = b("""-----BEGIN CERTIFICATE----- MIICWDCCAcGgAwIBAgIRAPQFY9jfskSihdiNSNdt6GswDQYJKoZIhvcNAQENBQAw ZjEVMBMGA1UEAxMMaW50ZXJtZWRpYXRlMQwwCgYDVQQKEwNvcmcxETAPBgNVBAsT CG9yZy11bml0MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVNh biBEaWVnbzAeFw0xNDA4MjgwMjEwNDhaFw0yNDA4MjUwMjEwNDhaMG4xHTAbBgNV BAMTFGludGVybWVkaWF0ZS1zZXJ2aWNlMQwwCgYDVQQKEwNvcmcxETAPBgNVBAsT CG9yZy11bml0MQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEjAQBgNVBAcTCVNh biBEaWVnbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqpJZygd+w1faLOr1 iOAmbBhx5SZWcTCZ/ZjHQTJM7GuPT624QkqsixFghRKdDROwpwnAP7gMRukLqiy4 +kRuGT5OfyGggL95i2xqA+zehjj08lSTlvGHpePJgCyTavIy5+Ljsj4DKnKyuhxm biXTRrH83NDgixVkObTEmh/OVK0CAwEAATANBgkqhkiG9w0BAQ0FAAOBgQBa0Npw UkzjaYEo1OUE1sTI6Mm4riTIHMak4/nswKh9hYup//WVOlr/RBSBtZ7Q/BwbjobN 3bfAtV7eSAqBsfxYXyof7G1ALANQERkq3+oyLP1iVt08W1WOUlIMPhdCF/QuCwy6 x9MJLhUCGLJPM+O2rAPWVD9wCmvq10ALsiH3yA== -----END CERTIFICATE----- """) root_cert = load_certificate(FILETYPE_PEM, root_cert_pem) intermediate_cert = load_certificate(FILETYPE_PEM, intermediate_cert_pem) intermediate_server_cert = load_certificate(FILETYPE_PEM, intermediate_server_cert_pem) store = X509Store() store.add_cert(root_cert) store.add_cert(intermediate_cert) store_ctx = X509StoreContext(store, intermediate_server_cert) print(store_ctx.verify_certificate()) 
  • SSL и TLS в запросах Python
  • Как безопасно использовать pip (с SSL) в Ubuntu Trusty?
  • SSphase-парольная фраза / пароль в Python
  • SSLError: сбой сброса оповещений sslv3
  • Python + LDAP + SSL
  • Отключить проверку сертификата SSL в Python
  • Ошибка python setup.py в osx с ошибкой ssl
  • Ошибка Python SSLError, sslv3, для wallhaven.cc
  •  
    Interesting Posts for Van-Lav

    Как удалить предупреждения Python 3 для операторов печати в Pycharm при использовании интерпретатора Python 2?

    Добавление настраиваемого фильтра Jinja2 в GAE 1.6.0

    Как определить, находится ли многоугольник внутри другого?

    Отсоединить подпроцесс, запущенный с использованием модуля многопроцессорности python

    Как правильно изменить имя пути к файлу в Python?

    Чистые Mocking удаленные серверы и API для Django Unittests

    Как создать таблицу тройного соединения с Django

    Получите значение из набора решений, возвращаемого в качестве finiteset от Sympy

    Чтение первых N строк файла в python

    Как работает объект classmethod?

    Приостановка процесса в Windows

    Как запросить для всех групп типа 'foo', которые содержат user_x? (таблица «многие-ко-многим»)

    Передача указателя структуры на функцию в ctypes

    Как отключить оболочку Python меньше, чем "help"

    как вставить какой-либо текст во весь контекст django с использованием промежуточного программного обеспечения django

    Python - лучший язык программирования в мире.