Come ottenere i certificati intermedi al livello di programmazione?

2

Sto costruendo uno script che cataloga l'uso dei certificati pubblici intermedi e root, dato il certificato pubblico di un sito, quindi ho bisogno di procurarmi i certificati in modo programmatico. A volte queste possono essere raggruppate con le risposte del server, ma altre volte potrebbero aver bisogno di essere recuperate o estratte da un file certificato CA. Vedo spesso i certificati elencati nell'output da strumenti come testssl.sh e openssl s_client e link , ma non sono chiaro come posso ottenere allo stesso modo e li estrae in modo affidabile, idealmente in formato PEM. Qualcuno può suggerire il modo migliore per farlo?

    
posta Synchro 22.11.2016 - 10:45
fonte

1 risposta

3

È possibile utilizzare openssl s_client per acquisire la catena di certificati da un determinato sito Web e (con l'opzione -showcerts ) identificherà utilmente l'ubicazione e (i) ssuer per ciascun certificato. Se la root non è inclusa, dovresti riuscire a trovarla nel tuo archivio di certificati locale.

Ecco alcuni esempi di output da openssl s_client , con la carne dei certificati effettivi tagliati (...) per brevità:

$ echo "" | openssl s_client -showcerts -connect www.google.com:443
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
-----BEGIN CERTIFICATE-----
MIIEgDCCA2igAwIBAgIIRLhIyqBaCIMwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
...
segXWw==
-----END CERTIFICATE-----
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
-----BEGIN CERTIFICATE-----
MIID8DCCAtigAwIBAgIDAjqSMA0GCSqGSIb3DQEBCwUAMEIxCzAJBgNVBAYTAlVT
...
wSHGFg==
-----END CERTIFICATE-----
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
-----BEGIN CERTIFICATE-----
MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
...
b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
-----END CERTIFICATE-----
---
Server certificate
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---

Il primo certificato nella catena (0) ti mostra che è soggetto ed emittente. Come potete vedere, l'oggetto per il secondo certificato (1) è lo stesso dell'emittente per (0) e l'emittente per (1) è l'oggetto per (2). L'emittente per (2) è il certificato di origine, che non è incluso. (È accettato, ma non obbligatorio, includere la radice nella catena, poiché lo scopo della radice deve essere una copia "attendibile" memorizzata localmente, il software dovrebbe non "fidarsi" della root-hand ad esso da un server Web. Detto questo, ho visto software (non browser) che si è rotto se la root non era inclusa nella catena, quindi succede).

Su un sistema Linux, puoi rintracciare il certificato di root nella directory /etc/ssl/certs , sia come singolo file o come parte di un file di grandi dimensioni come ca-certificates.crt (Ubuntu) o ca-bundle.crt (Cappello rosso). Puoi usare openssl x509 -noout -subject -in filename dove nomefile è un singolo file di certificato per ottenere l'oggetto di ciascun certificato; il confronto di quelli con quelli estratti dalla catena di certificati sopra consentirà di rintracciare il certificato del server.

(estrarre i soggetti da tutti quei file, o far esplodere il bundle in un certo numero di file ed estrarre soggetti da essi, è una sfida di scripting Unix di media complessità lasciata al lettore).

Potresti trovare server web che non forniscono la catena necessaria. In questi casi, di solito è perché i certificati intermedi sono anche comunemente distribuiti dai venditori di browser, quindi possono farla franca.

Infine, se non riesci a rintracciare un certificato dell'emittente con uno qualsiasi di questi metodi, prova a cercare Google sull'argomento. Se si tratta di un'autorità di certificazione pubblica, è probabile che sia elencata da qualche parte.

Rispondi al commento:

No, non è garantito che il soggetto sia univoco - ricorda, l'intero punto dei certificati x509 è che devi avere una catena di fiducia fino a una radice implicitamente attendibile; sai che l'Oggetto è buono perché è stato firmato da qualcuno di cui ti fidi. Ma da soli, un soggetto potrebbe essere falsificato se non stai verificando il certificato.

Quindi impronte digitali chiave sono le il modo migliore per identificare univocamente un certificato ed è possibile utilizzare openssl x509 per stamparli dato il certificato:

$ openssl x509 -sha256 -noout -in my_cert.crt -fingerprint
SHA256 Fingerprint=DC:5F:B5:98:53:E0:FC:B2:33:7B:8A:CE:64:09:75:76:65:84:A0:8C:2F:B1:D4:01:6D:1F:70:04:C6:0E:23:69
$ 
    
risposta data 27.11.2016 - 05:51
fonte

Leggi altre domande sui tag