извлечение открытого ключа из сертификата и шифрование данных

#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()
  

Источник: https://pyjwt.readthedocs.io/en/stable/faq.html

Ответ №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)