Estoy jugando con pyopenssl. Intento extraer la clave pública de una CSR y comprobar si es la misma que la que encuentro en el certificado asociado.
Hay una pequeña diferencia entre los dos que no puedo explicar.
Desde el certificado CSR:
30 61 02 01 00 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 04 4D 30 4B 02 01 00 02 41 00 A4 BF 6C 40 D5 46 98 AA B8 E5 6B 9C 65 05 7A D5 C7 80 D0 47 83 06 C7 7A 64 89 D5 AA 68 84 2C 8E E4 2D C2 4E 98 61 FC 29 57 3D D9 E9 BC 7E 14 28 2C 49 A7 BF CE C3 6C D2 75 63 89 40 58 06 CC C3 02 03 01 00 01
Desde el certificado CSR :
30 48 02 41 00 A4 BF 6C 40 D5 46 98 AA B8 E5 6B 9C 65 05 7A D5 C7 80 D0 47 83 06 C7 7A 64 89 D5 AA 68 84 2C 8E E4 2D C2 4E 98 61 FC 29 57 3D D9 E9 BC 7E 14 28 2C 49 A7 BF CE C3 6C D2 75 63 89 40 58 06 CC C3 02 03 01 00 01
Puedes ver que el principio es diferente:
30 61 02 01 00 30 0D 06 09 2A 86 48 86 F7 0D 01 01 01 05 00 04 4D 30 4B 02 01 00
30 48
¿Podrías ayudarme?
También, uso el método crypto.dump_privatekey (), pero creo que devuelve la clave pública si se aplica a la CSR. ¿Es correcto? ¿Y hay una manera de extraer la clave pública del certificado directamente?
¡Gracias!
Aquí está el código:
from OpenSSL import crypto, SSL
PEM = SSL.FILETYPE_PEM
# Create a key set and a CSR:
pkey = crypto.PKey()
pkey.generate_key(crypto.TYPE_RSA, 512)
csr = crypto.X509Req()
csr.get_subject().CN = 'Test'
csr.set_pubkey(pkey)
csr.sign(pkey, "sha256")
# Extract the public key from the CSR:
pkey = csr.get_pubkey()
pkey_str_pub = crypto.dump_privatekey(PEM, pkey)
# Remove the first and last line of the PEM
pkey_list_pub = pkey_str_pub.splitlines(True)[1:-1]
pkey_str_pub = ''.join(pkey_list_pub)
# Convert to hex
pkey_bin_pub = binascii.a2b_base64(pkey_str_pub)
pkey_hex_pub = binascii.b2a_hex(pkey_bin_pub)
# Uppercase and blocks of 2 char
pkey_nice_pub = ' '.join(pkey_hex_pub[i:i+2] for i in xrange(0,len(pkey_hex_pub),2)).upper()
print pkey_nice_pub # Gives the second line
# For the associated certificate now
cert = crypto.X509()
cert.set_serial_number(serial)
cert.gmtime_adj_notBefore(notBefore)
cert.gmtime_adj_notAfter(notAfter)
cert.set_subject(csr.get_subject())
cert.set_pubkey(csr.get_pubkey())
cert.set_issuer(ca_cert.get_subject())
cert.sign(ca_pkey, "sha256")
cert_pem = crypto.dump_certificate(PEM, cert) # Gives the cert with the first line