Was genau sendet ssh bei der Schlüsselverhandlung?

10

Wenn Sie die Identitätsdatei explizit für ssh angeben:

ssh -i ./id_rsa ...

Ich habe diese Zeilen in ssh Debug Trace:

debug1: Offering public key: ./id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply

Bedeutet dies, dass ssh-generate auch id_rsaeinen öffentlichen RSA-Exponenten enthält? id_rsaDas Format scheint ziemlich explizit zu sein, da es einen privaten Schlüssel mit dem Block "BEGIN PRIVATE KEY" enthält. "Öffentlicher Schlüssel anbieten" muss also etwas anderes bedeuten als "Senden des öffentlichen Schlüssels an den Server".

BEARBEITEN:

Zur Verdeutlichung möchte ich wissen, was genau hinter der Zeile "Öffentlicher Schlüssel anbieten" vor sich geht. Wenn der Client mehrere Schlüssel besitzt, werden alle dem Server einzeln angeboten.

Alex B.
quelle
Um dieses Problem zu beheben, gibt es eine Methode, mit der der Server prüfen kann, ob wir vor der Herausforderung einen guten Schlüssel erhalten haben. Weil ich bereits einen Server hatte, der unseren Schlüssel abgelehnt hat, bevor ich ihn überhaupt entschlüsselt habe. Der Fehler war dort wegen des Namens nicht gut angegeben.
Gopoi

Antworten:

12

Um eine Verbindung zu einem SSH-Server herzustellen und sich bei Ihrem öffentlichen / privaten Schlüsselpaar zu authentifizieren, müssen Sie zuerst Ihren öffentlichen Schlüssel für den Server freigeben.

dies durch Kopieren des öffentlichen Schlüssels für den privaten Schlüssel auf den Server durchgeführt wird, und das Hinzufügen sie ~/ssh/authorized_keysentweder durch Kopieren / Einfügen, Kopieren , id_rsa.pubum ~/.ssh/authorized_keysauf dem Server oder mit cat id_rsa.pub >> ~/.ssh/authorized_keys, um es in die Liste angehängt wird .

Wenn Sie eine Verbindung herstellen, verwendet der Server Ihren öffentlichen Schlüssel, um eine Herausforderung zu signieren, und Ihr Client verwendet Ihren privaten Schlüssel id_rsa, um die Herausforderung zu entschlüsseln, sie erneut mit der öffentlichen des Servers zu verschlüsseln host keyund sie zurückzusenden.

Der Host überprüft, ob Sie die Herausforderung ordnungsgemäß entschlüsselt haben, indem Sie Ihre Antwort mit dem privaten Schlüssel entschlüsseln. Der Client / Host stellt eine verschlüsselte Verbindung her, die auf den gemeinsam genutzten Daten und nicht auf Ihren öffentlichen / privaten Schlüsseln basiert.

Bei NO POINT in der Vermittlungsstelle wird Ihr privater Schlüssel oder der private Schlüssel des Hosts ausgetauscht oder einander mitgeteilt. Ihr öffentlicher Schlüssel wird auf dem Server gespeichert, aber deshalb handelt es sich um einen öffentlichen Schlüssel.

cpbills
quelle
Ja, das ist alles gut und gut, aber dies alles geschieht, bevor der Server den öffentlichen Schlüssel identifiziert hat, mit dem die Herausforderung verschlüsselt werden soll. Ich habe mehrere Schlüssel und alle werden dem Server einzeln "angeboten". Was genau bedeutet das? Und ja, mir ist klar, dass der private Schlüssel nicht wirklich gesendet wird. Ich sollte diese Zeile wahrscheinlich ganz aus der Frage entfernen. : P
Alex B
Wenn Sie angeben ssh -i keyname, teilen Sie Ihrem SSH-Client genau mit, mit welchem ​​Schlüssel Sie eine Verbindung zum Server herstellen möchten. Wenn Sie ein Dutzend Schlüssel in ~/.ssh/Ihrem Client haben, wird NICHT jeder Schlüssel durchlaufen. Es wird nach möglicherweise ein paar anderen Dateinamen suchen ~/.ssh/id_rsa, ~/.ssh/id_dsadie im Client codiert sind, oder nach dem Schlüssel, der für diesen Host in ~/.ssh/config... long story short angegeben ist. Ihr Client bietet dem Server keine Schlüssel an.
cpbills
Wenn Sie eine Verbindung herstellen, entschlüsselt Ihr / client / die Herausforderung vom Server und fällt dann in die Liste der standardisierten lokalen privaten Schlüssel, um die Herausforderung zu verschlüsseln und die Antwort zu senden. Wenn die Challenge-Antwort fehlschlägt, geht sie zum nächsten fest codierten Schlüsselnamen über, verschlüsselt sie erneut mit diesem privaten Schlüssel und versucht es erneut. Auch hier werden Ihre öffentlichen und privaten Schlüssel bei der Anmeldeauthentifizierung nicht mit dem Server geteilt.
cpbills
1
Oh, ich habe deinen Kommentar noch einmal gelesen. Host: verschlüsselt Herausforderung mit Host-Schlüssel, Client: entschlüsselt Herausforderung mit Host-Pub-Schlüssel, Client: verschlüsselt Herausforderung mit privatem Schlüssel, Host: Versuche, Herausforderung mit allen aufgelisteten öffentlichen Schlüsseln im ~/.ssh/authorized_keysHost zu entschlüsseln, weiß, was die Herausforderung ist und wie sie aussieht Sobald ein öffentlicher Schlüssel ihn entsperrt, kann er diesen Schlüssel verwenden.
cpbills
@cpbills, tut mir leid, ich habe vergessen zu erwähnen, dass ich einige Schlüssel von einem weitergeleiteten Agenten habe, daher werden mehrere Schlüssel angeboten (-vvv log zeigt alle angebotenen an, obwohl ich die Identitätsdatei angegeben habe).
Alex B
1

