Como exportar a cadeia de certificados de CA do PFX no formato PEM sem atributos de bolsa

31

Eu tenho um arquivo PKCS12 que contém a cadeia completa de certificados e a chave privada. Preciso dividi-lo em três arquivos para um aplicativo. Os 3 arquivos necessários são os seguintes (no formato PEM):

  • um arquivo de chave não criptografado
  • um arquivo de certificado do cliente
  • um arquivo de certificado da CA (raiz e todos os intermediários)

Essa é uma tarefa comum que tenho que executar, por isso estou procurando uma maneira de fazer isso sem nenhuma edição manual da saída.

Eu tentei o seguinte:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes -out <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys -out <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain -out <cacerts.cer>

Isso funciona bem, no entanto, a saída contém atributos de bolsa, com os quais o aplicativo não sabe como lidar.

Após algumas pesquisas, encontrei uma solução sugerida para passar os resultados pelo x509 para remover os atributos da bolsa.

openssl x509 -in <clientcert.cer> -out <clientcert.cer>

Isso funciona, mas eu encontro um problema no arquivo cacert. O arquivo de saída contém apenas um dos três certificados na cadeia.

Existe uma maneira de evitar a inclusão dos atributos bag na saída do comando pkcs12 ou uma maneira de fazer com que a saída do comando x509 inclua todos os certificados? Além disso, se executá-lo no x509 for a solução mais simples, existe uma maneira de canalizar a saída do pkcs12 para o x509 em vez de gravar o arquivo duas vezes?

BryKKan
fonte

Respostas:

36

A solução que finalmente encontrei foi canalizá-lo através do sed.

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>
openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>
openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>
BryKKan
fonte
Obrigado! Isso me salvou algum tempo hoje! ;-)
Jim P.
Muito obrigado!
PaulJ