Conversión de certificado PKCS # 12 en PEM usando OpenSSL

212

Tengo OpenSSL x64 en Windows 7 que descargué de openssl-for-windows en Google Code . Estoy intentando correr:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" 

pero me sale un error

unable to load private key

¿Cómo extraigo el certificado en PEM de la tienda PKCS # 12 usando OpenSSL?

Dean MacGregor
fuente
@jww Creo que dado que esta pregunta tiene más de 3 años, es un poco tarde para señalar la bandera fuera de tema.
Dean MacGregor
Solo una formalidad para que la gente sepa que está fuera de tema. La gente hace las mismas preguntas fuera del tema y cita esta pregunta. Si a la gente no se le dice que está fuera de tema, entonces continuarán preguntando en Stack Overflow.
JWW
2
@jww, la respuesta más votada en la meta pregunta que vincula dice "Deben permitirse las preguntas DevOps en Stack Overflow". Voy a votar a favor, porque la respuesta satisfizo mis necesidades (aunque, para mí, no estaba programando, podría incorporar fácilmente la respuesta en un programa si lo deseara)
descorchar

Respuestas:

534

Tratar:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys
openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes

Después de eso tienes:

  • certificado en newfile.crt.pem
  • clave privada en newfile.key.pem

Para colocar el certificado y la clave en el mismo archivo, use lo siguiente

openssl pkcs12 -in path.p12 -out newfile.pem

Si necesita ingresar la contraseña PKCS # 12 directamente desde la línea de comando (por ejemplo, un script), simplemente agregue -passin pass:${PASSWORD}:

openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys -passin 'pass:P@s5w0rD'
kmx
fuente
2
¿Es posible que la clave privada y el certificado se almacenen en el mismo archivo * .pem?
Ramis
18
sí, es:openssl pkcs12 -in path.p12 -out newfile.pem
Gee-Bee
2
pidiendo Importar contraseña. que es eso ?
Saurabh Chandra Patel
44
@SaurabhChandraPatel debe conocer la contraseña de su certificado. Este no es un medio para recuperar una contraseña olvidada
Dean MacGregor
2
omitiendo -nodes, la clave privada no se extrae.
Meixner
22

Solo necesita proporcionar una contraseña. Puede hacerlo dentro de la misma línea de comando con la siguiente sintaxis:

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password]

Luego se le pedirá una contraseña para cifrar la clave privada en su archivo de salida. Incluya la opción "nodos" en la línea anterior si desea exportar la clave privada sin cifrar (texto sin formato):

openssl pkcs12 -export -in "path.p12" -out "newfile.pem" -passin pass:[password] -nodes

Más información: http://www.openssl.org/docs/apps/pkcs12.html

Colin
fuente
16

Si puede usar Python, es aún más fácil si tiene el pyopensslmódulo. Aquí está:

from OpenSSL import crypto

# May require "" for empty password depending on version

with open("push.p12", "rb") as file:
    p12 = crypto.load_pkcs12(file.read(), "my_passphrase")

# PEM formatted private key
print crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey())

# PEM formatted certificate
print crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate())
KVISH
fuente
¿Hay alguna razón para abrir el archivo usando filey no open? Solo quiero entenderlo, ya que lo
usaré
No, no hay diferencia. Solo puedes hacer open("push.p12", 'rb').read().
KVISH
2
Si usa Python 3, probablemente querrá escribir el contenido en los archivos: with open("push.pem", "wb") as fobj: fobj.write(crypto.dump_certificate(crypto.FILETYPE_PEM, p12.get_certificate()))para escribir el certificado y with open("push.key", "wb") as fobj: fobj.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, p12.get_privatekey()))la clave.
Adam Parkin
Estoy usando Python 3.7, cuando ejecuto el ejemplo anterior, obtengo lo siguiente: "TypeError: el inicializador para ctype 'char' debe ser un bytes de longitud 1, no str" ¿Hay algún problema con mi contraseña
Getaglow
¿Por qué es "aún más fácil" crear un archivo, ingresar el código, guardarlo y ejecutarlo, en lugar de simplemente ejecutar un solo comando?
Torben Gundtofte-Bruun
3

Tenía un archivo PFX y necesitaba crear un archivo KEY para NGINX, así que hice esto:

openssl pkcs12 -in file.pfx -out file.key -nocerts -nodes

Luego tuve que editar el archivo KEY y eliminar todo el contenido hasta -----BEGIN PRIVATE KEY-----. Después de eso, NGINX aceptó el archivo KEY.

KTCO
fuente
0

Si necesita un archivo PEM sin contraseña, puede usar esta solución.

Simplemente copie y pegue la clave privada y el certificado en el mismo archivo y guárdelo como .pem.

El archivo se verá así:

-----BEGIN PRIVATE KEY-----
............................
............................
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...........................
...........................
-----END CERTIFICATE-----

Esa es la única forma en que encontré cargar certificados a dispositivos Cisco para HTTPS.

yeya
fuente