Perché la chiave pubblica estratta dal CSR è diversa da quella estratta dal certificato associato?

0

Sto giocando con pyopenssl. Sto cercando di estrarre la chiave pubblica da un CSR e verificare se è uguale a quella che trovo nel certificato associato.

C'è una piccola differenza tra i due di quanto non possa spiegare.

Dalla certificazione 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

Dal certificato 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

Puoi vedere che l'inizio è diverso:

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

Potresti darmi una mano?

Inoltre, utilizzo il metodo crypto.dump_privatekey (), ma penso che restituisca la chiave pubblica se applicata al CSR. È corretto? E c'è un modo per estrarre direttamente la chiave pubblica dal certificato?

Grazie!

Ecco il codice:

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
    
posta bg666 25.11.2014 - 22:27
fonte

0 risposte