Die Kryptographie mit öffentlichen / privaten Schlüsseln basiert auf einem sehr einfachen System:

Sie haben einen öffentlichen Schlüssel, one-way Lage ist , die Verschlüsselung zu tun, und einen privaten Schlüssel, der Lage ist de Verschlüsselungs-. Der öffentliche Schlüssel kann dann jedem auf der Welt gegeben werden, und niemand kann Ihre verschlüsselten Daten entschlüsseln, obwohl er Daten verschlüsseln kann, die Sie mit Ihrem privaten Schlüssel entschlüsseln können.

Die Antwort auf Ihre Frage lautet also "Ihr öffentlicher Schlüssel".

Satanicpuppy
quelle
Ja, danke, ich weiß im Detail, wie Krypto mit öffentlichen Schlüsseln funktioniert, aber ich möchte die Besonderheiten des SSH-Protokolls und des Schlüsselformats kennen. Ich bin daran interessiert zu wissen, ob der öffentliche Exponent in der privaten Schlüsseldatei gespeichert ist oder nicht. Nach allem, was ich weiß, kann "öffentlichen Schlüssel anbieten" auch das Signieren einer Nonce mit Ihrem privaten Schlüssel bedeuten, damit der Server einen entsprechenden öffentlichen Schlüssel finden kann.
Alex B
Ja. ssh-keygen -y gibt Ihnen den öffentlichen Schlüssel des privaten Schlüssels, das Gegenteil funktioniert nicht
Mâtt Frëëman
1

Ich denke nicht, dass es zu diesem Zeitpunkt tatsächlich den öffentlichen oder privaten Schlüssel senden sollte. Der Client sollte eine Verschlüsselung mit dem privaten Schlüssel für Klartext durchführen, der dem Server bereits bekannt ist. Der Host kann diese Nachricht mit dem öffentlichen Schlüssel entschlüsseln, da er weiß, dass der einzige, der sie ordnungsgemäß hätte verschlüsseln können, ein Client ist, der den entsprechenden privaten Schlüssel enthält, wodurch der Client authentifiziert wird.

Ich glaube, es heißt, Offering public key: ./id_rsaweil es den privaten Schlüssel (gespeichert in ./id_rsa) verwendet, um eine Verschlüsselung für den dem Server bekannten Klartext durchzuführen, und dann wird der Server den öffentlichen Schlüssel verwenden, um diesen Chiffretext zu entschlüsseln und zu bestätigen, dass er mit dem Klartext übereinstimmt. Die öffentliche Schlüsseldatei ./id_rsa.pubsollte vom Client nach der ersten Schlüsselgenerierung niemals benötigt werden. Dies wird vom Server nur zur Entschlüsselung verwendet.

Trey Hunner
quelle
Ich hatte den Verdacht, dass so etwas passiert, aber ich wollte einige Einzelheiten (dh das tatsächliche SSH-Schlüsselverhandlungsprotokoll). Ich bin mir nicht sicher, warum du herabgestimmt wurdest.
Alex B
Tut mir leid, meine Antwort war so handgewellt. Ich bin nicht mit den Besonderheiten der SSH-Schlüsselverhandlung vertraut, sondern nur mit den allgemeinen Verhandlungen, die für die Authentifizierung mit öffentlichen Schlüsseln erforderlich sind. Ich könnte für die unspezifische Antwort abgelehnt worden sein.
Trey Hunner