Как использовать 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
Извините, теперь я понимаю, что вопрос немного неясен. Я буду редактировать это. @Ramhound, это правильно :)
Claudiu
Я не понимаю в принципе, почему вы подключаетесь к google.com, чтобы подтвердить, присутствует ли сертификат (который вы уже получили во время рукопожатия TLS) или нет в CRL (который вы уже загрузили). Разве вы не должны делать это на своем компьютере? Что если google.com на самом деле был MITM?
Крейг Хикс,
Вот пример проверки вручную сертификата. находится на CRL, как только сертификат. и 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 }'

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
Антонио Фейтоса
источник
10

По-видимому, вы не можете просто подтвердить сайт одним простым запросом. См. Https://stackoverflow.com/questions/16244084/how-to-programmatics-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

Теперь мы видим список отозванных сертификатов. ИМХО, использования 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.
MKaama
источник
2
Почему вы говорите, что curl не может этого сделать? Страница man curl указывает параметр --crlfile, который существует именно для этой цели. Кроме того, curl скомпилирован с openssl и использует его для своих операций, связанных с шифрованием (включая сертификаты) - это просто не работает для меня, пытаясь выяснить почему :)
Claudiu
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");

Кроме того, эта статья также может быть полезной.

user1301428
источник
Из того, что я знаю, параметр командной строки '--cacert' (который я использовал) является эквивалентом установки параметра CURLOPT_CAINFO в libcurl, поэтому я не думаю, что это проблема в моем случае (также я с использованием Linux)
Claudiu
Не совсем ответ на вопрос, еще очень полезная информация!
amenthes
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
Pierfrancesco PierQR Aiello
источник
Похоже, это ничего не говорит нам о том, был ли сертификат сайта отозван. Действительно, согласно документации, curlUnix не проверяет (если вы специально не скомпилируете его с библиотекой SSL, которая автоматически сделает это за вас).
tripleee