In questo articolo vedremo come estrarre le informazioni più rilevanti da un file CSR con Python.
Per iniziare, dobbiamo installare il modulo pyOpenSSL che fornisce un'interfaccia e delle classi wrapper attorno alla libreria OpenSSL.
Quindi possiamo definire il seguente codice:
import OpenSSL.crypto
from OpenSSL.crypto import load_certificate_request, FILETYPE_PEM
def get_csr_file(csr_file=None):
if csr_file is None or not os.path.exists(csr_file):
return None
with open(csr_file, 'r') as crt:
return crt.read()
def get_csr_data(file=None):
csr = get_csr_file(file)
if csr is None:
return None
csr_request = load_certificate_request(FILETYPE_PEM, csr)
pub_key = csr_request.get_pubkey()
pub_key_type = 'RSA' if pub_key.type() == OpenSSL.crypto.TYPE_RSA else 'DSA'
pub_key_size = pub_key.bits()
subject = csr_request.get_subject()
components = dict(subject.get_components())
return {
'key_type': pub_key_type,
'key_size': pub_key_size,
'attributes': components
}
Leggiamo il contenuto del file CSR come stringa e lo passiamo, se esiste, alla funzione load_certificate_request()
unitamente alla costante che specifica il tipo di certificato che vogliamo analizzare. Questa funzione restituisce un oggetto i cui metodi ci permettono di ricavare il tipo di chiave pubblica usata, la sua dimensione in byte e i dati contenuti negli attributi del certificato, come Country, State, il Common Name ed altri.
Possiamo utilizzare il nostro codice in questo modo:
def main():
csr_data = get_csr_data('./test.csr')
print(csr_data)
if __name__ == '__main__':
main()
È da notare che i dati contenuti nel dizionario attributes
vengono restituiti come byte, quindi occorrerà effettuare una conversione in stringa per poterli visualizzare in un'interfaccia Web.