ssh-Server verfügen über einen Satz von Host-Keys, mit denen sich der Server gegenüber den Clients identifizieren kann. Nach dem ersten erfolgreichen Verbindungsaufbau legt der ssh-Client den Host-Key des Servers in der Datei ~/.ssh/knownhosts
ab. Bei einem erneuten Verbindungsaufbau vergleicht der ssh-Client den vom ssh-Server aktuell übermittelten ssh-Host-Key mit dem zugehörigen gespeicherten ssh-Host-Key und gibt bei einem abweichenden Key – je nach Konfiguration des ssh-Clients – eine Warnung aus oder bricht sogar den Verbindungsaufbau ab. Durch diese Prüfung können Man-in-the-Middle-Angriffe verbindet werden.
Damit dieser Mechanismus zuverlässig funktionieren kann, benötigt jeder ssh-Server einen eigenen Satz mit einmaligen ssh-Host-Keys.
Bei der Installation des Softwarepaketes mit dem ssh-Server wird üblicherweise ein neuer Satz mit einmaligen ssh-Host-Keys generiert.
Klont man hingegen einen bestehenden Server (z.B. Aufsetzen eines neuen Servers aus einem Backup oder Disk-Images eines bestehenden Servers, Kopieren einer virtuellen Maschine), dann „erbt“ der neue Server den Satz an ssh-Host-Keys. Sofern der neue Server den bisherigen Server ersetzt, ist dies unproblematisch. Sofern man einen neuen, zusätzlichen Server aufbaut, dann sollte dieser Server einen neuen Satz mit eigenen einmaligen ssh-Host-Key erhalten.
Zum Erneuern der ssh-Host-Keys löscht man auf dem Server zunächst die bestehenden Host-Keys und generiert einen Satz neue Keys1):
cd /etc/ssh sudo rm ssh_host_* sudo ssh-keygen -A
Sofern für den ssh-Server bereits der alte ssh-Host-Key auf einem Client gespeichert ist, kann die ~/.ssh/knownhosts
mit dem folgenden Befehl bereinigt werden:
ssh-keygen -R remote-server-name
Alternativ kann in der ~/.ssh/knownhosts
der Eintrag auch mit einem Texteditor entfernt werden2).
Beim ssh-Client Blink (iOS) funktionieren die obigen beiden Lösungen nicht. Hier ist der folgende Workaround notwendig:
In das Verzeichnis .ssh
wechseln:
cd ~/.ssh
Inhalt der Datei known_hosts
mit Zeilennummern anzeigen:
cat -n known_hosts
Entsprechende Zeile merken und mit sed
löschen (im Beispiel Zeile 99):
sed -i.bak '99d' known_hosts
dpkg-reconfigure openssh-server
verwendet, der das Software-Paket für den OpenSSH-Server neu konfiguriert. Es sollte jedoch ein ssh-keygen -A
ausreichen, der den Satz ssh-Host-Keys um die fehlenden Typen ergänzt.