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é:
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.
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
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:
- téléchargez http://curl.haxx.se/ca/cacert.pem et enregistrez-le quelque part.
- 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.
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