jak używać curl do sprawdzenia, czy certyfikat witryny został odwołany?

26

Aby sprawdzić, czy certyfikat dla google.com został odwołany, wypróbowałem następujące polecenie:

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

, ale mam przerażający błąd „Problem z certyfikatem 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

Myślę, że ten błąd jest nieprawidłowy, ponieważ Google powinien mieć ważny certyfikat.

Czy wiesz, jak mogę wydać polecenie curl, które robi to poprawnie?

Więcej szczegółów

Jeśli zastanawiasz się, dlaczego użyłem tych konkretnych plików (GeoTrust_Global_CA.pem i gtglobal.pem) w poleceniu curl, tak postępowałem:

  • Najpierw sprawdziłem, co urząd certyfikacji wydał dla https://www.google.com . Okazuje się, że jest to GeoTrust Global CA;
  • Pobrałem stąd główny certyfikat GeoTrust Global CA (jest to plik GeoTrust_Global_CA.pem);
  • Pobrałem stąd odpowiednią listę CRL (listę unieważnień certyfikatów) (jest to plik gtglobal.pem).
Claudiu
źródło
Wydaje mi się, że to już działa? Nie jestem pewien, jakie jest twoje pytanie.
mtak
1
@mtak - Biorąc pod uwagę, że weryfikacja nie powiodła się, wydaje się, że autor pyta powód, dla którego certyfikat nie został zweryfikowany, certyfikat powinien zostać zweryfikowany, ponieważ obecny certyfikat Google nie został odwołany.
Ramhound
Przepraszam, zdaję sobie teraz sprawę, że pytanie jest nieco niejasne. Zmienię to. @Ramhound to prawda :)
Claudiu
Nie rozumiem w zasadzie, dlaczego łączysz się z google.com, aby potwierdzić, czy certyfikat (który już otrzymałeś podczas uzgadniania TLS) jest obecny na liście CRL (którą już pobrałeś). Nie powinieneś tego robić na własnym komputerze? Co jeśli google.com był w rzeczywistości MITM?
Craig Hicks,
Oto przykład ręcznego sprawdzenia, czy certyfikat. jest na liście CRL, gdy oba certyfikaty. i CRL są w pamięci lokalnej --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

Odpowiedzi:

12

To mój codzienny skrypt:

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
Antonio Feitosa
źródło
10

Najwyraźniej nie można po prostu zweryfikować witryny za pomocą jednego prostego żądania. Zobacz /programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 i starsze powiązane pytania na temat stackoverflow.

curl nie działał z moimi listami odwołań certyfikatów , ani w systemie Windows, ani w systemie Linux. Dlaczego warto używać loków ? Otwarcie wydaje się bardziej odpowiednie:

openssl s_client -connect www.google.com:443

Dostajemy

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

Następnie możemy sprawdzić niektóre certyfikaty:

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

grep crlw danych wyjściowych powyższego polecenia. Interesujące części to:

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

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

Teraz możemy ręcznie sprawdzić 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

Teraz widzimy listę unieważnionych certyfikatów. IMHO, użycie curl to za mało, wymagany jest inny program do sprawdzania certyfikatów. Wykonując proste

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

widzimy, że curl nie sprawdza odwołań (nawet nie łączy się z odpowiednimi miejscami). To tylko mówi

* 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
źródło
2
Dlaczego mówisz, że curl nie może tego zrobić? Strona curl określa opcję „--crlfile”, która istnieje właśnie w tym celu. Ponadto curl jest kompilowany z openssl i wykorzystuje go do swoich operacji związanych z kryptografią (w tym certyfikatów) - po prostu nie działa dla mnie, próbując dowiedzieć się, dlaczego :)
Claudiu
3

Najwyraźniej jest to dość powszechny problem w systemie Windows, jak pokazuje to pytanie dotyczące przepływu stosu . Mam na myśli szczególnie odpowiedź użytkownika Артур Курицын, którą cytuję tutaj dla Twojej wygody:

To dość powszechny problem w systemie Windows. Trzeba po prostu zestaw cacert.pemdo curl.cainfo.

Od wersji PHP 5.3.7 możesz:

  1. pobierz http://curl.haxx.se/ca/cacert.pem i zapisz gdzieś.
  2. aktualizacja php.ini- dodaj curl.cainfo = "PATH_TO / cacert.pem"

W przeciwnym razie musisz wykonać następujące czynności dla każdego zasobu cURL:

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

Również ten artykuł może być przydatny.

użytkownik1301428
źródło
Z tego, co wiem, opcja wiersza polecenia „--cacert” (której użyłem) jest równoważna ustawieniu opcji CURLOPT_CAINFO w libcurl, więc nie sądzę, że jest to problem w moim przypadku (również przy użyciu Linuksa)
Claudiu,
Nie do końca odpowiedź na pytanie, wciąż bardzo przydatna informacja!
amenthes
1

Jeden sposób, w jaki uważam, że działa, jest podobny do innych już ujawnionych, tylko wysyła dane wyjściowe dev/nulli jest stosunkowo szybki w użyciu.

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
źródło
Wydaje się, że nie mówi to nic o tym, czy certyfikat witryny został odwołany. Rzeczywiście, zgodnie z dokumentacją, curlna Uniksie nie sprawdza się (chyba że specjalnie skompilujesz to z biblioteką SSL, która automatycznie zrobi to za ciebie).
tripleee