Curl: no se puede obtener el certificado de emisor local. ¿Cómo depurar?

14

Tengo un problema extraño. Actualicé mi máquina de desarrollo LAMP (Debian) a PHP 7. Después ya no puedo conectarme a una API cifrada TLS específica a través de Curl.

El certificado SSL en cuestión está firmado por thawte.

curl https://example.com

me da

curl: (60) SSL certificate problem: unable to get local issuer certificate

mientras

curl https://thawte.com

que, por supuesto, también está firmado por Thawte Works.

Puedo acceder al sitio API a través de HTTPS en otras máquinas, por ejemplo, mi escritorio a través de curl y en el navegador. Entonces el certificado es definitivamente válido. La calificación de SSL Labs es A.

Cualquier otra solicitud Curl de mi máquina de desarrollo a otros sitios encriptados SSL funciona. Mis certificados raíz están actualizados. Para verificar, corrí update-ca-certificates. Incluso descargué http://curl.haxx.se/ca/cacert.pem a / etc / ssl / certs y corrí c_rehash.

Sigue siendo el mismo error.

¿Hay alguna forma de depurar el proceso de verificación y ver qué certificado de emisor local curl (o openssl) está buscando pero no encuentra, es decir, un nombre de archivo?

ACTUALIZAR

curl -vs https://example.com

me dice (IP + Dominio anonimizado)

* Hostname was NOT found in DNS cache
*   Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* 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: unable to get local issuer certificate
* Closing connection 0

Y

echo | openssl s_client -connect example.com:443

da

CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=DE/ST=XYZ/CN=*.example.com
   i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
 1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
   i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: [...]
    Session-ID-ctx:
    Master-Key: [...]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d   Z..@,.k.JPu....-
    [...]
    00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24   ...%.....s...F.$

    Start Time: 1455111516
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE
Robar
fuente
1
¿Podría dar una salida detallada de al menos de esos cmd? curl -vs https://example.com echo | openssl s_client -connect example.com:443
François

Respuestas:

8

Usando openssl s_client -connect thawte.com:443espectáculos:

---
Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
   i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
 1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---

Esa última "i" muestra la CA raíz autofirmada emisora. Supongo que esa raíz raíz Thawte particular , es decir. el certificado raíz primario CA - G3 no está en su /etc/ssl/certsdirectorio (como se indica en la curlsalida; openssl s_clientno tiene una ruta de CA predeterminada y necesita una explícita, p -CApath /etc/ssl/certs . ej .).

Agregar ese certificado explícitamente a su /etc/ssl/certsdirectorio (y volver a ejecutar c_rehash) ciertamente no estaría de más. Y si funciona, por ejemplo , como se verificó usando openssl s_client -connect example.com:443 -CApath /etc/ssl/certs, entonces sabe que ese update-ca-certificatescomando puede necesitar algún examen / depuración, en cuanto a por qué no ha recogido esta CA raíz.

Ahora, puede ser que la CA raíz anterior ya esté en su /etc/ssl/certsdirectorio, y los pasos anteriores no tuvieron efecto. En ese caso, hay otros dos certificados de CA emisores para verificar (al menos en la cadena de certificados ofrecidos por thawte.com:443): thawte Primary Root CA y thawte SSL CA - G2 . La repetición de los pasos anteriores para instalar estos certificados en su /etc/ssl/certsdirectorio (y volver a ejecutar c_rehash) podría funcionar. Dado que estos dos son CA intermedios, y no CA raíz, la ausencia de uno de ellos explicaría sus resultados, y podría esperarse que los certificados pasados ​​por alto update-ca-certificates.

¡Espero que esto ayude!

Castaglia
fuente
¡Gracias! ¡Descargar el certificado intermedio "thawte SSL CA - G2" a / etc / ssl / certs y volver a ejecutar c_rehash solucionó el problema!
Rob
1
Este openssl s_client -connect <server>:443 -CAfile cacert.pemcomando es muy útil ... ¡gracias!
kris
0

Esto podría deberse a un orden incorrecto del sitio, emisión, certificados intermedios y raíz en el archivo de certificado de clave pública del sitio.

El navegador muestra los certificados en la dirección inversa superior-inferior (raíz, intermedio, emisor, sitio) pero el certificado debe estar en la dirección inferior-superior (sitio, emisor, intermedio, raíz).

andrej
fuente