На моей стороне это происходит из-за того, что я считаю ошибкой ssh
более новых (OpenSSH_7.9p1
и выше) клиентов, когда он пытается узнать более безопасный ключ сервера ecdsa
, где уже известен более старый ключ типа rsa
. Я не знаю, как это исправить, единственное решение, которое я нашел - это удалить все “хорошие, но старые ключи rsa
”, чтобы клиент мог заново выучить “новые, более безопасные ключи ecdsa
”. Итак:
Первый шаг состоит в том, чтобы удалить все старые добрые ключи RSA ( Предупреждение! Это теряет защиту от MitM):
Второй шаг - это переучивание всех ключей хоста, что нужно сделать вручную, подключившись к каждому IP снова, используя ssh
.
Вот что я наблюдаю:
$ 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>
Теперь попробуйте подключиться к вновь введенному псевдониму этого же уже известного хорошего сервера:
$ 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)?
Пожалуйста, посмотрите на IP-адрес. Это тот же самый IP, что и выше! Похоже, что (хороший) ключ (известного) IP внезапно себя оскорбляет (это не так, так как клиент ssh
смешивает два несовместимых ключа, см. ниже).
Теперь мы пытаемся это исправить:
$ 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
Попробуем еще раз:
$ 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? Что здесь произошло? Новый свежий ключ, извлеченный из сервера, снова не работает? И проблема даже поменялась сторонами?!?
Нет, это не ключ, ни сервер. Все верно!
Это клиент ssh
, который не может проверить правильность ключа! Теперь ввод 45
в known_hosts
содержит ключ типа ecdsa-sha2-nistp256
, в то время как ключ, который был извлечен клиентом из сервера, имеет тип rsa-sha2-512
(и поэтому не может совпадать с другим ключом!).
$ sftp -v test@valentin.hilbig.de
показывает:
показывает:
debug1: kex: host key algorithm: rsa-sha2-512
Очевидно, что у клиента ssh
где-то есть ошибка! Он не может справиться с хост-ключом, существующим в более чем одном варианте! Или он попадает в ловушку, чтобы запросить устаревший вариант ключа.
Как исправить?
Понятия не имею. Наверное, это можно исправить только вверх по течению.
Но есть ручной, но неуклюжий обходной путь:
Нужно вручную удалить все следы старого ключа типа rsa
. Ключ в вопросе отображается в выводе, но он не отмечен непосредственно как проблема:
$ sftp -v test@gcopy.net
проверить:
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
дает
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
Так что здесь соответствующих ключ хоста является оскорбительным, и оскорбительный ключ является правильным, который должен быть сохранен! Так что давайте удалим неправильный (совпадающий) один:
awk 'NR==45 { print $2 }' /home/test/.ssh/known_hosts
awk 'NR==10 { print $2 }' /home/test/.ssh/known_hosts
Теперь проверьте еще раз:
ecdsa-sha2-nistp256
ssh-rsa
YAY! Проблема наконец-то ушла. Но с несколькими 100 записями в .ssh/known_hosts
, это “решение” действительно становится основным PITA (и Error Prone Security Nightmare на Elm Street. YMMV.).