Aan mijn zijde gebeurt dit door iets wat ik beschouw als een ssh
bug van nieuwere (OpenSSH_7.9p1
en hoger) clients, wanneer het probeert een veiligere ecdsa
server sleutel te leren waar al een oudere rsa
type sleutel bekend is. Het presenteert dan deze misleidende boodschap!
Ik weet geen goede oplossing hiervoor, de enige workaround die ik vond is het verwijderen van alle “goede maar oude rsa
sleutels” zodat de client de “nieuwe veiligere ecdsa
sleutels” opnieuw kan leren. Dus:
De eerste stap is het verwijderen van alle goede oude RSA sleutels ( Waarschuwing! Dit verliest bescherming tegen MitM ):
De tweede stap is dan om alle host-sleutels opnieuw te leren, wat handmatig moet gebeuren door opnieuw verbinding te maken met elk IP met behulp van ssh
.
Hier is wat ik waarneem:
$ sftp test@136.243.197.100
Connected to test@136.243.197.100
sftp>
$ sftp test@valentin.hilbig.de
Connected to test@valentin.hilbig.de.
sftp>
Probeer nu verbinding te maken met een nieuw geïntroduceerde alias van dezelfde reeds bekende goede server:
$ sftp test@gcopy.net
Warning: the ECDSA host key for 'gcopy.net' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:44
Are you sure you want to continue connecting (yes/no)?
Bekijk het IP adres. Het is hetzelfde IP als hierboven! Het lijkt er dus op dat de (goede) sleutel van het (bekende) IP zichzelf ineens beledigt (dat is het niet, want de ssh
client mixt twee incompatibele sleutels, zie hieronder).
Nu proberen we het te repareren:
$ ssh-keygen -R 136.243.197.100
# Host 136.243.197.100 found: line 45
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Laten we het nog eens proberen:
$ sftp test@gcopy.net
Warning: Permanently added the ECDSA host key for IP address '136.243.197.100' to the list of known hosts.
Connected to test@gcopy.net.
$ sftp test@valentin.hilbig.de
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
Are you sure you want to continue connecting (yes/no)?
WTF? Wat is hier gebeurd? De nieuwe verse sleutel die we van de server hebben geleerd is weer mislukt? En het probleem is zelfs van kant gewisseld?!?
Nope, het is niet de sleutel, noch de server. Alles klopt!
Het is de ssh
-client die niet de juiste sleutel controleert! Entry 45
in known_hosts
draagt nu een sleutel van het type ecdsa-sha2-nistp256
terwijl de sleutel, die door de client van de server werd getrokken, van het type rsa-sha2-512
is (en dus niet kan overeenkomen met de andere sleutel!).
$ sftp -v test@valentin.hilbig.de
toont:
debug1: kex: host key algorithm: rsa-sha2-512
terwijl
$ sftp -v test@gcopy.net
toont:
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
Blijkbaar heeft de ssh
-client ergens een foutje! Het kan niet omgaan met een host sleutel die in meer dan één variant bestaat! Of het valt in de val om een verouderde variant van een sleutel aan te vragen.
Hoe te verhelpen?
Ik heb echt geen idee. Dit kan waarschijnlijk alleen stroomopwaarts gerepareerd worden.
Maar er is een handmatige maar onhandige workaround:
Je moet alle sporen van de oude sleutel van het type rsa
handmatig verwijderen. De betreffende sleutel wordt in de uitvoer getoond, maar is niet direct gemarkeerd als het probleem:
Warning: the RSA host key for 'valentin.hilbig.de' differs from the key for the IP address '136.243.197.100'
Offending key for IP in /home/test/.ssh/known_hosts:45
Matching host key in /home/test/.ssh/known_hosts:10
check:
awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts
geeft
ecdsa-sha2-nistp256
ssh-rsa
dus hier is de matching hostsleutel de beledigende en de beledigende sleutel is de juiste die bewaard moet worden! Dus laten we de verkeerde (matchende) sleutel verwijderen:
ssh-keygen -R valentin.hilbig.de
# Host valentin.hilbig.de found: line 10
/home/test/.ssh/known_hosts updated.
Original contents retained as /home/test/.ssh/known_hosts.old
Controleer nu opnieuw:
$ sftp test@valentin.hilbig.de
The authenticity of host 'valentin.hilbig.de (136.243.197.100)' can't be established.
ECDSA key fingerprint is SHA256:tf7lwe10C2p1lK2UG9p//m/4sUBCpX+i9k5Ub63c6Os.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'valentin.hilbig.de' (ECDSA) to the list of known hosts.
Connected to test@valentin.hilbig.de.
sftp>
$ sftp test@gcopy.net
Connected to test@gcopy.net.
sftp>
sftp test@136.243.197.100
Connected to test@136.243.197.100.
sftp>
YAY! Probleem eindelijk weg. Maar met enkele 100 vermeldingen in .ssh/known_hosts
wordt deze “oplossing” echt een grote PITA (en een Error Prone Security Nightmare op Elm Street. YMMV).