El certificado del servidor termina en el certificado de CA eliminado, ¿aún funciona?

1

Contexto: Tengo un código C ++ que utiliza curl con GnuTLS que no se puede conectar a enlace desde Ubuntu actualizado el paquete ca-certificates . Eso, por lo que puedo decir, corresponde al error de Debian # 858064 .

Esa no es (todavía) la parte interesante, sin embargo. Tenga en cuenta, en particular, que este código C ++ ha estado funcionando bien durante varios años, y funciona si le proporciono la versión anterior del archivo /etc/ssl/certs/ca-certificates.crt .

Problema: Cuando uso los siguientes comandos:

$ openssl s_client -connect sheets.googleapis.com:443 \
    -CApath /etc/ssl/certs/ca-certificates.crt
$ gnutls-cli sheets.googleapis.com
    --x509cafile /etc/ssl/certs/ca-certificates.crt
$ curl --cacert /etc/ssl/certs/ca-certificates.crt \
    https://sheets.googleapis.com

... ellos todos funcionan correctamente. Al igual que Google Chrome y Mozilla Firefox.

Y no puedo entender por qué funcionan, cuando mi código de C ++ no . Falla con CURLE_SSL_CACERT (60) : el certificado de igual no se puede autenticar con certificados de CA conocidos.

El servidor de Google devuelve la siguiente cadena de certificados, de acuerdo con OpenSSL; el GnuTLS se ve igual, por lo que puedo decir; y veo 3 certificados en Wireshark:

Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.googleapis.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

Pregunta: Estoy tratando de entender cómo GnuTLS, en particular, construye y verifica su cadena de certificados en Linux. Ese certificado "Equifax Secure Certificate Authority" parece haber sido eliminado en la actualización ca-certificates y, sin embargo, no parece haber roto nada (excepto mi código).

Si miro el certificado en Google Chrome, ese certificado raíz no se muestra, y la cadena termina en el certificado "GeoTrust Global CA" en su lugar, que parece estar autofirmado.

  • ¿Por qué OpenSSL muestra resultados diferentes de Chrome?
  • ¿Por qué OpenSSL (aparentemente) sigue confiando en un certificado de CA eliminado?
  • ¿Cómo compruebo que los certificados mostrados por OpenSSL / GnuTLS / etc. mapear a los archivos relevantes en /etc/ssl/certs ?
pregunta Roger Lipscombe 23.10.2017 - 21:58
fuente

1 respuesta

4
  

¿Por qué OpenSSL muestra resultados diferentes de Chrome?

OpenSSL muestra la cadena de certificados enviada por el servidor. Chrome está mostrando la cadena utilizada para la validación. Dado que existe un certificado CA autofirmado para GeoTrust Global CA que usa la misma clave que la firmada por Equifax, el certificado de CA Equifax ya no es necesario para verificar la cadena.

Este certificado CA autofirmado para GeoTrust Global CA también se encuentra en las versiones actuales del paquete ca-certificates , por lo que las versiones actuales de OpenSSL ya no necesitan el Equifax para validar la cadena. Sin embargo, hubo un error con versiones anteriores de OpenSSL en las que no se pudo validar la cadena si la CA firmada por Equifax se incluyó en la cadena, pero la CA de Equifax no estaba en el almacén de confianza. Consulte Verificación de SSL de Python Requests .

  

¿Por qué OpenSSL (aparentemente) sigue confiando en un certificado de CA eliminado?

No lo hace. En cambio, confía en la CA global de GeoTrust incluida en el almacén de confianza e ignora el certificado de cadena emitido por Equifax (que tiene la misma clave).

  

¿Cómo compruebo que los certificados mostrados por OpenSSL / GnuTLS / etc. mapear a los archivos relevantes en / etc / ssl / certs

No estoy seguro de lo que quieres decir con "mapa". Pero puede hacer que s_client le muestre todos los certificados con el -showcerts y luego verifique si estos certificados están incluidos en su almacén de confianza (es decir, comparación de cadenas). Si, en cambio, desea verificar si se puede verificar una cadena de certificados específica con su almacén de confianza, use openssl verify -CAfile ca-certificates.pem -untrusted chain-certs.pem leaf-cert.pem . Vea también Use openssl para verificar individualmente los componentes de un cadena de certificados .

    
respondido por el Steffen Ullrich 23.10.2017 - 22:47
fuente

Lea otras preguntas en las etiquetas