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

19

Eu tenho um arquivo PKCS12 contendo a cadeia de certificados completa e a chave privada. Eu preciso dividi-lo em 3 arquivos para um aplicativo. Os 3 arquivos que eu preciso são os seguintes (no formato PEM):

  • um arquivo de chave não criptografado
  • um arquivo de certificado de cliente
  • um arquivo de certificado de autoridade de certificação (raiz e todos os intermediários)

Esta é uma tarefa comum que tenho que executar, por isso estou procurando uma maneira de fazer isso sem qualquer 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, que o aplicativo não sabe como manipular.

Após algumas pesquisas, encontrei uma solução sugerida de passar os resultados por x509 para remover os atributos do pacote.

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

Isso funciona, mas me deparo com um problema no arquivo cacert. O arquivo de saída contém apenas um dos 3 certs da cadeia.

Existe uma maneira de evitar incluir os atributos de saqueta na saída do comando pkcs12 ou uma maneira de ter a saída do comando x509 incluindo todos os certificados? Além disso, se executá-lo através de x509 é a solução mais simples, existe uma maneira de canalizar a saída de pkcs12 para x509 em vez de escrever o arquivo duas vezes?

    
por BryKKan 25.05.2017 / 17:32

1 resposta

18

A solução que eu 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>
    
por 20.09.2017 / 21:15