#python #network-programming #rsa #pyopenssl
#python #сетевое программирование #rsa #pyopenssl
Вопрос:
Это для домашнего задания! Я получаю сертификат сервера, используя get_peer_certificate()
и вызывая dump_certificate
дамп сертификата в переменной. Формат PEM и выглядит правильным для меня.
-----BEGIN CERTIFICATE-----
GIBBERISH................
......................
........................
-----END CERTIFICATE-----
Как мне извлечь открытый ключ сервера из этого файла (‘server.pubkey’) и зашифровать, plaintext
используя RSA
алгоритм и любую библиотеку python. На момент написания этой статьи я использую pyOpenSSL
Ответ №1:
Я бы рекомендовал использовать более широкую криптографическую библиотеку, такую как M2Crypto, которая имеет функции сертификата X509, а также шифрование RSA:
from M2Crypto import RSA, X509
data = ssl_sock.getpeercert(1)
# load the certificate into M2Crypto to manipulate it
cert = X509.load_cert_string(data, X509.FORMAT_DER)
pub_key = cert.get_pubkey()
rsa_key = pub_key.get_rsa()
cipher = rsa_key.public_encrypt('plaintext', RSA.pkcs1_padding)
Ответ №2:
from OpenSSL import crypto
crtObj = crypto.load_certificate(crypto.FILETYPE_ASN1, config.x509_certificate)
pubKeyObject = crtObj.get_pubkey()
pubKeyString = crypto.dump_publickey(crypto.FILETYPE_PEM, pubKeyObject)
Комментарии:
1. Какую библиотеку это использует?
2. @StudySmarterNotHarder, Это из OpenSSL. обновленный ответ.
Ответ №3:
from cryptography.x509 import load_pem_x509_certificate
cert_str = b"-----BEGIN CERTIFICATE-----MIIDETCCAfm..."
cert_obj = load_pem_x509_certificate(cert_str)
public_key = cert_obj.public_key()
private_key = cert_obj.private_key()
Ответ №4:
Обратите внимание, что библиотеку OpenSSL не рекомендуется использовать для этих целей. Вместо этого указывается библиотека криптографии. Поддерживается и регулярно обновляется.
Предполагая, что у вас есть сертификат в формате Pem, следующий блок кода предоставит вам открытый ключ в виде строки.
from cryptography import x509
from cryptography.hazmat.primitives import serialization
def read_pub_key_from_cert()
# Read certificate file.
with open("tls.crt") as certificate:
cert = certificate.read()
# Convert it into bytes.
cert_in_bytes = bytes(cert, 'utf-8')
# Create x509 certificate object.
cert_obj = x509.load_pem_x509_certificate(cert_in_bytes)
# Create Public key object.
public_key_obj = cert_obj.public_key()
# Convert Public key object into Pem format in bytes.
public_pem = public_key_obj.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
# Convert Public key into string.
pub_key_string = public_pem.decode("utf-8")
return(pub_key_string)