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

31

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 sin cifrar
  • un archivo de certificado de cliente
  • un archivo de certificado de CA (raíz y todo intermedio)

Esta es una tarea común que tengo que realizar, por lo que estoy buscando una manera de hacerlo sin ninguna edición manual de la salida.

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, encontré una solución sugerida para pasar los resultados a través de x509 para quitar los atributos de la bolsa.

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

Esto funciona, pero me encuentro con 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 forma 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 forma de canalizar la salida de pkcs12 a x509 en lugar de escribir el archivo dos veces?

BryKKan
fuente

Respuestas:

36

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>
BryKKan
fuente
¡Gracias! ¡Esto me ahorró algo de tiempo hoy! ;-)
Jim P.
¡Muchas gracias!
PaulJ