¿Por qué la exportación de openssl pkcs12 agrega un certificado de anclaje raíz adicional y duplica el certificado del servidor en Mac OS X?

¿Por qué la exportación de openssl pkcs12 agrega un certificado de anclaje raíz adicional y duplica el certificado del servidor en Mac OS X?

[Originalmentepublicado en Slack Overflow, pero el hilo de comentarios se quejó del lugar inadecuado.]

Estamos trabajando para cambiar de los certificados SSL de StartCom a Let's Encrypt e intentar configurarlo para que funcione automáticamente con macOS Server + Apache HTTPD. Desde la herramienta de línea de comandos ( security import), macOS Server no acepta .pemarchivos directos; debe proporcionarle un .p12archivo del cual extrae .pemarchivos para configurar en Apache. Molesto e inútil, pero es con lo que tenemos que vivir por ahora.

Para crear este .p12archivo, tenemos que ejecutar este comando:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/chain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

Y aquí es donde se pone raro. El example.com.p12archivo de salida tiene el example.comcertificado.dos veces, seguido del certificado CA intermedio Let's Encrypt, seguido del certificado ancla DST Root CA X3 autofirmado innecesario (que todos los navegadores tienen instalado de forma predeterminada) y, finalmente, seguido de la clave privada. El resultado es que el protocolo de enlace Apache SSL incluye el certificado del servidor dos veces, el certificado de CA intermedio y el certificado raíz (que no debería enviar), lo que genera advertencias en el probador de Qualys SSL Labs.

Miramos dentro cert.pemy solo contiene el certificado del servidor (y solo una vez). chain.pemsolo contiene el certificado de CA intermedio (no el ancla raíz ni el certificado del servidor). privkey.pemSólo contiene la clave privada. También lo openssl pkcs12 -exportes duplicar el certificado del servidor y luego dar el paso adicional de buscar el certificado de anclaje raíz y agregarlo.

Si ejecutamos este mismo comando en openSUSE Linux, el .p12archivo de salida solo tiene el certificado del servidor (una vez), el certificado de CA intermedia y la clave privada. Sin anclaje de raíz.

Probamos las siguientes variaciones y no vimos diferencias en el resultado:

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

La única forma en que puedo duplicar el comportamiento incorrecto del certificado de servidor duplicado en una máquina Linux es hacer lo siguiente (pero aún no incluye el ancla raíz):

openssl pkcs12 -export \
-inkey /etc/letsencrypt/live/example.com/privkey.pem \
-in /etc/letsencrypt/live/example.com/cert.pem \
-certfile /etc/letsencrypt/live/example.com/fullchain.pem \
-out /etc/letsencrypt/live/example.com/example.com.p12

(Tenga en cuenta que el uso de fullchain.pemen lugar de chain.pemjunto con el uso de cert.pem... tiene mucho sentido por qué se duplicaría el certificado del servidor, pero ese no es el comando que estamos usando en Mac OS X).

¿Alguna idea de cómo llegar openssl pkcs12 -exporta hacer lo correcto aquí?

información relacionada