hacktricks/cryptography/certificates.md

12 KiB

Certificati

Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:


Usa Trickest per creare facilmente e automatizzare flussi di lavoro supportati dagli strumenti della comunità più avanzati al mondo.
Ottieni l'accesso oggi:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Cos'è un Certificato

Un certificato di chiave pubblica è un'identità digitale utilizzata in crittografia per dimostrare che qualcuno possiede una chiave pubblica. Include i dettagli della chiave, l'identità del proprietario (il soggetto) e una firma digitale da un'autorità fidata (l'emittente). Se il software si fida dell'emittente e la firma è valida, è possibile comunicare in modo sicuro con il proprietario della chiave.

I certificati sono principalmente emessi da autorità di certificazione (CA) in un'infrastruttura a chiave pubblica (PKI). Un altro metodo è la rete di fiducia, dove gli utenti verificano direttamente le chiavi degli altri. Il formato comune per i certificati è X.509, che può essere adattato per esigenze specifiche come descritto in RFC 5280.

Campi Comuni di x509

Campi Comuni nei Certificati x509

Nei certificati x509, diversi campi svolgono ruoli critici per garantire la validità e la sicurezza del certificato. Ecco una panoramica di questi campi:

  • Il Numero di Versione indica la versione del formato x509.
  • Il Numero Seriale identifica univocamente il certificato all'interno del sistema di un'Authority di Certificazione (CA), principalmente per il tracciamento delle revocazioni.
  • Il campo Soggetto rappresenta il proprietario del certificato, che potrebbe essere una macchina, un individuo o un'organizzazione. Include dettagliati identificativi come:
  • Nome Comune (CN): Domini coperti dal certificato.
  • Paese (C), Località (L), Stato o Provincia (ST, S, o P), Organizzazione (O) e Unità Organizzativa (OU) forniscono dettagli geografici e organizzativi.
  • Il Nome Distinto (DN) racchiude l'identificazione completa del soggetto.
  • Emittente dettaglia chi ha verificato e firmato il certificato, inclusi sottocampi simili al Soggetto per la CA.
  • Il Periodo di Validità è contrassegnato dai timestamp Non Prima di e Non Dopo, garantendo che il certificato non venga utilizzato prima o dopo una certa data.
  • La sezione Chiave Pubblica, cruciale per la sicurezza del certificato, specifica l'algoritmo, le dimensioni e altri dettagli tecnici della chiave pubblica.
  • Le estensioni x509v3 migliorano la funzionalità del certificato, specificando Utilizzo Chiave, Utilizzo Esteso Chiave, Nome Alternativo Soggetto e altre proprietà per ottimizzare l'applicazione del certificato.

Utilizzo Chiave ed Estensioni

  • Utilizzo Chiave identifica le applicazioni crittografiche della chiave pubblica, come firma digitale o cifratura chiave.
  • Utilizzo Esteso Chiave restringe ulteriormente i casi d'uso del certificato, ad esempio per l'autenticazione del server TLS.
  • Nome Alternativo Soggetto e Vincolo di Base definiscono ulteriori nomi host coperti dal certificato e se si tratta di un certificato CA o di entità finale, rispettivamente.
  • Gli identificatori come Identificatore Chiave Soggetto e Identificatore Chiave Autorità garantiscono l'unicità e la tracciabilità delle chiavi.
  • Accesso alle Informazioni dell'Autorità e Punti di Distribuzione CRL forniscono percorsi per verificare l'emittente CA e controllare lo stato di revoca del certificato.
  • CT Precertificate SCTs offrono registri di trasparenza, cruciali per la fiducia pubblica nel certificato.
# Example of accessing and using x509 certificate fields programmatically:
from cryptography import x509
from cryptography.hazmat.backends import default_backend

# Load an x509 certificate (assuming cert.pem is a certificate file)
with open("cert.pem", "rb") as file:
cert_data = file.read()
certificate = x509.load_pem_x509_certificate(cert_data, default_backend())

# Accessing fields
serial_number = certificate.serial_number
issuer = certificate.issuer
subject = certificate.subject
public_key = certificate.public_key()

print(f"Serial Number: {serial_number}")
print(f"Issuer: {issuer}")
print(f"Subject: {subject}")
print(f"Public Key: {public_key}")

Differenza tra punti di distribuzione OCSP e CRL

