¿Los nombres de los formatos de clave pública de OpenSSH vs OpenSSL no coinciden?

2

Generé un par de claves frente a OpenSSH y luego quise generar una clave pública codificada PEM. Noté que la clave pública generada difiere cuando se genera por OpenSSH frente a OpenSSL cuando se usa el mismo nombre de formato (PEM) ... Después de algunas pruebas (ver más abajo), encontré que las claves públicas son las mismas solo cuando se generan a) como PKCS8 en OpenSSH yb) como PEM en OpenSSL

  1. ¿Por qué la salida PEM de OpenSSH es diferente del formato PEM de ¿OpenSSL?
  2. Si esto es solo un parámetro que no concuerda, ¿lo soy? correcto en mi suposición de que para obtener la misma clave pública, tengo que usa PCKS8 en OpenSSH y PEM en OpenSSL?

Aquí está mi prueba:

# -----------------------------------------------------------------------------
# Using OpenSSH
# -----------------------------------------------------------------------------

# generate test key pair 
[root@localhost key-test]# ssh-keygen -t rsa -b 2048 -f test.ssh

#
# get MD5 fingerprint of generated public key 
#
[root@localhost key-test]# cat test.ssh.pub | openssl md5 -c        
(stdin)= 3e:b6:6f:95:d2:1d:ca:7a:f3:88:2e:3a:ca:c3:b7:a3

#
# get MD5 fingerprint of generated public keys (RFC4716, PEM, and PKCS8 formats)  
#

# header => ---- BEGIN SSH2 PUBLIC KEY ----
[root@localhost key-test]# ssh-keygen -y -e -m RFC4716 -f test | openssl md5 -c
(stdin)= 0d:da:5b:27:e9:cd:32:25:e5:c8:4e:2b:c2:0f:47:aa

# header => -----BEGIN RSA PUBLIC KEY-----
[root@localhost key-test]# ssh-keygen -y -e -m PEM -f test | openssl md5 -c       
(stdin)= c5:38:c0:41:f8:76:41:7b:49:03:42:c6:21:dd:1c:2f

# header => -----BEGIN PUBLIC KEY-----
[root@localhost key-test]# ssh-keygen -y -e -m PKCS8 -f test | openssl md5 -c  
(stdin)= 84:e8:54:5f:16:9f:92:48:67:99:54:65:13:ad:64:ad


# -----------------------------------------------------------------------------
# Using OpenSSL
# -----------------------------------------------------------------------------

#
# get MD5 fingerprint of the generated public key (PEM format)
#
# header => -----BEGIN PUBLIC KEY-----
[root@localhost key-test]# openssl rsa -in test -pubout -outform PEM | openssl md5 -c            
(stdin)= 84:e8:54:5f:16:9f:92:48:67:99:54:65:13:ad:64:ad
    
pregunta zam6ak 23.06.2015 - 19:39
fuente

1 respuesta

1

Un pequeño paso:

$ ssh-keygen -y -e -m PKCS8 -f /home/wolf/.ssh/id_rsa | openssl asn1parse
    0:d=0  hl=4 l= 290 cons: SEQUENCE          
    4:d=1  hl=2 l=  13 cons: SEQUENCE          
    6:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   17:d=2  hl=2 l=   0 prim: NULL              
   19:d=1  hl=4 l= 271 prim: BIT STRING        

$ openssl rsa -in /home/wolf/.ssh/id_rsa -pubout -outform PEM | openssl asn1parse
writing RSA key
    0:d=0  hl=4 l= 290 cons: SEQUENCE          
    4:d=1  hl=2 l=  13 cons: SEQUENCE          
    6:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   17:d=2  hl=2 l=   0 prim: NULL              
   19:d=1  hl=4 l= 271 prim: BIT STRING        

$ ssh-keygen -y -e -m PEM -f /home/wolf/.ssh/id_rsa | openssl asn1parse
    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim: INTEGER           :DEE24467850E0F877429474448807D2000B30E889BE6CA3BA8561B69D925F1C0AFA9A536A7EE95D077D5E5D6D3BA90C4C5E3B547B6872AD3F795816A54A7170EEB3454351424FD751EFA9A07F277C9F4987FCC94F9C06658D95567DD2A9E99AAF130BD86481AD34DA84DB1E91F1954043137E53816BA9AF49962E0BAC4B51FECBA45F4C20FC66F6AAAB910C576FD9AED5AE03BD77A2B9D51662DCF1725FEAD7263F29F170E8953FA3CE9C3E4B7A062F840C3273104946C266DC06AFAB2EF03DD8ABFCA0EF0B25AD9D07CFC9DADB35284FF6C0C9B73AD8E744B575AA833737DA8B1415615811E5FE95E6FA144B91A05B240DF20A29D12FD29AA9FF0A2E90F4973
  265:d=1  hl=2 l=   3 prim: INTEGER           :010001

