Cómo exportar la cadena de certificados de CA desde PFX en formato PEM sin atributos de bolsa

Cómo exportar la cadena de certificados de CA desde PFX en formato PEM sin atributos de bolsa

Tengo un archivo PKCS12 que contiene la cadena de certificados completa y la clave privada. Necesito dividirlo en 3 archivos para una aplicación. Los 3 archivos que necesito son los siguientes (en formato PEM):

  • un archivo de clave no cifrado
  • un archivo de certificado de cliente
  • un archivo de certificado de CA (raíz y todos los intermedios)

Esta es una tarea común que tengo que realizar, por lo que estoy buscando una manera de hacerlo sin necesidad de editar manualmente el resultado.

Intenté lo siguiente:

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>

Esto funciona bien, sin embargo, la salida contiene atributos de bolsa, que la aplicación no sabe cómo manejar.

Después de buscar un poco, encontré una solución sugerida para pasar los resultados a través de x509 para eliminar los atributos de la bolsa.

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

Esto funciona, pero tengo un problema en el archivo cacert. El archivo de salida solo contiene uno de los 3 certificados de la cadena.

¿Hay alguna manera de evitar incluir los atributos de la bolsa en la salida del comando pkcs12, o una manera de que la salida del comando x509 incluya todos los certificados? Además, si ejecutarlo a través de x509 es la solución más simple, ¿hay alguna manera de canalizar la salida de pkcs12 a x509 en lugar de escribir el archivo dos veces?

Respuesta1

La solución a la que finalmente llegué fue canalizarlo a través de 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>

Respuesta2

Otra solución sin 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>

Respuesta3

Línea única con awk:

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

Esto descarta todos los resultados que no estén entre las líneas inicial y final de PEM. El crédito por el AWK es parahttps://stackoverflow.com/q/17988756#comment29487454_17988834

Respuesta4

Intenté usar el

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

para exportar la cadena en formato plano sin los encabezados de cada elemento de la cadena. En este servidor Windows NT, sólo exporté el primer elemento de la cadena, no los dos elementos que esperaba. En cambio, terminé usando

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

y editar los archivos con el Bloc de notas para eliminar el texto no deseado. ¿Poco elegante? Sí, pero obtuvo el resultado necesario.

información relacionada