OCSP (RFC 2560) coinvolge un client e un responder che lavorano insieme per verificare se un certificato di chiave pubblica digitale è stato revocato, senza la necessità di scaricare l'intero CRL. Questo metodo è più efficiente rispetto al tradizionale CRL, che fornisce un elenco di numeri seriali di certificati revocati ma richiede il download di un file potenzialmente grande. I CRL possono includere fino a 512 voci. Ulteriori dettagli sono disponibili qui.

Cos'è la Trasparenza del Certificato

La Trasparenza del Certificato aiuta a contrastare le minacce legate ai certificati garantendo che l'emissione e l'esistenza dei certificati SSL siano visibili ai proprietari di domini, alle CA e agli utenti. I suoi obiettivi sono:

  • Impedire alle CA di rilasciare certificati SSL per un dominio senza il consenso del proprietario del dominio.
  • Stabilire un sistema di audit aperto per tracciare certificati rilasciati per errore o in modo malevolo.
  • Proteggere gli utenti dai certificati fraudolenti.

Log dei Certificati

I log dei certificati sono registri pubblicamente verificabili e aggiornabili solo in appendice dei certificati, mantenuti da servizi di rete. Questi log forniscono prove crittografiche a fini di audit. Sia le autorità di emissione che il pubblico possono inviare certificati a questi log o interrogarli per la verifica. Sebbene il numero esatto di server di log non sia fisso, ci si aspetta che sia inferiore a mille a livello globale. Questi server possono essere gestiti in modo indipendente da CA, ISP o qualsiasi entità interessata.

Interrogazione

Per esplorare i log di Trasparenza del Certificato per un qualsiasi dominio, visita https://crt.sh/.

Esistono formati diversi per memorizzare i certificati, ognuno con i propri casi d'uso e compatibilità. Questo riassunto copre i principali formati e fornisce indicazioni sulla conversione tra di essi.

Formati

Formato PEM

  • Formato più ampiamente usato per i certificati.
  • Richiede file separati per i certificati e le chiavi private, codificati in Base64 ASCII.
  • Estensioni comuni: .cer, .crt, .pem, .key.
  • Principalmente usato da Apache e server simili.

Formato DER

  • Un formato binario dei certificati.
  • Manca delle dichiarazioni "BEGIN/END CERTIFICATE" presenti nei file PEM.
  • Estensioni comuni: .cer, .der.
  • Spesso usato con piattaforme Java.

Formato P7B/PKCS#7

  • Memorizzato in Base64 ASCII, con estensioni .p7b o .p7c.
  • Contiene solo certificati e certificati di catena, escludendo la chiave privata.
  • Supportato da Microsoft Windows e Java Tomcat.

Formato PFX/P12/PKCS#12

  • Un formato binario che racchiude certificati del server, certificati intermedi e chiavi private in un unico file.
  • Estensioni: .pfx, .p12.
  • Principalmente usato su Windows per l'importazione ed esportazione di certificati.

Conversione dei Formati

Le conversioni PEM sono essenziali per la compatibilità:

  • x509 in PEM
openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem
  • PEM to DER
openssl x509 -outform der -in certificatename.pem -out certificatename.der
  • DER to PEM
openssl x509 -inform der -in certificatename.der -out certificatename.pem
  • PEM to P7B
    • PEM to P7B
openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer
  • PKCS7 to PEM
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem

Conversioni PFX sono cruciali per gestire i certificati su Windows:

  • PFX to PEM
openssl pkcs12 -in certificatename.pfx -out certificatename.pem
  • PFX to PKCS#8 coinvolge due passaggi:
  1. Convertire PFX in PEM
openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem
  1. Convert PEM to PKCS8

Convert PEM to PKCS8

To convert a PEM (Privacy-Enhanced Mail) formatted file to PKCS8 (Public-Key Cryptography Standards #8) format, you can use the following OpenSSL command:

openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -out private.pkcs8 -nocrypt

This command will convert the private key in the private.pem file from PEM format to PKCS8 format and save it in the private.pkcs8 file.

openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8
  • Da P7B a PFX richiede anche due comandi:
  1. Converti P7B in CER
openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer
  1. Converti il file CER e la chiave privata in formato PFX
openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer


Usa Trickest per creare facilmente e automatizzare flussi di lavoro supportati dagli strumenti della comunità più avanzati al mondo.
Ottieni l'accesso oggi:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

Impara l'hacking su AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks: