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

16

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

Eu acho que esse erro não está correto, já que 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 eu usei esses arquivos específicos (GeoTrust_Global_CA.pem e gtglobal.pem) no comando curl, foi assim que eu continuei:

  • Primeiramente, observei o que a CA emitiu o certificado para o link . Acontece que é GeoTrust Global CA;
  • Eu fiz o download do certificado raiz da GeoTrust Global CA em aqui (esse é o GeoTrust_Global_CA.pem arquivo);
  • Eu fiz o download da CRL correspondente (lista de certificados revogados) de aqui (esse é o arquivo gtglobal.pem) .
por Claudiu 16.04.2014 / 12:57

3 respostas

8

Aparentemente, você não pode apenas verificar um site com uma única solicitação simples. Consulte link e versões anteriores perguntas relacionadas no stackoverflow.

O

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

openssl s_client -connect www.google.com:443

Recebemos

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

Em seguida, podemos inspecionar alguns certificados:

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

grep crl na 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 o 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 o curl não é suficiente, outro programa é necessário para verificar os certificados. Fazendo um simples

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

vemos que o curl não está verificando as revogações (nem mesmo se conectando aos lugares 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.
    
por 29.04.2014 / 00:03
6

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
    
por 15.01.2016 / 14:21
3

Aparentemente, esse é um problema bastante comum no Windows, já que esta questão em stackoverflow mostra . Estou me referindo especificamente à resposta do usuário Артур Курицын, que cito aqui para sua conveniência:

It's a pretty common problem in Windows. You need just to set cacert.pem to curl.cainfo.

Since PHP 5.3.7 you could do:

  1. download http://curl.haxx.se/ca/cacert.pem and save it somewhere.
  2. update php.ini -- add curl.cainfo = "PATH_TO/cacert.pem"

Otherwise you will need to do the following for every cURL resource:

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

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

    
por 24.04.2014 / 18:18