Как получить длину ключа подписи сертификата с помощью модуля Python SSL - PullRequest
0 голосов
/ 07 марта 2019

В модуле Python ssl я могу создать соединение TLS, используя этот фрагмент кода:

import socket, ssl

context = ssl.SSLContext()
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))

Я также могу получить сертификат perr, используя функцию getpeercert, которая возвращает объект с информацией сертификата какэто:

{'issuer': ((('countryName', 'IL'),),
            (('organizationName', 'StartCom Ltd.'),),
            (('organizationalUnitName',
              'Secure Digital Certificate Signing'),),
            (('commonName',
              'StartCom Class 2 Primary Intermediate Server CA'),)),
 'notAfter': 'Nov 22 08:15:19 2013 GMT',
 'notBefore': 'Nov 21 03:09:52 2011 GMT',
 'serialNumber': '95F0',
 'subject': ((('description', '571208-SLe257oHY9fVQ07Z'),),
             (('countryName', 'US'),),
             (('stateOrProvinceName', 'California'),),
             (('localityName', 'San Francisco'),),
             (('organizationName', 'Electronic Frontier Foundation, Inc.'),),
             (('commonName', '*.eff.org'),),
             (('emailAddress', 'hostmaster@eff.org'),)),
 'subjectAltName': (('DNS', '*.eff.org'), ('DNS', 'eff.org')),
 'version': 3}

Мне нужно извлечь тип и длину открытого ключа сертификата (например, RSA 2048-bit).Как я могу получить эту информацию?

1 Ответ

1 голос
/ 04 мая 2019

Запустите getpeercert(True), чтобы получить двоичный формат DER полного сертификата, затем с помощью криптографической библиотеки OpenSSL вы можете получить тип и длину ключа следующим образом (предположим, der - двоичный DER):

import OpenSSL

certificate = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_ASN1, der)
public_key = certificate.get_pubkey()
key_type = 'RSA' if public_key().type() == OpenSSL.crypto.TYPE_RSA else 'DSA'
key_length = public_key.bits()
...