Отличающиеся форматы SSH known_hosts
У меня были проблемы с развертыванием моего CI-сервера в последнее время из-за того, что клиент (CI) отклонил ключ хоста удаленного компьютера (несмотря на то, что он присутствовал в known_hosts
). До сегодняшнего дня я был в тупике, когда понял, что SSH сохраняет ключи хоста в формате, с которым плагин развертывания не совместим. Для справки, совместимый формат (все еще присутствует на моем персональном компьютере) выглядит следующим образом:
11.22.33.44 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCkVf7rhfC7nLxbeIQRj2bWitUC+XLSAeQ0ap8r8rKObDXYfPdB97NZth9JCEt3OrBXuBeg4PaAEuPu2QF7WXoT60hgAP6etr0W4LqcH59yd/X0ogFP7Y7hIf6dz1txDKaW92wgUi5XShwH6vukf0gLvW6/ak1LTBuoy72gaoUvxZge4KZivz9XqvSQHNOG9KYNfh8U6cRM8YTQo5in7YD5d6REV/FUmXpvBzCa9kbVRSlQFGYEc1HidTnPnJDteas3A9y3na385O7WN64aAkg7TO8IFXKdDHSwji9ZyrCVPA5GEuyLKhDFanV8iJ7CNflHMP8TwG5FOT2bSkV0lPyl
Хотя формат SSH в настоящее время сохраняется при принятии новых ключей хоста, он выглядит примерно так:
11.22.33.44 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU=
(Примечание: хотя я немного выдумал открытые ключи, они по-прежнему совсем не похожи друг на друга в своей первоначальной форме.)
Только первый формат совместим с плагином развертывания, а второй безоговорочно игнорируется. Кто-нибудь может объяснить это несоответствие?
1 ответ
Это не разные форматы known_hosts
, но разные типы ключей (ssh-rsa
а также ecdsa-sha2-nistp256
- хорошо описано на странице руководства для sshd
). Сервер обычно имеет больше ключей хоста разных типов, чтобы обеспечить более широкую совместимость с разными клиентами.
Если вы находитесь на сервере, вы можете найти все ключи хоста и распечатать их открытые ключи, используя, но строка не в том же формате, что и:
$ cat /etc/ssh/ssh_host_*.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU= user@host
Формат, который принимается known_hosts
Файл можно получить с помощью (с сервера для обеспечения подлинности ключей):
$ ssh-keyscan 11.22.33.44
11.22.33.44 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEJJEs165NgdEcD94Xg3ySFA/qgkfytxNCX1X3pB2SPgU/mHLGXCXM8+VqMBXocM8OMOq2L0fDGr5mI+nGqjhNU=
#[...]
Это печатает формат, который вы можете сохранить непосредственно в клиенте known_hosts
,
Для всей картины (со страницы руководства):
Каждая строка в этих файлах содержит следующие поля: маркеры (необязательно), имена хостов, биты, экспонента, модуль, комментарий. Поля разделены пробелами.
(хотя это выглядит несовместимым с тем, что генерируется: имя хоста, тип ключа, данные ключа (base64)) - я проверю это позже, так как это не важно для вопроса