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.