¿Cómo hacer que Gnu / Linux confíe en un certificado en el que Windows confía de inmediato?

11

Hay un servidor con una cadena SSL rota, según lo informado por esta verificación SSL :

Informe de verificación SSL

Sé que este es un problema que debe resolverse en el servidor en sí, pero a veces es difícil de solucionar (no soy el administrador del servidor).

La cuestión es que Chrome / Mozilla / Edge en Windows confía en el certificado del sitio de todos modos :

ingrese la descripción de la imagen aquí

Sin embargo, en una implementación de Gnu / Linux (Ubuntu 18.04 en Docker) el certificado no es confiable:

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

Intenté update-ca-certificatese incluso importé el certificado raíz de Globalsign. update-ca-certificatesinformó un certificado duplicado en ese caso. De todos modos, nada funciona.

Como reproducir

Usando Docker:

docker run -it ubuntu:18.04

# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it  # <---- "unable to get local issuer certificate"

¿Cómo puedo hacer que Gnu / Linux confíe en este certificado?

PD: el mismo certificado se implementa correctamente en otro servidor .

Udo G
fuente
¿Por qué el voto negativo?
Udo G
1
Estoy votando para cerrar esta pregunta como fuera de tema porque el OP está preguntando algo sobre lo que no puede influenciarse. Dijo que no puede modificar nada del lado del servidor , por lo que esto probablemente pertenece al superusuario, ya que describe un problema que no tiene una solución del lado del cliente.
LinuxSecurityFreak
2
Estoy pidiendo específicamente una solución del lado del cliente. No puedo influir en el servidor, pero tengo control total sobre el cliente O / S (Ubuntu) y quiero que esta instalación específica de O / S confíe en el certificado al igual que otros O / S (Windows). No se trata de arreglar el sitio HTTPS para otros.
Udo G
1
Usted no controla el servidor, pero aún puede informar el problema a la persona que sí controla el servidor.
Michael Hampton

Respuestas:

11

La solución real para esto es garantizar que su servidor presente todos los certificados en la cadena y no solo el certificado de la entidad final (servidor).

Dirija al administrador del servidor a RFC 5246 Sección 7.4.2, que establece claramente que Este mensaje transmite la cadena de certificados del servidor al cliente.


Si su administrador se niega / no puede hacer esto por alguna razón, su opción alternativa es intentar curltrabajar con el apretón de manos mal formado.

Según un mensaje en la lista de correo de Curl:

¿Alguien puede confirmar si cURL admite (o no) un certificado intermedio?

Si lo hace Todos los certificados ca tienen una cadena de certificados que va hasta la raíz. El paquete ca que usa con curl debe consistir en los certificados de toda la cadena.

/ daniel.haxx.se

Debería poder agregar la CA raíz y todos los certificados intermedios a un paquete y señalarlo curlcon la --cacert <file>opción.

A medida que sus navegadores funcionan, puede acceder a los certificados de CA correctos desde allí. En la pestaña de certificados (diferente para cada navegador, pero estoy seguro de que lo resolverá), vea la cadena de certificados. Haga doble clic en la entidad emisora raíz primera Globalsign Root CA - G1 y en el Detalles ficha, haga clic en Copiar en archivo ... . Guárdalo como root.cer. Haga lo mismo con AlphaSSL CA - SHA256 - G2 y guárdelo como issuing.cer. Une los dos juntos en un solo archivo (por ejemplo chain.cer) y úsalo como argumento para -cacert.

Como señaló amablemente @AB, el certificado que falta también se puede encontrar aquí .


Sus navegadores funcionan porque almacenan en caché los certificados de CA. Si ha navegado a un sitio web configurado correctamente en algún momento en el pasado, cuyo certificado fue emitido por la misma CA que el certificado de su servidor, el navegador lo almacenará en caché. Cuando visite posteriormente su sitio configurado incorrectamente, su navegador utilizará los certificados de CA en su caché para construir la cadena. Para usted, parece que todo está bien, aunque detrás de escena, el servidor está mal configurado.

Tenga en cuenta que en Windows, IE / Edge y Chrome comparten el mismo caché, mientras que Firefox usa el suyo.

Además de lo anterior, IE / Edge y Chrome (ya que comparten la misma pila de cifrado) usarán una extensión dentro de los certificados llamada AuthorityInformationAccess . Esto tiene una opción de caIssuer que proporciona una URL desde la cual se puede descargar el certificado CA del certificado de entidad final. Por lo tanto, incluso si uno de estos navegadores no ha almacenado en caché los certificados faltantes de la navegación anterior, puede recuperarlo si es necesario. Tenga en cuenta que Firefox no hace esto, por lo que a veces Firefox puede mostrar errores de certificado cuando IE / Edge y Chrome parecen funcionar.

garethTheRed
fuente
1
No es mi servidor, así que no puedo modificar nada del lado del servidor. Traté de usar el paquete CA de curl.haxx.se/docs/caextract.html (ya que Firefox confía en el certificado) y lo pasé usando, --cacert cacert.pempero CURL aún no acepta el certificado.
Udo G
1
Que es su servidor. Ejecútelo echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443y verá que su servidor solo presentará un certificado. Debe haber dos, el certificado de entidad final (que se presenta) y la CA emisora, el certificado Alpha SSL - SHA256 - G2. Este último no está siendo enviado por el servidor, pero debería.
garethTheRed
2
@garethTheRed: Entiendo que el servidor no presenta todos los certificados, pero el servidor no está bajo mi control (eso es lo que quise decir con "no mi servidor"). Solo intento acceder a una API en un servidor externo. En Windows, ninguno de mis navegadores se queja del certificado, solo Linux / Debian / Ubuntu.
Udo G
@AB: muchas gracias! La instalación de todos los certificados raíz de esa página resolvió el problema . Sin embargo, me gustaría entender por qué ese paso manual es necesario.
Udo G
2
El certificado intermedio que falta (como lo menciona @garethTheRed) se puede encontrar allí: support.globalsign.com/customer/portal/articles/… . OP inicialmente solo trató de agregar el certificado raíz que probablemente ya estaba en su lugar, sin lograr nada.
AB