як за допомогою curl перевірити, чи було анульовано сертифікат сайту?


26

Щоб перевірити, чи був анульований сертифікат на google.com, я спробував таку команду:

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

, але я отримав жахливу помилку "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

Я думаю, що ця помилка не є правильною, оскільки Google повинен мати дійсний сертифікат.

Чи знаєте ви, як я міг дати команду curl, яка робить це правильно?

Детальніше

Якщо вам цікаво, чому я використовував ці конкретні файли (GeoTrust_Global_CA.pem та gtglobal.pem) у команді curl, так я продовжував:

  • Я вперше подивився, що CA видав сертифікат для https://www.google.com . Виявляється, це GeoTrust Global CA;
  • Я завантажив звідси кореневий сертифікат GeoTrust Global CA (це файл GeoTrust_Global_CA.pem);
  • Я завантажив звідси відповідний CRL (список відкликання сертифікатів) (це файл gtglobal.pem).

Мені здається, це вже працює? Я не впевнений, у чому ваше питання.
mtak

1
@mtak - Зважаючи на те, що перевірка не вдалася, схоже, автор запитує причину, чому сертифікат не підтвердив, сертифікат повинен був бути перевірений, враховуючи те, що поточний сертифікат Google не був відкликаний.
Рамхаунд

Вибачте, зараз я розумію, що питання дещо незрозуміле. Я його відредагую. @Ramhound це правильно :)
Клавдіу

Я в принципі не розумію, чому ви б підключились до google.com, щоб підтвердити, чи є сертифікат (який ви вже отримали під час рукостискання TLS), на CRL (який ви вже завантажили). Ви не повинні робити це на своєму комп’ютері? Що робити, якщо google.com насправді був MITM?
Крейг Хікс

Ось приклад ручної перевірки наявності cert. є на CRL один раз обидва cert. і CRL знаходяться в локальній пам'яті --- feistyduck.com/library/openssl%2dcookbook/online/…
Крейг Хікс

Відповіді:


12

Ось мій щоденний сценарій:

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

Вихід:

* 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

Мабуть, ви не можете просто підтвердити сайт одним простим запитом. Дивіться /programming/16244084/how-to-programmatic-check-if-a-certificate-has-been-revoked?lq=1 та старіші відповідні запитання про stackoverflow.

curl не працював із списками відкликання сертифікатів для мене, ні в Windows, ні в Linux. Навіщо використовувати локон ? Openssl видається більш підходящим:

openssl s_client -connect www.google.com:443

Ми отримуємо

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

Тоді ми можемо перевірити деякий сертифікат:

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

grep crlу висновку вищевказаної команди. Цікаві частини:

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

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

Тепер ми можемо вручну перевірити 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

Тепер ми бачимо список відкликаних сертифікатів. IMHO, використовуючи curl недостатньо, потрібна інша програма для перевірки сертифікатів. Роблячи простий

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

ми бачимо, що curl не перевіряє скасування (навіть не підключаючись до відповідних місць). Це просто говорить

* 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
Чому ти кажеш, що curl не може цього зробити? Сторінка curl визначає параметр '--crlfile', який існує саме для цієї мети. Також curl компілюється з openssl і використовує його для своїх операцій, пов’язаних із криптовалютою (включаючи сертифікати) - це просто не працює для мене, намагаючись з’ясувати, чому :)
Клавді,

3

Мабуть, це досить поширена проблема в Windows, як показує це питання в stackoverflow . Я конкретно маю на увазі відповідь користувача Артур Курицын, яку я цитую тут для вашої зручності:

Це досить поширена проблема в Windows. Вам потрібно просто набір cacert.pemдо curl.cainfo.

З PHP 5.3.7 ви можете:

  1. завантажити http://curl.haxx.se/ca/cacert.pem і зберегти його кудись.
  2. оновлення php.ini- додайте curl.cainfo = "PATH_TO / cacert.pem"

Інакше вам потрібно буде виконати наступне для кожного ресурсу CURL:

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

Також ця стаття може бути корисною.


З того, що мені відомо, параметр командного рядка '--cacert' (який я використав) є еквівалентом встановлення параметра CURLOPT_CAINFO в libcurl, тому я не думаю, що це проблема в моєму випадку (також я за допомогою Linux)
Клавдіу

Не зовсім відповідь на питання, ще дуже корисна інформація!
аменте

1

Один із способів, за яким я виявив, що працює, схожий на інші, вже викриті, лише він надсилає висновок, dev/nullі він порівняно швидкий у використанні.

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

Схоже, це нічого не говорить про те, чи було анульовано сертифікат сайту. Дійсно, згідно з документацією, curlUnix не перевіряє (якщо ви спеціально не компілюєте його з бібліотекою SSL, яка автоматично робить це за вас).
трійка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.