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

Deseo extraer la clave pública y privada de mi archivo PKCS # 12 para usarla posteriormente en SSH-Public-Key-Authentication.

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

En el futuro, quiero usar las claves de un contenedor PKCS # 12, así que primero tengo que extraer la clave pública de PKCS # 12 y luego ponerlas en .ssh / authorized_keys -file. ¿Hay alguna posibilidad de hacer que esto funcione a través de openssl? ¿Las teclas en PKCS # 12 son compatibles para la autenticación con clave pública ssh?

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 

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 a 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 

OpenSSH no puede usar archivos PKCS # 12 de fábrica. Como otros sugirieron, debe extraer la clave privada en formato PEM que lo lleva desde el terreno de OpenSSL a OpenSSH. Otras soluciones mencionadas aquí no funcionan para mí. Uso OS X 10.9 Mavericks (10.9.3 por el momento) con utilidades “preempacadas” (OpenSSL 0.9.8y, OpenSSH 6.2p2).

Primero, extraiga una clave privada en formato PEM que será utilizada directamente por OpenSSH:

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

Recomiendo encarecidamente encriptar la clave privada con contraseña:

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

Obviamente, tampoco es seguro escribir una contraseña de texto sin formato en la línea de comandos, por lo que debe eliminar el último comando del historial o simplemente hacer que no llegue allí. Diferentes proyectiles tienen diferentes formas. Puede poner un prefijo en 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 la frase de contraseña.

A continuación, cree una clave pública de OpenSSH que se puede agregar al archivo authorized_keys:

 ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub 

Solución 1:

Extracto P12 de jks

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

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

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

Extrae la clave de jks

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

Solución 2:

Extraiga PEM y encryptedPrivateKey para txt file“`

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

Descifrar privateKey

 openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key 

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