Por que a exportação do openssl pkcs12 adiciona certificado de âncora raiz extra, duplicando o certificado do servidor no Mac OS X

Por que a exportação do openssl pkcs12 adiciona certificado de âncora raiz extra, duplicando o certificado do servidor no Mac OS X

[Originalmentepostado no Slack Overflow, mas o tópico de comentários reclamou de local inadequado.]

Estamos trabalhando na mudança dos certificados SSL da StartCom para o Let's Encrypt e tentando configurá-lo para funcionar automaticamente com o macOS Server + Apache HTTPD. Na ferramenta de linha de comando ( security import), o macOS Server não aceita os .pemarquivos diretos – você precisa fornecer um .p12arquivo, do qual ele extrai .pemos arquivos para configurar no Apache. Irritante e inútil, mas é com isso que temos que conviver por enquanto.

Para criar este .p12arquivo, temos que executar 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

E é aqui que fica estranho. O example.com.p12arquivo de saída contém o example.comcertificadoduas vezes, seguido pelo certificado CA intermediário Let's Encrypt, seguido pelo certificado âncora DST Root CA X3 autoassinado desnecessário (que todos os navegadores instalaram neles por padrão) e, finalmente, seguido pela chave privada. O resultado é que o handshake SSL do Apache inclui o certificado do servidor duas vezes, o certificado CA intermediário e o certificado raiz (que não deveria ser enviado), o que resulta em avisos no testador Qualys SSL Labs.

Examinamos o interior cert.peme ele contém apenas o certificado do servidor (e apenas uma vez). chain.pemcontém apenas o certificado CA intermediário (não a âncora raiz ou o certificado do servidor). privkey.pemcontém apenas a chave privada. O mesmo openssl pkcs12 -exportacontece com a duplicação do certificado do servidor e, em seguida, a etapa extra de procurar o certificado âncora raiz e adicioná-lo.

Se executarmos este mesmo comando no openSUSE Linux, o .p12arquivo de saída terá apenas o certificado do servidor (uma vez), o certificado CA intermediário e a chave privada. Sem âncora raiz.

Tentamos as seguintes variações e não vimos diferença na saída:

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

A única maneira de duplicar o comportamento incorreto do certificado de servidor duplicado em uma máquina Linux é fazer o seguinte (mas ainda não inclui a âncora raiz):

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

(Observe o uso de fullchain.pemem vez de chain.pemem conjunto com o uso de cert.pem... faz todo o sentido porque o certificado do servidor seria duplicado, mas esse não é o comando que estamos usando no Mac OS X.)

Alguma ideia de como fazer openssl pkcs12 -exporta coisa certa aqui?

informação relacionada