¿Por qué la clave pública extraída de la CSR es diferente a la extraída del certificado asociado?

0

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
    
pregunta bg666 25.11.2014 - 22:27
fuente

0 respuestas

Lea otras preguntas en las etiquetas