come usare l'arricciatura per verificare se il certificato di un sito è stato revocato?


26

Per verificare se il certificato per google.com è stato revocato, ho provato il seguente comando:

curl https://www.google.com --cacert GeoTrust_Global_CA.pem --crlfile gtglobal.pem -v

, ma ho ricevuto l'errore temuto "Problema certificato SSL":

* About to connect() to www.google.com port 443 (#0)
*   Trying 81.24.29.91... connected
* successfully set certificate verify locations:
*   CAfile: GeoTrust_Global_CA.pem
  CApath: /etc/ssl/certs
* successfully load CRL file:
*   CRLfile: gtglobal.pem
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
* Closing connection #0
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html

Immagino che questo errore non sia corretto, dal momento che Google dovrebbe avere un certificato valido.

Sai come potrei emettere un comando curl che lo fa correttamente?

Più dettagli

Se ti stai chiedendo perché ho usato quei file specifici (GeoTrust_Global_CA.pem e gtglobal.pem) nel comando curl, ecco come ho proceduto:

  • Ho prima esaminato ciò che CA ha emesso il certificato per https://www.google.com . Si scopre che è GeoTrust Global CA;
  • Ho scaricato il certificato radice della CA globale di GeoTrust da qui (questo è il file GeoTrust_Global_CA.pem);
  • Ho scaricato il CRL corrispondente (elenco di revoche di certificati) da qui (questo è il file gtglobal.pem).

Mi sembra che funzioni già? Non sono sicuro di quale sia la tua domanda.
martedì

1
@mtak - Considerando che la verifica non è riuscita sembra che l'autore stia chiedendo il motivo per cui il certificato non è stato verificato, il certificato avrebbe dovuto essere verificato, considerando che l'attuale certificato di Google non è stato revocato.
Ramhound,

Mi spiace, mi rendo conto ora che la domanda non è chiara. Lo modificherò. @Ramhound che è corretto :)
Claudiu

In linea di principio non capisco perché ti connetteresti a google.com per confermare se un certificato (che hai già ricevuto durante l'handshake TLS) è presente o meno su un CRL (che hai già scaricato). Non dovresti farlo sul tuo computer? E se google.com fosse in realtà un MITM?
Craig Hicks,

Ecco un esempio di controllo manuale se un certificato. è su un CRL una volta entrambi i certificati. e CRL sono nella memoria locale --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks,

Risposte:


12

Questa è la mia sceneggiatura quotidiana:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

ouput:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact

10

Apparentemente, non puoi semplicemente verificare un sito con una singola semplice richiesta. Vedi /programming/16244084/how-to-programmatical-check-if-a-certificate-has-been-revoked?lq=1 e domande correlate precedenti su StackOverflow.

curl non ha funzionato con gli elenchi di revoche di certificati , né su Windows né su Linux. Perché dovresti usare il ricciolo ? Openssl sembra più appropriato:

openssl s_client -connect www.google.com:443

Noi abbiamo

---
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
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---

Quindi possiamo ispezionare alcuni certificati:

curl http://pki.google.com/GIAG2.crt | openssl x509 -inform der -text

grep crlnell'output del comando precedente. Le parti interessanti sono:

        X509v3 CRL Distribution Points:
            URI:http://crl.geotrust.com/crls/gtglobal.crl

        Authority Information Access:
            OCSP - URI:http://gtglobal-ocsp.geotrust.com

Ora possiamo ispezionare manualmente crl:

curl http://crl.geotrust.com/crls/gtglobal.crl | openssl crl -inform der -text
curl http://pki.google.com/GIAG2.crl | openssl crl -inform der -text

Ora vediamo un elenco di certificati revocati. IMHO, l'uso dell'arricciatura non è sufficiente, è necessario un altro programma per controllare i certificati. Facendo un semplice

strace curl https://www.google.com   -v

vediamo che l'arricciatura non sta controllando le revoche (nemmeno collegandosi ai luoghi pertinenti). Dice solo

* Server certificate:
*        subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*        start date: 2014-04-09 11:40:11 GMT
*        expire date: 2014-07-08 00:00:00 GMT
*        subjectAltName: www.google.com matched
*        issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*        SSL certificate verify ok.

2
Perché dici che il ricciolo non può farlo? La manpage curl specifica l'opzione '--crlfile' che esiste esattamente per questo scopo. Inoltre, curl è compilato con openssl e lo usa per le sue operazioni relative alle criptovalute (compresi i certificati) - semplicemente non funziona per me, cercando di scoprire perché :)
Claudiu

3

Apparentemente questo è un problema abbastanza comune su Windows, come mostra questa domanda su StackOverflow . Mi riferisco in particolare alla risposta dell'utente Артур Курицын, che cito qui per comodità:

È un problema abbastanza comune in Windows. Devi solo impostare cacert.pemsu curl.cainfo.

Da PHP 5.3.7 potresti fare:

  1. scarica http://curl.haxx.se/ca/cacert.pem e salvalo da qualche parte.
  2. aggiornamento php.ini- aggiungi curl.cainfo = "PATH_TO / cacert.pem"

Altrimenti dovrai fare quanto segue per ogni risorsa cURL:

curl_setopt ($ch, CURLOPT_CAINFO, "PATH_TO/cacert.pem");

Inoltre, questo articolo potrebbe anche essere utile.


Da quello che so, l'opzione da riga di comando '--cacert' (che ho usato) è l'equivalente dell'impostazione dell'opzione CURLOPT_CAINFO in libcurl, quindi non penso che questo sia il problema nel mio caso (inoltre, sono usando Linux)
Claudiu,

Non esattamente la risposta alla domanda, comunque informazioni molto utili!
amenthes,

1

Un modo in cui ho trovato che funziona è simile ad altri già esposti, solo invia l'output a dev/nulled è relativamente veloce da usare.

curl -L -v -s https://www.google.de 1>/dev/null

# curl -L -v -s https://www.google.de 1>/dev/null
* About to connect() to www.google.de port 443 (#0)
*   Trying 216.58.208.35...
* Connected to www.google.de (216.58.208.35) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*   subject: CN=www.google.de,O=Google LLC,L=Mountain View,ST=California,C=US
*   start date: Okt 23 16:53:00 2018 GMT
*   expire date: Jan 15 16:53:00 2019 GMT
*   common name: www.google.de
*   issuer: CN=Google Internet Authority G3,O=Google Trust Services,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.de
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Mon, 12 Nov 2018 15:36:17 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: 1P_JAR=2018-11-12-15; expires=Wed, 12-Dec-2018 15:36:17 GMT; path=/; domain=.google.de
< Set-Cookie: NID=146=4SDchvTa39-4IskdXfZpgjtm2ym5zzvHVx8g0v39Q1fiOzk26NQl1TGkFMllh_pg8bFWr6x4jG3ODYDWrkn6TXmd0Ewp4DC_N3p1NPlWqdBUfwFR_PTHIXRi8RuTxdA54w9Zr0uNyhN__5xjUdrCLZTLujNEQ2MV9EVwnmxux6o; expires=Tue, 14-May-2019 15:36:17 GMT; path=/; domain=.google.de; HttpOnly
< Alt-Svc: quic=":443"; ma=2592000; v="44,43,39,35"
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
{ [data not shown]
* Connection #0 to host www.google.de left intact

Questo non sembra dirci nulla sul fatto che il certificato del sito sia stato revocato. Infatti, secondo la documentazione, curlsu Unix non verifica (a meno che non lo compili specificamente con una libreria SSL che lo fa automaticamente per te).
Tripleee
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.