como usar curl para verificar se o certificado de um site foi revogado?

25

Para verificar se o certificado do google.com foi revogado, tentei o seguinte comando:

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

, mas recebi o temido erro "problema de certificado 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

Acho que esse erro não está correto, pois o Google deve ter um certificado válido.

Você sabe como eu poderia emitir um comando curl que faz isso corretamente?

Mais detalhes

Se você está se perguntando por que usei esses arquivos específicos (GeoTrust_Global_CA.pem e gtglobal.pem) no comando curl, é assim que procedi:

  • Analisei primeiro o que a CA emitiu o certificado para https://www.google.com . Acontece que é a GeoTrust Global CA;
  • Fiz o download do certificado raiz da CA Global GeoTrust a partir daqui (este é o arquivo GeoTrust_Global_CA.pem);
  • Eu baixei a CRL correspondente (lista de revogação de certificados) aqui (este é o arquivo gtglobal.pem).
Claudiu
fonte
Parece-me que já funciona? Não tenho certeza de qual é a sua pergunta.
mtak
1
@mtak - Considerando que a verificação falhou, parece que o autor está perguntando o motivo pelo qual o certificado não foi verificado, o certificado deveria ter sido verificado, considerando que o certificado atual do Google não foi revogado.
Ramhound
Desculpe, agora percebo que a pergunta não é clara. Eu vou editá-lo. @Ramhound que é :) correta
Claudiu
Em princípio, não entendo por que você estaria se conectando ao google.com para confirmar se um certificado (que você já recebeu durante o handshake TLS) está presente ou não em uma CRL (que você já baixou). Você não deveria fazer isso no seu próprio computador? E se o google.com fosse realmente um MITM?
Craig Hicks
Aqui está um exemplo de verificação manual de um certificado. está em uma CRL uma vez que ambos o certificado. e CRL estão na memória local --- feistyduck.com/library/openssl%2dcookbook/online/…
Craig Hicks

Respostas:

12

Esse é o meu roteiro diário:

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

Aparentemente, você não pode apenas verificar um site com uma única solicitação simples. Consulte /programming/16244084/how-to-programmatically-check-if-a-certificate-has-been-revoked?lq=1 e perguntas relacionadas mais antigas sobre stackoverflow.

O curl também não funcionou com as Listas de revogação de certificados , nem no Windows nem no Linux. Por que você deve usar curl ? O Openssl parece mais apropriado:

openssl s_client -connect www.google.com:443

Nós temos

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

Então podemos inspecionar alguns certificados:

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

grep crlna saída do comando acima. As partes interessantes são:

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

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

Agora podemos inspecionar manualmente 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

Agora vemos uma lista de certificados revogados. IMHO, usando curl não é suficiente, é necessário outro programa para verificar os certificados. Fazendo uma simples

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

vemos que o curl não está verificando revogações (nem mesmo se conectando aos locais relevantes). Apenas diz

* 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
fonte
2
Por que você diz que o curl não pode fazer isso? A página de manual curl especifica a opção '--crlfile' que existe exatamente para essa finalidade. Além disso, onda é compilado com openssl e usa-lo para suas operações relacionadas com criptografia (incluindo certificados) - ele simplesmente não está trabalhando para mim, tentando descobrir por que :)
Claudiu
3

Aparentemente, esse é um problema bastante comum no Windows, como mostra esta pergunta no stackoverflow . Refiro-me especificamente à resposta do usuário Артур Курицын, que cito aqui para sua conveniência:

É um problema bastante comum no Windows. Você precisa apenas definir cacert.pemcomo curl.cainfo.

Desde o PHP 5.3.7, você pode fazer:

  1. faça o download de http://curl.haxx.se/ca/cacert.pem e salve-o em algum lugar.
  2. atualização php.ini- add curl.cainfo = "PATH_TO / cacert.pem"

Caso contrário, você precisará fazer o seguinte para cada recurso cURL:

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

Além disso, este artigo também pode ser útil.

user1301428
fonte
Pelo que sei, a opção de linha de comando '--cacert' (que eu usei) é o equivalente a definir a opção CURLOPT_CAINFO na libcurl, então eu não acho que esse seja o problema no meu caso (também, eu estou usando Linux)
Claudiu
Não é exatamente a resposta para a pergunta, ainda é uma informação muito útil!
amenthes 13/09/2015
1

Uma maneira que eu achei que o trabalho é semelhante a outros já expostos, apenas envia a saída dev/nulle é relativamente rápido de usar.

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
fonte
Parece que isso não nos diz nada sobre se o certificado do site foi revogado. De fato, conforme a documentação, o curlUnix não verifica (a menos que você o compile especificamente com uma biblioteca SSL que faz isso automaticamente para você).
tripleee 27/11