Di solito, le persone consigliano di usare una singola coppia di chiavi privata-pubblica ovunque (se non stiamo parlando di una possibilità di compromettere la chiave privata):
- Best Practice:" Una chiave ssh per utente "o" più chiavi ssh per host "
- Riutilizzo di chiavi private / pubbliche
-
Sembra che ciò comporterebbe una vulnerabilità quando si utilizza l'autenticazione del certificato client su SSH. Poiché è così popolare da suggerire, sospetto che l'algoritmo sottostante non funzioni. Ma non capisco esattamente cosa c'è che non va.
Ho cercato di rendere la mia descrizione il più dettagliata possibile, per ridurre al minimo possibili discrepanze, quindi, per favore, scusami per la lunghezza ...
Presupposti
- PC1 ha entrambi i fingerprint ( S1_id_rsa.pub e S2_id_rsa.pub ) nei suoi host conosciuti.
- Server1 conosce in qualche modo l'esistenza dell'account PC1 su Server2 .
- Chiavi:
- PC1 : ha P1_id_rsa , S1_id_rsa.pub , S2_id_rsa.pub .
- Server1 , l'utente malintenzionato: ha S1_id_rsa , P1_id_rsa.pub , S2_id_rsa.pub .
- Server2 : ha S2_id_rsa , P1_id_rsa.pub
Algoritmo
Questo è qualcosa come un noto attacco man-in-the-middle , ma un po 'diverso.
- PC1 invia "Ciao" a Server1
- Server1 invia "Ciao" a Server2
-
Il server condivide la sua chiave pubblica
- Server2 invia Server1 S2_id_rsa.pub
- Server1 invia PC1 S1_id_rsa.pub (anziché S2_id_rsa.pub )
- PC1 accetta l'impronta di S1_id_rsa.pub (come è noto)
-
Vengono creati due tunnel segreti condivisi separati utilizzando Diffie-Hellman :
-
"Server1 - Server2"
- Server2 genera DH1.a e invia DH1.A, firmato con S2_id_rsa , a Server1
- Server1 genera DH1.b e invia DH1.B a Server2
- Tunnel stabilito
- "PC1 - Server1"
- Server1 genera DH2.a e invia DH1.A, firmato con S1_id_rsa , a PC1
- PC1 genera DH2.b e invia DH2.B a Server1
- Il tunnel è stabilito.
-
-
Autenticazione client ( Server2 ora vuole essere sicuro che stia parlando con PC1 )
- PC1 invia P1_id_rsa.pub a Server1
- Server1 invia P1_id_rsa.pub a Server2
- Server2 genera una sfida, che può essere risolta solo con P1_id_rsa e la invia a Server1
- Server1 solo i tunnel sfidano a PC1
- PC1 risolve la sfida e invia risposta a Server1
- I tunnel Server1 rispondono a Server2
- Fatto.
- Fatto
P.S. Ho esaminato crittografia a chiave pubblica e attacco man-in-the-middle su Wikipedia e questa risposta abbastanza dettagliata (la mia visione dell'intero processo è ampiamente basata su di esso), ma non ho trovato la risposta ..
Non sono riuscito a trovare un "completo ssh di autenticazione e processi di crittografia per i manichini" leggibile ...
Ho già fatto la stessa domanda su Server Fault, ma è stato suggerito per ripubblicarlo qui.