Как я могу декодировать SSL-сертификат с помощью python?

Как я могу декодировать сертификат pem-encoded (base64) с Python? Например, здесь из github.com:

-----BEGIN CERTIFICATE----- MIIHKjCCBhKgAwIBAgIQDnd2il0H8OV5WcoqnVCCtTANBgkqhkiG9w0BAQUFADBp MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSgwJgYDVQQDEx9EaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBDQS0xMB4XDTExMDUyNzAwMDAwMFoXDTEzMDcyOTEyMDAwMFowgcoxHTAb BgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYBBAGCNzwCAQMTAlVT MRswGQYLKwYBBAGCNzwCAQITCkNhbGlmb3JuaWExETAPBgNVBAUTCEMzMjY4MTAy MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2Fu IEZyYW5jaXNjbzEVMBMGA1UEChMMR2l0SHViLCBJbmMuMRMwEQYDVQQDEwpnaXRo dWIuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7dOJw11wcgnz M08acnTZtlqVULtoYZ/3+x8Z4doEMa8VfBp/+XOvHeVDK1YJAEVpSujEW9/Cd1JR GVvRK9k5ZTagMhkcQXP7MrI9n5jsglsLN2Q5LLcQg3LN8OokS/rZlC7DhRU5qTr2 iNr0J4mmlU+EojdOfCV4OsmDbQIXlXh9R6hVg+4TyBkaszzxX/47AuGF+xFmqwld n0xD8MckXilyKM7UdWhPJHIprjko/N+NT02Dc3QMbxGbp91i3v/i6xfm/wy/wC0x O9ZZovLdh0pIe20zERRNNJ8yOPbIGZ3xtj3FRu9RC4rGM+1IYcQdFxu9fLZn6TnP pVKACvTqzQIDAQABo4IDajCCA2YwHwYDVR0jBBgwFoAUTFjLJfBBT1L0KMiBQ5um qKDmkuUwHQYDVR0OBBYEFIfRjxlu5IdvU4x3kQdQ36O/VUcgMCUGA1UdEQQeMByC CmdpdGh1Yi5jb22CDnd3dy5naXRodWIuY29tMIGBBggrBgEFBQcBAQR1MHMwJAYI KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBLBggrBgEFBQcwAoY/ aHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ0FDZXJ0cy9EaWdpQ2VydEhpZ2hBc3N1 cmFuY2VFVkNBLTEuY3J0MAwGA1UdEwEB/wQCMAAwYQYDVR0fBFowWDAqoCigJoYk aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL2V2MjAwOWEuY3JsMCqgKKAmhiRodHRw Oi8vY3JsNC5kaWdpY2VydC5jb20vZXYyMDA5YS5jcmwwggHEBgNVHSAEggG7MIIB tzCCAbMGCWCGSAGG/WwCATCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGln aWNlcnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCC AVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABp AGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBw AHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQ AC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQBy AHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0 ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwBy AHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBl AG4AYwBlAC4wHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBEGCWCGSAGG +EIBAQQEAwIGwDAOBgNVHQ8BAf8EBAMCBaAwDQYJKoZIhvcNAQEFBQADggEBABRS cR+GnW01Poa7ZhqLhZi5AEzLQrVG/AbnRDnI6FLYERQjs3KW6RSUni8AKPfVBEVA AMb0V0JC3gmJlxENFFxrvQv3GKNfZwLzCThjv8ESnTC6jqVUdFlTZ6EbUFsm2v0T flkXv0nvlH5FpP06STLwav+JjalhqaqblkbIHOAYHOb7gvQKq1KmyuhUItnbKj1a InuA6gcF1PnH8FNZX7t3ft6TcEFOI8t4eXnELurXZioY99HFfOISeIKNHeyCngGi 5QK+eKG5WVjFTG9PpTG0SVtemB4uOPYZxDmiSvt5BbjyWeUmEnCtwOh1Ix8Y0Qvg n2Xkw9dJh1tybLEvrG8= -----END CERTIFICATE---- 

Согласно ssl-shopper, это должно быть примерно так:

 Common Name: github.com Subject Alternative Names: github.com, www.github.com Organization: GitHub, Inc. Locality: San Francisco State: California Country: US Valid From: May 26, 2011 Valid To: July 29, 2013 

Как я могу получить этот открытый текст с помощью python?

  • Проверка сертификатов клиентов в PyOpenSSL
  • Как найти путь к файлу сертификата SSL?
  • Проблема с версией Python и OpenSSL в OS X
  • Исправление ошибки сертификата SSL в exe, скомпилированном с py2exe (или PyInstaller)
  • сертификаты для клиентской стороны в tls
  • Ошибка SSL: процедуры: SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не выполнена
  • Соединение HTTPS Python
  • Ошибка номера версии Hotmail SSL3 с использованием smtp
  • 2 Solutions collect form web for “Как я могу декодировать SSL-сертификат с помощью python?”

    Стандартная библиотека Python, даже в последней версии, не содержит ничего, что может декодировать сертификаты X.509. Однако дополнительный cryptography пакет поддерживает это. Цитирование примера из документации :

     >>> from cryptography import x509 >>> from cryptography.hazmat.backends import default_backend >>> cert = x509.load_pem_x509_certificate(pem_data, default_backend()) >>> cert.serial_number 2 

    Другим дополнительным пакетом, который может быть вариантом, является pyopenssl . Это тонкая оболочка API OpenSSL C, что означает, что можно будет делать то, что вы хотите, но ожидайте провести пару дней, разрывая волосы в документации.

    Если вы не можете установить дополнительные пакеты Python, но у вас есть утилита командной строки openssl ,

     import subprocess cert_txt = subprocess.check_output(["openssl", "x509", "-text", "-noout", "-in", certificate]) 

    должен получить примерно тот же материал, который вы получили от своей веб-утилиты в cert_txt .

    Кстати, причина, заключающаяся в прямом расширении base64, дает вам двоичный gobbledygook, так как здесь есть два уровня кодирования. Сертификаты X.509 являются структурами данных ASN.1 , сериализованными в формат DIR X.690 , а затем, поскольку DER является двоичным форматом, base64-armored для удобства передачи файлов. (Многие стандарты в этой области были написаны еще в девяностые годы, когда вы не могли надежно отправить что-либо, кроме семибитного ASCII.)

    Вы можете использовать pyasn1 и pyasn1_modules для анализа таких данных. Например:

     from pyasn1_modules import pem, rfc2459 from pyasn1.codec.der import decoder substrate = pem.readPemFromFile(open('cert.pem')) cert = decoder.decode(substrate, asn1Spec=rfc2459.Certificate())[0] print(cert.prettyPrint()) 

    Прочитайте документы для pyasn1 для остальных.

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