comment utiliser curl pour vérifier si le certificat d'un site a été révoqué?

26

Pour vérifier si le certificat de google.com a été révoqué, j'ai essayé la commande suivante:

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

, mais j'ai eu l'erreur redoutée de "problème de certificat 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

Je suppose que cette erreur n'est pas correcte, car Google devrait avoir un certificat valide.

Savez-vous comment je pourrais émettre une commande curl qui fait cela correctement?

Plus de détails

Si vous vous demandez pourquoi j'ai utilisé ces fichiers spécifiques (GeoTrust_Global_CA.pem et gtglobal.pem) dans la commande curl, voici comment j'ai procédé:

  • J'ai d'abord regardé ce que CA a délivré le certificat pour https://www.google.com . Il s'avère que c'est GeoTrust Global CA;
  • J'ai téléchargé le certificat racine de GeoTrust Global CA à partir d' ici (il s'agit du fichier GeoTrust_Global_CA.pem);
  • J'ai téléchargé la liste de révocation de certificats correspondante ( ici) (c'est le fichier gtglobal.pem).
Claudiu
la source
Il me semble que cela fonctionne déjà? Je ne sais pas quelle est votre question.
mtak
1
@mtak - Étant donné que la vérification a échoué, il semble que l'auteur demande la raison pour laquelle le certificat n'a pas été vérifié, le certificat aurait dû être vérifié, étant donné que le certificat Google actuel n'a pas été révoqué.
Ramhound
Désolé, je me rends compte maintenant que la question n'est pas claire. Je vais le modifier. @Ramhound c'est correct :)
Claudiu
Je ne comprends pas en principe pourquoi vous vous connectez à google.com pour confirmer si un certificat (que vous avez déjà reçu lors de la négociation TLS) est présent ou non sur une CRL (que vous avez déjà téléchargée). Ne devriez-vous pas faire cela sur votre propre ordinateur? Et si google.com était en fait un MITM?
Craig Hicks
Voici un exemple de vérification manuelle d'un certificat. est sur une liste de révocation de certificats une fois le certificat. et CRL sont dans la mémoire locale --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

Réponses:

12

Voilà mon scénario de tous les jours:

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

Sortie:

* 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
Antonio Feitosa
la source
10

Apparemment, vous ne pouvez pas simplement vérifier un site avec une seule demande simple. Voir /programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 et les questions connexes plus anciennes sur stackoverflow.

curl ne fonctionnait pas avec les listes de révocation de certificats pour moi non plus, ni sur Windows, ni sur Linux. Pourquoi devriez-vous utiliser curl ? Openssl semble plus approprié:

openssl s_client -connect www.google.com:443

On a

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

Ensuite, nous pouvons inspecter certains certificats:

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

grep crldans la sortie de la commande ci-dessus. Les parties intéressantes sont:

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

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

Maintenant, nous pouvons inspecter manuellement 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

Nous voyons maintenant une liste de certificats révoqués. À mon humble avis, l'utilisation de curl ne suffit pas, un autre programme est nécessaire pour vérifier les certificats. En faisant un simple

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

nous voyons que curl ne vérifie pas les révocations (pas même la connexion aux endroits appropriés). Ça dit juste

* 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.
MKaama
la source
2
Pourquoi dites-vous que curl ne peut pas faire ça? La page de manuel curl spécifie l'option '--crlfile' qui existe exactement à cet effet. En outre, curl est compilé avec openssl et l'utilise pour ses opérations liées à la cryptographie (y compris les certificats) - cela ne fonctionne tout simplement pas pour moi, essayant de savoir pourquoi :)
Claudiu
3

Apparemment, c'est un problème assez courant sur Windows, comme le montre cette question sur stackoverflow . Je me réfère spécifiquement à la réponse de l'utilisateur Артур Курицын, que je cite ici pour votre commodité:

C'est un problème assez courant dans Windows. Vous avez juste besoin de vous mettre cacert.pemà curl.cainfo.

Depuis PHP 5.3.7, vous pouvez faire:

  1. téléchargez http://curl.haxx.se/ca/cacert.pem et enregistrez-le quelque part.
  2. mise à jour php.ini- ajoutez curl.cainfo = "PATH_TO / cacert.pem"

Sinon, vous devrez effectuer les opérations suivantes pour chaque ressource cURL:

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

En outre, cet article peut également être utile.

user1301428
la source
D'après ce que je sais, l'option de ligne de commande '--cacert' (que j'ai utilisée) équivaut à définir l'option CURLOPT_CAINFO dans libcurl, donc je ne pense pas que ce soit le problème dans mon cas (aussi, je suis utilisant Linux)
Claudiu
Pas exactement la réponse à la question, encore des informations très utiles!
amenthes
1

Une façon que j'ai trouvé de travailler est similaire à d'autres déjà exposées, seulement elle envoie la sortie dev/nullet elle est relativement rapide à utiliser.

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
Pierfrancesco PierQR Aiello
la source
Cela ne semble rien nous dire si le certificat du site a été révoqué. En effet, selon la documentation, curlsur Unix ne vérifie pas (sauf si vous le compilez spécifiquement avec une bibliothèque SSL qui le fait automatiquement pour vous).
tripleee