#python #python-3.x #ssl #openssl #tls1.2
#python #python-3.x #ssl #openssl #tls1.2
Вопрос:
В модуле 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-бит). Как я могу получить эту информацию?
Ответ №1:
Запустите 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()