2009-09-21 16 views
33

Mi aplicación usa SSL para comunicarse de forma segura con un servidor y tiene problemas para verificar la cadena de certificados. La cadena tiene el siguiente aspecto:Problemas para entender la verificación de la cadena de certificados SSL

Autoridad de Certificación de Servidor Seguro

Entrust.net -> DigiCert Global CA -> * .ourdomain.com

Estamos utilizando un almacén de certificados sacó de Mozilla. Contiene el certificado de Entrust.net, pero no el de DigiCert Global CA.

Mi entendimiento es que una autoridad intermedia no tiene que ser de confianza, siempre y cuando la autoridad es la raíz, pero la verificación falla:

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt 
error 20 at 0 depth lookup:unable to get local issuer certificate 

Así que necesito para confiar explícitamente la CA DigiCert global en orden para pasar la verificación? Eso parece incorrecto ¡Pero tú dime!

EDIT: Ahora entiendo que el archivo de certificado debe estar disponible para OpenSSL por adelantado. Algo como esto funciona:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt 
ourdomain.com.crt: OK 

Esto me permite proporcionar una copia de la DigiCert CA sin decir explícitamente "Confío en ella", toda la cadena todavía tiene que ser verificado.

Pero seguramente los navegadores como Firefox no siempre se enviarán con una copia de cada certificado que necesite. Siempre habrá nuevas CA y el punto es usar la seguridad del certificado raíz para asegurarse de que todas las CA intermedias sean válidas. ¿Derecha? Entonces, ¿cómo hace este trabajo? ¿Es realmente tan tonto como parece?

+0

En OpenBSD, '-CAfile' se puede establecer en'/etc/ssl/cert.pem'. –

Respuesta

16

Los certificados intermedios deben instalarse en sus servidores web, así como los certs para su propio dominio. Estaba teniendo el mismo problema la semana pasada ... Firefox parece ser más quisquilloso que el resto de los navegadores sobre esto.

+4

Aha ... Está bien. Gracias por la visión David. Para aquellos que vienen de Google, la palabra clave para configurar apache es SSLCertificateChainFile. Vea esto (¡desde DigiCert mismo!) http://www.digicert.com/ssl-certificate-installation-apache.htm –

+0

Lo más increíble. Gracias, Josh, esto me ayudó mucho. – 0xCAFEBABE

6

Aquí es la forma correcta para verificar un certficate procedente de un servidor web

  • cliente mantiene una lista de certificados raíz de CA
  • Servidores Web debe devolver la siguiente certificado de servidor - Requerido
  • Certificado Intermedio (s) - Certificado ROOT CA requerido - No obligatorio/Opcional

Cuando un cliente se conecta a un servidor, obtiene el certificado del servidor y el intermediario te certificado (s) del servidor. El cliente entonces construye una cadena de confianza desde el certificado del servidor, a través de los certificados intermedios a uno de los certificados de CA ROOT en los que confía. Los certificados ROOT siempre están autofirmados, por lo que es donde se detiene la cadena.

Aquí es un simple comando para poner a prueba un certificado de servidor web utilizando OpenSSL

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT 

En el caso de alojamiento virtual, donde varios certificados se sirven en la misma IP: puerto, el nombre del servidor de indicación (SNI) puede ser habilitado usando -servername <FQDN>. De lo contrario, se enviará el certificado predeterminado.

Cuestiones relacionadas