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