Extraiga la clave pública / privada del archivo PKCS12 para su uso posterior en SSH-PK-Authentication

194

Quiero extraer la clave pública y privada de mi PKCS#12archivo para su uso posterior en SSH-Public-Key-Authentication.

En este momento, estoy generando claves a través de ssh-keygen que puse .ssh/authorized_key, respectivamente, en algún lugar del lado del cliente.

En el futuro, quiero usar las claves de un PKCS#12contenedor, así que primero tengo que extraer la clave pública PKCS#12y luego ponerla en el .ssh/authorized_keysarchivo. ¿Hay alguna posibilidad de que esto funcione openssl? ¿Son PKCS#12compatibles las claves para la autenticación de clave pública ssh?

lazydaemon
fuente

Respuestas:

283

Puede usar los siguientes comandos para extraer la clave pública / privada de un contenedor PKCS # 12:

  • PKCS # 1 Clave privada

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Certificados:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    
Nilesh
fuente
77
los comandos funcionan, pero la clave privada se exporta como formato PKCS1 y necesito PKCS8 ... ¿Hay alguna opción que me falte para obtener esto? Por ejemplo, exporta '----- BEGIN RSA PRIVATE KEY -----' pero necesito '----- BEGIN PRIVATE KEY -----'
edthethird
44
Para hacer eso, puedes intentarloopenssl rsa -in privateKey.pem -out private.pem
Francois
27
@edthethird: Para obtener PKCS8, agregue la bandera -nodes
Christopher K.
77
Para exportar sin contraseña, agregue -passout pass:. Espera que el parámetro esté en el formulario pass: mypassword. stackoverflow.com/a/27497899/206277
nidheeshdas
2
@ChristopherK. ¡Gracias! Esa fue la buena para mí. agregar -nodesexporta la clave correctamente
TecHunter
85

Esto es posible con un poco de conversión de formato.

Para extraer la clave privada en un formato, openssh puede usar:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Para convertir la clave privada en una clave pública:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Para extraer la clave pública en un formato, openssh puede usar:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8
ryanc
fuente
2
¡Gracias! La primera línea era la que necesitaba. Solo la clave, sin cifrar, para que pueda instalarse a través de la mayoría de los sistemas automatizados de CDN.
BTC
1
@PhilipRego Creo que tienes las claves públicas y privadas confundidas. Una clave pública RSA tiene dos valores, 'e' el exponente público y 'n' el módulo, los cuales se almacenan junto a las partes privadas de la clave.
ryanc
17

OpenSSH no puede usar archivos PKCS # 12 listos para usar. Como otros sugirieron, debe extraer la clave privada en formato PEM que lo lleva de la tierra de OpenSSL a OpenSSH. Otras soluciones mencionadas aquí no funcionan para mí. Uso OS X 10.9 Mavericks (10.9.3 en este momento) con utilidades "preempaquetadas" (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Primero, extraiga una clave privada en formato PEM que OpenSSH utilizará directamente:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Sugiero encriptar la clave privada con contraseña:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Obviamente, escribir una contraseña de texto sin formato en la línea de comandos tampoco es seguro, por lo que debe eliminar el último comando del historial o simplemente asegurarse de que no llegue allí. Las diferentes conchas tienen diferentes formas. Puede anteponer su comando con espacio para evitar que se guarde en el historial en Bash y muchos otros shells. Aquí también se explica cómo eliminar el comando del historial en Bash:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Alternativamente, puede usar una forma diferente de pasar una contraseña de clave privada a OpenSSL; consulte la documentación de OpenSSL para ver los argumentos de las frases de paso .

Luego, cree una clave pública OpenSSH que se pueda agregar al archivo autorizado_claves:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
frzng
fuente
¿Para qué son las | openssl rsacosas?
Snekse
1
@Snekse se asegura de que solo haya una clave privada en la salida. En mi caso, crea un archivo de identidad ( ~/.ssh/id_rsa) con algunos "cruft" como Bag Attributes sin `| openssl rsa`. Supongo que OpenSSH y otras utilidades que usan un archivo de identidad pueden manejar ese problema (no lo he probado), pero simplemente estoy acostumbrado a proporcionar solo los datos necesarios y nada más, especialmente si se trata de seguridad.
desde el
1
Esta respuesta me funcionó para obtener acceso a la clave privada en formato PEM en la terminal, que pude copiar / pegar: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus
7

Solución 1:

Extraer P12 de jks

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

Extraiga PEM de P12 y edite el archivo y pem del archivo crt

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Extraer clave de jks

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Solución 2:

Extraer PEM y encriptadoPrivateKey al archivo txt ''

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

Descifrar privateKey

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key
Ali Alimohammadi
fuente
1
Al responder preguntas, ayuda a resaltar cuáles son los comandos. Puede hacerlo agregando tres comillas inversas antes y después del comando para que se convierta `` echo hello`` echo hello.
PatS
2

Actualización: Noté que mi respuesta era solo un pobre duplicado de una pregunta bien explicada en https: //unix.stackexchange.com / ... por BryKKan

Aquí hay un extracto de ella:

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>
gvlax
fuente
3
Agregar alguna explicación haría que esta respuesta sea más útil.
mx0
0

Hasta donde sé, PKCS # 12 es solo un almacén de claves de certificado / público / privado. Si extrajo una clave pública del archivo PKCS # 12, OpenSSH debería poder usarla siempre que se extrajera en formato PEM . Probablemente ya sepa que también necesita una clave privada correspondiente (también en PEM ) para usarla para la autenticación de clave pública ssh.

sirgeorge
fuente
0

La respuesta aceptada es el comando correcto, solo quiero agregar una cosa adicional, cuando extraiga la clave si deja la contraseña PEM ( "Enter PEM pass phrase:") en blanco, no se extraerá la clave completa, sino solo la localKeyIDextraída. Para obtener la clave completa, debe especificar una contraseña PEM cuando ejecute el siguiente comando.

Tenga en cuenta que cuando se trata de Importar contraseña, puede especificar la contraseña real "Enter Import Password:"o puede dejar esta contraseña en blanco:

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
Arvind Sachdeva
fuente
1
Eso debería ser un comentario a la respuesta aceptada, no la respuesta.
Styx