Conversión de claves entre openssl y openssh

45

Si uso lo siguiente

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes

Obtengo private.pem y public.pem

Si uso

ssh-keygen -t rsa -f rsa

Obtengo rsa y rsa.pub

¿Es posible convertir del formato de rsa a private.pem y viceversa?

Editar: para ser más específico,

a) Si tengo el comando private.pem y public.pem generado por el comando anterior, ¿cómo obtengo la clave privada y la clave pública rsa equivalente?

b) Dados los rsa y rsa.pub , ¿cómo obtengo las claves x509 si conozco los metadatos adicionales que toma el comando openssl anterior?

Si paso del formato openssh a x509 y vuelvo, lo ideal sería recuperar la misma clave.

    
pregunta anshul 18.03.2013 - 13:07
fuente

6 respuestas

32

Te estás perdiendo un poco aquí.

ssh-keygen se puede usar para convertir claves públicas de formatos SSH a formatos PEM adecuados para OpenSSL. Las claves privadas normalmente ya están almacenadas en un formato PEM adecuado para ambas.

Sin embargo, el comando OpenSSL que muestra genera un certificado autofirmado . Este certificado no es algo que OpenSSH usa tradicionalmente para nada, y definitivamente no es lo mismo que una clave pública solamente.

OpenSSH también tiene soporte para certificados, pero es probable que no estés usando este soporte. Además, estos certificados no son X.509, por lo que son incompatibles con OpenSSL.

El certificado contiene información que no está presente en ningún otro lugar y cada certificado es único y no se puede volver a crear a voluntad. Esto significa que necesita almacenar el certificado X.509, además de la clave privada, si desea usar la misma clave tanto para OpenSSL como para OpenSSH.

Si solo desea compartir la clave privada, la clave OpenSSL generada por su comando de ejemplo se almacena en private.pem , y ya debería estar en formato PEM compatible con OpenSSH (reciente). Para extraer una clave pública compatible con OpenSSH, simplemente puede ejecutar:

ssh-keygen -f private.pem -y > private.pub

Si desea comenzar desde OpenSSH y avanzar hacia el lado de OpenSSL, con un certificado autofirmado (por cualquier motivo), a continuación le indicamos cómo:

$ ssh-keygen -f test-user
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in test-user.
Your public key has been saved in test-user.pub.
The key fingerprint is:
ff:36:f1:74:c7:0d:4e:da:79:5c:96:27:2c:2c:4e:b6 naked@tink
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|           . .  .|
|          + o =.+|
|        S+ o * B+|
|         .E o = B|
|          .  + o.|
|           .o .  |
|           ...   |
+-----------------+
$ openssl req -x509 -days 365 -new -key test-user -out test-user-cert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
$ ls -l test-user*
-rw------- 1 naked naked 1675 Mar 18 21:52 test-user
-rw-r--r-- 1 naked naked 1229 Mar 18 21:53 test-user-cert.pem
-rw-r--r-- 1 naked naked  392 Mar 18 21:52 test-user.pub

De estos, los archivos test-user y test-user-cert.pem son fundamentales para preservar, donde siempre se puede recrear test-user.pub desde el usuario de prueba según sea necesario.

    
respondido por el Nakedible 18.03.2013 - 13:53
fuente
32

La herramienta ssh-keygen de openssh puede hacer esto por usted.

El siguiente comando convertirá el archivo .pub en el formato pem para usted.

ssh-keygen -f rsa.pub -e -m pem

ssh-keygen también admite la conversión a otros formatos. Para obtener más información, consulte man página.

    
respondido por el Ayrx 18.03.2013 - 13:12
fuente
5

Las versiones más recientes de OpenSSL (> = 1.0.1 al menos) utilizan el formato PKCS # 8 para las claves.

Por lo tanto, si extrae la clave de publicación del certificado mediante el comando

openssl x509 -in certificate.pem -noout -pubkey >pubkey.pem

Debe usar el siguiente comando para convertirlo en la entrada authorized_keys

ssh-keygen -i -m PKCS8 -f pubkey.pem
La opción

-out del comando req de OpenSSL produce una solicitud de certificado en lugar de una clave pública.

Para extraer una clave pública en el formato PKCS # 8, comprensible por la función de importación de ssh-keygen use el siguiente comando.

openssl req -in public.pem -noout -pubkey
    
respondido por el Victor Wagner 02.07.2015 - 12:04
fuente
3

Una clave RSA pública de 2048 bits se puede convertir del formato PEM X.509 al formato OpenSSH con los siguientes comandos (consulte respuesta ). No sería difícil escribir la conversión en la otra dirección dada la información de la respuesta vinculada.

echo -n "ssh-rsa " > rsa2048.pub
grep -v -- ----- rsa2048.pem | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> rsa2048.pub
echo >> rsa2048.pub
    
respondido por el mkalkov 22.01.2014 - 19:11
fuente
1

Logré usar la herramienta de Windows puttygen.exe para esto:

Entonces:

  1. Cargue su clave privada en puttygen (respuesta de frase de contraseña)
  2. Una vez cargado, seleccione como en la imagen arriba Conversiones - > Exportar clave OpenSSH dale un nombre y debería funcionar, simplemente me funcionó.
respondido por el yonsk 10.10.2017 - 12:10
fuente
0

No pude encontrar una herramienta para el trabajo, así que me ensucié las manos y escribí algunas a mano leyendo el código fuente de OpenSSH y algunos de los depuradores de PEM / DER en línea.

Lo escribí para convertir entre PKCS8, PKCS1 (solo RSA), SEC1 (solo ECDSA) y el formato OpenSSH "propietario" para claves RSA de cualquier tamaño y ECDSA P-256 y P-384.

Instalar

Está escrito para node.js (y estoy trabajando para transferir eso al navegador), así que debes instalarlo primero:

Y luego:

npm install -g rasha eckles ssh-to-jwk jwk-to-ssh

Rasha es para RSA, Eckles es para ECDSA.

PEM a OpenSSH

RSA

rasha privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_rsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_rsa.pub

ECDSA

eckles privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_ecdsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_ecdsa.pub

OpenSSH to PEM

RSA

ssh-to-jwk id_rsa > privkey.jwk.json

rasha privkey.jwk.json > privkey.pem

rasha privkey.jwk.json public > pubkey.pem

ECDSA

ssh-to-jwk id_ecdsa > privkey.jwk.json

eckles privkey.jwk.json > privkey.pem

eckles privkey.jwk.json public > pubkey.pem
    
respondido por el CoolAJ86 12.12.2018 - 18:25
fuente

Lea otras preguntas en las etiquetas