Есть ли способ программно получить отпечаток ключа сервера SSH без аутентификации ?
Я пытаюсь ssh -v user@host false 2>&1 | grep "Server host key"
, но это зависает в ожидании пароля, если аутентификация на основе ключа не настроена.
Вы можете сделать это, комбинируя ssh-keyscan
и ssh-keygen
:
$ file=$(mktemp)
$ ssh-keyscan host > $file 2> /dev/null
$ ssh-keygen -l -f $file
521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA)
4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA)
$ rm $file
(к сожалению, намного проще ssh-keyscan host | ssh-keygen -l -f /dev/stdin
не работает)
ssh-keygen -l -f - <(ssh-keyscan host)
, правда?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
действительно работает так, как ожидалось в ssh-keygen 7.2 и выше. Он производит несколько строк комментариев к STDERR, которые могут быть отфильтрованы, как упоминалось в ответе Энтони Геогегана илиssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
Мне недавно пришлось сделать это самому, поэтому я решил добавить ответ, который показывает, как это можно сделать (с версиями OpenSSH 7.2 или новее ) в одну строку, используя подстановку процессов:
Следующий текст объясняет, как работают эти команды, и выделяет некоторые различия в поведении между старыми и новыми версиями утилит OpenSSH.
Получить открытые ключи хоста
Команда
ssh-keyscan
была разработана таким образом, чтобы пользователи могли получать открытые ключи хоста без аутентификации на сервере SSH. Из его справочной страницы:Тип ключа
Тип ключа, который нужно получить, указывается с помощью
-t
параметра.rsa1
(устаревшая версия протокола SSH 1)rsa
dsa
ecdsa
(последние версии OpenSSH)ed25519
(последние версии OpenSSH)В современных выпусках OpenSSH типами ключей по умолчанию для выборки являются
rsa
(начиная с версии 5.1),ecdsa
(начиная с версии 6.0) иed25519
(начиная с версии 6.7).С более старыми версиями из
ssh-keyscan
(до OpenSSH версии 5.1), то по умолчанию тип ключ был устареваютrsa1
(SSH протокол 1) , так что основные типы должны быть явно указаны:Получите хэши отпечатков пальцев ключей Base64
ssh-keyscan
печатает ключ хоста SSH-сервера в формате Base64 . Чтобы преобразовать это в хэш отпечатка пальца,ssh-keygen
можно использовать утилиту с-l
возможностью печати отпечатка пальца указанного открытого ключа.При использовании Bash, Zsh (или оболочки Korn), подстановка процесса может быть использована для удобной однострочной:
Примечание . В версиях OpenSSH до 7.2 функции, используемые
ssh-keygen
для чтения файлов, не очень хорошо обрабатывали именованные каналы (FIFO), поэтому этот метод не будет работать, что потребует использования временных файлов.Алгоритмы хеширования
Последние версии
ssh-keygen
печати SHA256 отпечатков пальцев хэши ключей. Чтобы получить MD5- хэши отпечатков ключей сервера (старое поведение),-E
можно использовать параметр, чтобы указать алгоритм хеширования:Использование конвейера
Если используется оболочка POSIX (например,
dash
), в которой не предусмотрена подстановка процессов, другие решения, использующие временные файлы, будут работать. Однако в более новых версиях OpenSSH (начиная с 7.2) можно использовать простой конвейер, поскольку онssh-keygen
будет принимать-
имя файла для стандартного входного потока, что позволяет использовать однострочную команду конвейера.источник
ssh-keygen
из более старых версий OpenSSH возникают проблемы с чтением из FIFO / именованного канала. Я посмотрю на это (и обновлю свой ответ), когда у меня будет немного свободного времени.printf
вdo_fingerprint()
функцию операторы отладки , я обнаружил, что в версиях OpenSSH до 7.2 функции, используемыеssh-keygen
для чтения файлов, не очень хорошо обрабатывали именованные каналы (FIFO), поэтому метод замены процесса не будет работать.nmap
предоставляет эту возможность с помощьюssh-hostkey
сценария.Чтобы вернуть шестнадцатеричный отпечаток ключа:
Чтобы вернуть содержимое ключа:
Чтобы вернуть визуальный пузырь ключа
Чтобы вернуть все вышеперечисленное:
Источник: nmap документы
источник
-p
опция, которая может указывать порт, например-p 22000
. Также возможно использовать-vv
опцию для увеличения многословия (объем предоставленной информации)filezilla отображает ключи, хэшированные с помощью md5, в шестнадцатеричном формате.
чтобы найти это на вашем компьютере с Ubuntu Linux, используйте эту команду:
примечание: замените "localhost" на ip машины, которую вы хотите проверить.
источник
Вот сценарий оболочки (в основном оболочка Bourne, но с использованием
local
ключевого слова, которое доступно в большинстве современных/bin/sh
), я написал для этого. Используйте это какssh-hostkey hostname
. Он покажет отпечатки пальцев в формате sha256 и md5 для всех ключей хоста для данного имени хоста или IP-адреса. Вы также можете вручную указать «md5
» или «sha256
» в качестве второго аргумента, чтобы показать только этот конкретный формат.Он использует временный файл вместо конвейера, чтобы сделать его совместимым со старыми пакетами OpenSSH (как описано в других ответах). Временный файл использует
/dev/shm
(разделяемую память), если доступно.источник