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