¿Diferencia entre SSLCertificateFile y SSLCertificateChainFile?

35

Normalmente con un host virtual se configura un SSL con las siguientes directivas:

Listen 443 

SSLCertificateFile /home/web/certs/domain1.public.crt
SSLCertificateKeyFile /home/web/certs/domain1.private.key
SSLCertificateChainFile /home/web/certs/domain1.intermediate.crt

De: Para habilitar SSL para un solo dominio en un servidor con múltiples hosts, ¿funcionará esta configuración?

¿Cuál es la diferencia entre SSLCertificateFiley SSLCertificateChainFile? El cliente ha comprado una clave CA de GoDaddy. Parece que GoDaddy solo proporciona un SSLCertificateFile(archivo .crt) y un SSLCertificateKeyFile (archivo .key) y no en SSLCertificateChainFile.

¿Mi ssl seguirá funcionando sin una SSLCertificateChainFileruta especificada?

Además, ¿hay una ruta canónica donde se deben colocar estos archivos?

chrisjlee
fuente
1
La mayoría de los lugares comúnmente veo gente poniendo los archivos de certificados está en /etc/ssl, /usr/local/etc/sslo en una sslespecífica subdirectorio a la página web (por ejemplo, /home/www/example.com/datatiene el sitio web a continuación home/www/example.com/ssltiene los CERT).
Chris S

Respuestas:

49

Estrictamente hablando, nunca necesita la cadena para que SSL funcione.

Lo que siempre necesita es un SSLCertificateFilearchivo que SSLCertificateKeyFilecontenga la clave correcta para ese certificado.

El problema es que si todo lo que le da a Apache es el certificado, todo lo que tiene que dar a los clientes que se conectan es el certificado, que no cuenta toda la historia sobre ese certificado SSL. Dice: "Estoy firmado por alguien, pero no voy a contarte sobre ellos".

Esto generalmente funciona bien, ya que la mayoría de los sistemas cliente tienen una gran cantidad de certificados de CA (tanto raíz como intermedios) que puede verificar si existe una relación de firma coincidente para establecer la confianza. Sin embargo, a veces esto no funciona; con mayor frecuencia, el problema con el que se encontrará es un cliente que no posee el certificado para una CA intermedia que firmó su certificado.

Ahí es donde entra la cadena; le permite a Apache mostrarle al cliente exactamente cómo se ve la relación de confianza, lo que puede ayudar a un cliente a llenar los espacios en blanco entre su certificado, una raíz en la que confía y el intermediario que no conoce. La cadena se puede incluir en su configuración de dos maneras:

  • Incrustado en el mismo archivo que ha configurado para usted SSLCertificateFile, en nuevas líneas después del certificado del servidor en orden (la raíz debe estar en la parte inferior). Si lo configura de esta manera, querrá SSLCertificateChainFileseñalar exactamente el mismo archivo que SSLCertificateFile.
  • En un archivo separado configurado en la SSLCertificateChainFiledirectiva; el certificado de CA que emitió el certificado del servidor debe estar primero en el archivo, seguido de cualquier otro en la raíz.

Verifique el archivo del certificado que tiene ahora. Apuesto a que no incluye los datos de la cadena. Lo que generalmente funciona bien, pero eventualmente causará un problema con algún navegador u otro.

Shane Madden
fuente
2
Creo que "por lo general funciona bien" ya no se aplica a los certificados de GoDaddy, si el intermedio no está incluido. Ni siquiera estoy seguro de si ya se aplica a tipos como Verisign y Thawte, ya que se han movido para hacer que los certificados del sitio sean más distantes de los básicos que se incluyen en el navegador. Me imagino que facilita la revocación, ya que es más sencillo matar a los intermedios.
cjc
"Integrado en el SSLCertificateFile": me hubiera gustado que esto funcionara, pero no parece, y no se menciona en los documentos. Tu cadena tiene que ser puesta SSLCertificateChainFile.
Steve Kehlet
@SteveKehlet Tienes razón en que no está documentado, pero he tenido éxito en el pasado. ¿Cómo formateaste el archivo todo en uno?
Shane Madden
1
@SteveKehlet En realidad, tienes razón, me acuerdo mal; La forma en que lo configuré para un solo archivo fue tener ambos SSLCertificateFiley SSLCertificateChainFileseñalar el mismo archivo combinado, que funciona, editó mi respuesta para corregir eso.
Shane Madden
@ShaneMadden Beautiful! ¡Funciona! Muchas gracias por resolver eso.
Steve Kehlet
4

En realidad, GoDaddy te da una cadena intermedia:

http://support.godaddy.com/help/5238

Aquí hay más discusión.

http://support.godaddy.com/help/868/what-is-an-intermediate-certificate

El correo electrónico de GoDaddy que le indica cómo descargar su nuevo certificado también tendrá información sobre el archivo de certificado intermedio. Está en algún lugar hacia el fondo, tal vez después de que tus ojos se vean por la verborrea y la venta adicional.

En términos de lo que sucederá si no incluye la directiva SSLCertificateChainFile adecuada: verá una gran advertencia roja en su navegador porque su sitio SSL no se validará en los navegadores, ya que no pueden seguir la cadena de certificados de su sitio cert a una propiedad de una autoridad de certificación que conoce el navegador.

cjc
fuente
2

Me gustaría agregar a las buenas respuestas anteriores sobre SSLCertificateChainFile que el orden de los certificados en ese archivo también es importante. Los clientes basados ​​en OpenSSL resolverán el pedido ellos mismos, pero los clientes basados ​​en gnutls fallarán en una cadena con el pedido incorrecto.

Pruebe el pedido con gnutls-cli, como

gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p https wwwsec.cs.uu.nl

donde /etc/ssl/certs/ca-certificates.crt es la ubicación donde su distribución coloca los certificados combinados.

Koos van den Hout
fuente