Convertendo PKCS12 para PEM

Cenário

Pedi o certificado do cliente e ele me mandou um aquivo em formato PKCS12, e ainda por cima com senha :)

Eu preciso usar esse cert em NGINX e sem a senha de preferência.

Esse é o típico post nota mental para não ter que memorizar esses comandos.

Como Faz para separar tudo?

Primeiro vamos extrair a chave privada do arquivo P12 para formato PEM

openssl pkcs12 -in certificate.p12 -nocerts -out certificate.key

Agora vamos extrair o certificado

openssl pkcs12 -in certificate.p12 -clcerts -nokeys -out certificate.crt

Agora vamos extrair a cadeia (caso precise)

openssl pkcs12 -in certificate.p12 -cacerts -nokeys -chain > ca.crt

Para remover a senha da chave execute

openssl rsa -in certificate.key -out certificate_nopass.key

Concatenando CA com CRT para ter um certificado chained/fullchain.

cat certificate.crt ca.crt > fullchain.crt

Pronto agora você pode utilizar os arquivos PEM em seus serviços numa boa!

Como faz para checar tudo?

A checagem mais simples para ver se tá tudo bem

openssl verify certificate.crt
openssl verify certificate.key

Verificando uma chave privada

openssl rsa -in privateKey.key -check

Verificando um certificado pem

openssl x509 -in certificate.crt -text -noout

Verificando um arquivo p12

openssl pkcs12 -info -in certificate.p12

Verificando um certificado já no ar

openssl s_client -connect mindnotes.sh:443

Erros comuns

Se você estiver tomando esse erro no NGINX

Nginx SSL: error:0B080074:x509 certificate routines: X509_check_private_key:key values mismatch

Você provavelmente concatenou o CA com o CRT de forma errada. Para conectenar corretamente siga essa ordem:

Your Primary SSL certificate (your_domain_name.crt)
  -> Your Intermediate certificate 
    -> Your Root certificate 

A estrutura interna deve ser algo como:

-----BEGIN CERTIFICATE-----
(Your Primary SSL certificate: domain.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Your Intermediate certificate: intermediate.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Your Root certificate: root.crt)
-----END CERTIFICATE-----

Se concatenar corretamente não haverá problemas com o NGINX ou outro reverse proxy/webserver.

Debugando os certificados

Se voce ainda assim está tomando erros nos logs do seu NGINX, verifique se a chave privada dá match com o certificado, faça isso usando o openssl.

# openssl x509 -noout -modulus -in certificate.crt | openssl md5
(stdin)= 9b728f2acad237e350fc67ce750fa51d

# openssl rsa -noout -modulus -in certificate.key | openssl md5
(stdin)= 9b728f2acad237e350fc67ce750fa51d

A saída tem que ser a mesma se os certificado estiverem bacanas, se estiver diferente verifique se não pulou algum passo e se está com os arquivos certos.

Refs