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

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

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

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

Esta é uma tarefa comum que tenho que realizar, 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 bag, que o aplicativo não sabe como manipular.

Depois de algumas pesquisas, encontrei uma solução sugerida de passar os resultados por x509 para remover os atributos da sacola.

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

Isso funciona, mas me deparei com um problema no arquivo cacert. O arquivo de saída contém apenas um dos 3 certificados da 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 por meio de x509 for a solução mais simples, existe uma maneira de canalizar a saída de pkcs12 para x509 em vez de gravar o arquivo duas vezes?

Responder1

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>

Responder2

Outra solução sem sed:

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

Responder3

Linha única com awk:

openssl pkcs12 -in key.pfx -nodes -out - | awk '/-----BEGIN/{a=1}/-----END/{print;a=0}a'

Isso descarta toda a saída que não esteja entre as linhas inicial e final do PEM. O crédito do AWK vai parahttps://stackoverflow.com/q/17988756#comment29487454_17988834

Responder4

Apenas tentei usar o

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | openssl x509 -out <cacerts.cer>

para exportar a cadeia em formato simples, sem os cabeçalhos de cada item da cadeia. Neste servidor Windows NT, exportei apenas o primeiro item da cadeia, e não os dois itens que esperava. Em vez disso, acabei usando

openssl pkcs12 -in <filename.pfx> -cacerts -chain -nokeys -nodes -out <cacerts.cer>

e editando os arquivos com o Bloco de Notas para remover o texto indesejado. Deselegante? Sim, mas obteve o resultado necessário.

informação relacionada