I nomi dei formati di chiavi pubbliche OpenSSH vs OpenSSL non corrispondono?

2

Ho generato una coppia di chiavi con OpenSSH e successivamente ho voluto generare una chiave pubblica codificata PEM. Ho notato che la chiave pubblica generata è diversa se generata da OpenSSH rispetto a OpenSSL quando si utilizza lo stesso nome di formato (PEM) ... Dopo alcuni test (vedi sotto), ho scoperto che le chiavi pubbliche sono stesse solo quando generate a) come PKCS8 in OpenSSH eb) come PEM in OpenSSL

  1. Perché l'output PEM di OpenSSH è diverso dal formato PEM di OpenSSL?
  2. Se questo è solo un errore di denominazione dei parametri, lo sono corretto nel mio presupposto che per ottenere la stessa chiave pubblica, devo utilizzare PCKS8 in OpenSSH e PEM in OpenSSL?

Ecco il mio test:

# -----------------------------------------------------------------------------
# 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
    
posta zam6ak 23.06.2015 - 19:39
fonte

1 risposta

1

Un piccolo passo:

$ 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

La pagina man di openssl chiama uno il formato PEM e l'altro il formato RSAPublicKey.

Quale ssh-keygen chiama PKCS8 e openssl rsa chiama PEM è un wrapper attorno a ciò che ssh-keygen chiama PEM, che aggiunge un ASN.1 OID per" rsaEncryption ". L'ultimo esempio analizza la DER bittring che inizia con l'offset 19 per convincerci che sono gli stessi dati esatti.

Il formato è descritto in PKCS # 1 .

PKCS # 8 è qui e parla della memorizzazione di chiavi private, non di chiavi pubbliche.

Non posso fare a meno di rispondere a quale sia il nome più corretto per ciascuno dei due formati, anche se li chiamerei con la stringa ASCII nell'intestazione.

Mi piace il formato che codifica il fatto che sia una chiave pubblica RSA al suo interno, e quindi non richiede la codifica esterna (come il prefisso "ssh-rsa" usato in ~/.ssh/authorized_keys ), anche se è un po ' più grande. Utilizzando un formato auto descrittivo, un programma può imparare a leggere le chiavi ECDSA e EdDSA senza inventare un nuovo modo per specificare che i dati sono una chiave pubblica ma non una chiave pubblica RSA.

    
risposta data 07.07.2015 - 01:20
fonte

Leggi altre domande sui tag