[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?