$ openssl rsa -in /home/wolf/.ssh/id_rsa -RSAPublicKey_out -outform PEM | openssl asn1parse
writing RSA key
    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim: INTEGER           :DEE24467850E0F877429474448807D2000B30E889BE6CA3BA8561B69D925F1C0AFA9A536A7EE95D077D5E5D6D3BA90C4C5E3B547B6872AD3F795816A54A7170EEB3454351424FD751EFA9A07F277C9F4987FCC94F9C06658D95567DD2A9E99AAF130BD86481AD34DA84DB1E91F1954043137E53816BA9AF49962E0BAC4B51FECBA45F4C20FC66F6AAAB910C576FD9AED5AE03BD77A2B9D51662DCF1725FEAD7263F29F170E8953FA3CE9C3E4B7A062F840C3273104946C266DC06AFAB2EF03DD8ABFCA0EF0B25AD9D07CFC9DADB35284FF6C0C9B73AD8E744B575AA833737DA8B1415615811E5FE95E6FA144B91A05B240DF20A29D12FD29AA9FF0A2E90F4973
  265:d=1  hl=2 l=   3 prim: INTEGER           :010001

$ ssh-keygen -y -e -m PKCS8 -f /home/wolf/.ssh/id_rsa | tail -n +2 | head -n -1 | base64 -d | openssl asn1parse -inform DER -i -strparse 19
    0:d=0  hl=4 l= 266 cons:  SEQUENCE
    4:d=1  hl=4 l= 257 prim:  INTEGER           :DEE24467850E0F877429474448807D2000B30E889BE6CA3BA8561B69D925F1C0AFA9A536A7EE95D077D5E5D6D3BA90C4C5E3B547B6872AD3F795816A54A7170EEB3454351424FD751EFA9A07F277C9F4987FCC94F9C06658D95567DD2A9E99AAF130BD86481AD34DA84DB1E91F1954043137E53816BA9AF49962E0BAC4B51FECBA45F4C20FC66F6AAAB910C576FD9AED5AE03BD77A2B9D51662DCF1725FEAD7263F29F170E8953FA3CE9C3E4B7A062F840C3273104946C266DC06AFAB2EF03DD8ABFCA0EF0B25AD9D07CFC9DADB35284FF6C0C9B73AD8E744B575AA833737DA8B1415615811E5FE95E6FA144B91A05B240DF20A29D12FD29AA9FF0A2E90F4973
  265:d=1  hl=2 l=   3 prim:  INTEGER           :010001

El openssl página de manual llama a uno el formato PEM y el otro a RSAPublicKey.

Lo que ssh-keygen llama a PKCS8 y openssl rsa llama a PEM es un ajuste alrededor de lo que ssh-keygen llama a PEM, que agrega un ASN.1 OID para" rsaEncryption ". El último ejemplo analiza la cadena de bits DER que comienza en el desplazamiento 19 para convencernos de que son los mismos datos exactos.

El formato se describe en PKCS # 1 .

PKCS # 8 es aquí , y habla sobre el almacenamiento de claves privadas, no de claves públicas.

No puedo dejar de responder cuál es el nombre más correcto para cada uno de los dos formatos, aunque los llamaría por la cadena ASCII en el encabezado.

Me gusta el formato que codifica el hecho de que es una clave pública RSA en su interior, por lo que no requiere codificación externa (como el prefijo "ssh-rsa" usado en ~/.ssh/authorized_keys ), aunque es un poco más grande. Usando un formato de autodescripción, un programa puede aprender a leer las claves ECDSA y EdDSA sin inventar una nueva forma de especificar que los datos son una clave pública pero no una clave pública RSA.

    
respondido por el Z.T. 07.07.2015 - 01:20
fuente

Lea otras preguntas en las etiquetas