Por que openssl pkcs12 export adiciona um certificado de âncora de raiz extra, duplicando o certificado de servidor no Mac OS X

1

[Originalmente postado no Slack Overflow , mas o thread de comentários reclamou sobre o local inapropriado.]

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. A partir da ferramenta de linha de comando ( security import ), o macOS Server não aceita os arquivos .pem diretos - é necessário fornecer um arquivo .p12 , do qual ele extrai arquivos .pem para configurar no Apache. Irritante e sem sentido, mas é com o que temos que viver por enquanto.

Para criar este arquivo .p12 , 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 é onde fica estranho. O arquivo example.com.p12 de saída tem o certificado example.com duas vezes , seguido pelo certificado da CA Vamos criptografar, seguido pelo certificado auto-assinado autoassinado DST Root CA X3 anchor (que todos os navegadores instalaram neles por padrão) e, finalmente, seguido pela chave privada. O resultado é que o handshake SSL da Apache inclui o certificado do servidor duas vezes, o certificado da CA intermediária e o certificado raiz (que não deveria estar enviando), o que resulta em avisos no testador Qualys SSL Labs.

Nós analisamos o cert.pem e ele contém apenas o certificado do servidor (e apenas uma vez). chain.pem contém apenas o certificado de CA intermediário (não a âncora da raiz ou o certificado do servidor). privkey.pem contém apenas a chave privada. Portanto, openssl pkcs12 -export está duplicando o certificado do servidor e, em seguida, vai para a etapa extra de procurar o certificado de âncora raiz e adicioná-lo.

Se executarmos esse mesmo comando no openSUSE Linux, o arquivo .p12 da saída terá apenas o certificado do servidor (uma vez), o certificado da CA intermediária e a chave privada. Nenhuma âncora de raiz.

Tentamos as seguintes variações e não observamos diferenças 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 da 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 que o uso de fullchain.pem em vez de chain.pem em conjunto com o uso de cert.pem ... faz todo o sentido por que o certificado do servidor seria duplicado, mas esse não é o comando que estamos usando no Mac OS X.)

Alguma ideia de como obter openssl pkcs12 -export para fazer a coisa certa aqui?

    
por Nick Williams 02.01.2018 / 17:29

0 respostas