web-dev-qa-db-fra.com

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

Pour vérifier si le certificat pour 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 l'erreur redoutée "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

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

Savez-vous comment je pourrais émettre une commande curl qui le fasse 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 examiné quelle autorité de certification avait 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 l'autorité de certification GeoTrust Global à partir de ici (il s'agit du fichier GeoTrust_Global_CA.pem);
  • J'ai téléchargé la liste de révocation de certificats correspondante depuis ici (il s'agit du fichier gtglobal.pem).
21
Claudiu

Apparemment, vous ne pouvez pas simplement vérifier un site avec une simple requête. Voir https://stackoverflow.com/questions/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 et les questions plus anciennes relatives à stackoverflow.

curl ne fonctionnait pas avec les listes de révocation de certificats pour moi non plus, ni sous Windows, ni sous 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 un certificat:

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

grep crl dans le résultat 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. IMHO, utiliser 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

on voit que curl ne vérifie pas les révocations (même pas en se connectant aux endroits pertinents). Il 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.
10
MKaama

C'est mon script 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
8
Antonio Feitosa

Apparemment, il s’agit d’un problème assez courant sous Windows, car cette question sur stackoverflow indique . Je fais spécifiquement référence à la réponse de l'utilisateur Артур Курицын, que je cite ici pour votre commodité:

C'est un problème assez courant sous Windows. Vous devez simplement définir 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. update php.ini - add curl.cainfo = "PATH_TO/cacert.pem"

Sinon, vous devrez procéder comme suit pour chaque ressource cURL:

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

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

3
user1301428

Une façon dont j'ai trouvé le travail est semblable aux autres déjà exposés, seulement il envoie la sortie à dev/null et il 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