
[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 .pem
arquivos diretos – você precisa fornecer um .p12
arquivo, do qual ele extrai .pem
os arquivos para configurar no Apache. Irritante e inútil, mas é com isso que temos que conviver por enquanto.
Para criar este .p12
arquivo, 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.p12
arquivo de saída contém o example.com
certificadoduas 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.pem
e ele contém apenas o certificado do servidor (e apenas uma vez). chain.pem
contém apenas o certificado CA intermediário (não a âncora raiz ou o certificado do servidor). privkey.pem
contém apenas a chave privada. O mesmo openssl pkcs12 -export
acontece 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 .p12
arquivo 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.pem
em vez de chain.pem
em 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 -export
a coisa certa aqui?