Что такое отпечаток ключа SSH и как он генерируется?

131

Я всегда нахожу, что я получаю это сообщение, когда я sshв новой машине:

12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53

Что это означает? Будет ли у каждой машины один и тот же отпечаток пальца каждый раз?

Как генерируются эти отпечатки пальцев? От каких параметров они зависят?

Кит Хо
источник

Ответы:

65

Отпечаток пальца основан на открытом ключе хоста, обычно на основе "/etc/ssh/ssh_host_rsa_key.pub". Как правило, для легкой идентификации / проверки хоста, к которому вы подключаетесь.

Если отпечаток пальца изменяется, компьютер, к которому вы подключаетесь, изменил свой открытый ключ. Это может быть не плохо (происходит после переустановки ssh), но это также может указывать на то, что вы подключаетесь к другому компьютеру с тем же доменом / IP (происходит, когда вы подключаетесь через что-то вроде балансировщика нагрузки) или что вы подвергаются атаке «человек посередине», когда злоумышленник каким-то образом перехватывает / перенаправляет ваше ssh-соединение для подключения к другому хосту, который может отслеживать вашего пользователя / pw.

Итог: если вас предупреждают об изменении отпечатка пальца, будьте осторожны и дважды проверьте, действительно ли вы подключаетесь к правильному хосту через безопасное соединение. Хотя в большинстве случаев это безвредно, это может быть признаком потенциальной проблемы.

Смотрите: http://www.lysium.de/blog/index.php?/archives/186-How-to-get-ssh-server-fingerprint-information.html
и: http://en.wikipedia.org/ вики / Public_key_fingerprint

madmaze
источник
5
«... будьте осторожны и дважды проверьте, что вы действительно подключаетесь к правильному хосту через безопасное соединение» - глупый вопрос, но как вы можете сделать это легко?
Савара
1
@Savara Когда вы подключаетесь к SSH-серверу, который вы ранее не подключали, вы должны запросить открытый ключ SSH-сервера у администратора сервера. Администратор сервера выдаст вам кусок текста. Вы должны добавить этот текст в файл ~/.ssh/known_hosts. Таким образом, когда вы подключаетесь к серверу, ваш SSH-клиент распознает этот сервер, поскольку вы сохранили его открытый ключ known_hosts. Следовательно, на самом деле вы никогда не должны говорить «да», когда клиент SSH говорит вам: «Подлинность хоста не может быть установлена». Вы должны всегда добавлять открытый ключ сервера заранее.
Utku
@Savara Если вы сделаете это, вы будете знать, что происходит что-то подозрительное, когда ваш SSH-клиент говорит вам «Подлинность клиента не может быть установлена» или когда он говорит вам «Открытый ключ сервера был изменен». Следовательно, вы всегда должны ~/.ssh/known_hostsзаранее добавлять открытый ключ сервера в ваш файл и никогда не говорить «да», когда ваш SSH-клиент говорит вам «Подлинность клиента не может быть установлена» или когда он говорит вам «Открытый ключ сервера был измененное».
Utku
3
Да, я полностью осведомлен о том, как работает механизм просмотра отпечатков пальцев SSH, но большой процент времени у вас нет возможности получить отпечаток пальца через другой канал. TOFU, к сожалению, лучшее, что мы часто получаем.
Савара
Есть ли способ проверить подлинность даже после ответа «да»?
обмен
105

Вы можете создать отпечаток для открытого ключа, используя ssh-keygenтак:

ssh-keygen -lf /path/to/key.pub

Конкретный пример (если вы используете открытый ключ RSA):

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
2048 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff /Users/username/.ssh/id_rsa.pub (RSA)

Первая часть (2048)- это длина ключа в битах, вторая часть (00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff)- это отпечаток открытого ключа, а третья часть - это местоположение самого файла открытого ключа.

Benjamin Oakes
источник
Знаете ли вы, как перевести в 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 этот формат из этого открытого ключа?
Кит Хо,
@KitHo Я не уверен, что понимаю ваш вопрос. Я обновил пример, так как думаю ssh-keygen -lfсделаю что хочешь.
Бенджамин Оукс
5
Когда SSH-ать в новую машину, то , что один видит не пользовательские Публичные отпечатки пальцев, но Публичные отпечатки пальцы хозяина. Таким образом, лучший пример для контекста на вопрос является ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Он показывает отпечаток, который также отображается при входе в систему SSH на localhost.
Танус
60
Мои ssh-keygenзарегистрированные sha256отпечатки пальцев. Чтобы получить md5отпечатки пальцев, я побежал ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Джастин C
6
(@JustinC) Версии OpenSSH 6.8 (март 2015 г.) и выше изменены на SHA256, по умолчанию отображаемые в формате base64, а не в шестнадцатеричном формате. Для клиента использовать ssh -o FingerprintHash=md5или эквивалент в ssh_configи на вещи, которые используют, sshкак scp.
dave_thompson_085
72

Отпечаток пальца - это MD5 поверх двоичных данных в открытом ключе в кодировке Base64.

$ ssh-keygen -f foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in foo.
Your public key has been saved in foo.pub.
The key fingerprint is:
65:30:38:96:35:56:4f:64:64:e8:e3:a4:7d:59:3e:19 andrew@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|       +*..+*    |
|      =. +.=     |
|     . . .o .    |
|         o+   E  |
|        S= . + o |
|        . o o +  |
|           .   . |
|                 |
|                 |
+-----------------+
$ cat foo.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp andrew@localhost
$ echo 'AAAAB3NzaC1yc2EAAAADAQABAAABAQDEbKq5U57fhzQ3SBbs3NVmgY2ouYZfPhc6cXBNEFpRT3T100fnbkYw+EHi76nwsp+uGxk08kh4GG881DrgotptrJj2dJxXpWp/SFdVu5S9fFU6l6dCTC9IBYYCCV8PvXbBZ3oDZyyyJT7/vXSaUdbk3x9MeNlYrgItm2KY6MdHYEg8R994Sspn1sE4Ydey5DfG/WNWVrzFCI0sWI3yj4zuCcUXFz9sEG8fIYikD9rNuohiMenWjkj6oLTwZGVW2q4wRL0051XBkmfnPD/H6gqOML9MbZQ8D6/+az0yF9oD61SkifhBNBRRNaIab/Np7XD61siR8zNMG/vCKjFGICnp' \
    | base64 -D | md5
6530389635564f6464e8e3a47d593e19

Md5sum 6530389635564f6464e8e3a47d593e19 - это отпечаток, отображаемый при создании ключа, только без разделительных двоеточий.


Однако, если вы имеете дело с отпечатками пальцев, которые Amazon показывает в консоли пар ключей EC2, к сожалению, это может быть другой зверь . Если это шестнадцатеричная строка из 32 цифр, то это стандартный отпечаток открытого ключа SS5 MD5, указанный выше. Но если это 40 шестнадцатеричных цифр, это на самом деле отпечаток пальца, вычисленный путем взятия SHA1 закрытого ключа в формате PKCS # 8:

$ openssl pkcs8 -in foo -nocrypt -topk8 -outform DER | openssl sha1 -c
e2:77:39:d3:53:a7:62:68:5f:da:82:0e:99:61:30:64:a2:88:c4:58
andrew.n
источник
1
Я нашел этот ответ полезным в следующем сценарии. Ваша система использует SHA1 для вычисления отпечатка пальца, но ваш друг использует md5. Я поделился отпечатком пальца, который был SHA1, и он не соответствовал MD5, сгенерированному ее системой. Это помогло - спасибо! sed 's | ^ ssh-rsa ||' /etc/ssh/ssh_host_rsa_key.pub | sed 's | ==. * $ | == |' | base64 -d | md5sum
Liczyrzepa
Это очень важно для понимания того, почему этот отпечаток не будет совпадать с отпечатками в записях DNS SSHFP, поскольку они используют дайджесты SHA-1 или SHA-256.
neirbowj
1
@Liczyrzepa поле publickey может иметь или не иметь '==' в конце, в зависимости от типа ключа и размера битов; безопаснее, а ИМО проще в использовании awk '{print $2}' /path/to/keyfile.pubили аналогичном.
dave_thompson_085
13
Это единственный ответ, который объясняет, как рассчитывается отпечаток пальца
greuze
2
Однако в Linux Mint команда выглядит так:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze
13

Если вы хотите проверить файл ключа SSH, чтобы увидеть, совпадает ли он с тем, что github сообщает как «Deploy key», это для вас ...

С частного URL: https://github.com/<username>/<repo_name>/settings/keys вы увидите скриншот с github

На терминале:

$ ls -l id*
-rw-------  1 bruno  staff  1675 Mar 29 17:03 id_rsa
-rw-r--r--  1 bruno  staff   416 Mar 29 17:03 id_rsa.pub

$ ssh-keygen -E md5 -lf id_rsa
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e ec2-user@ip-10-2-1-16.ec2.internal (RSA)

Вы заметите, что вы получаете одинаковые отпечатки как для закрытых, так и для открытых ключей.

Эту же команду можно объединить с удобной функцией GitHub, которая заключается в том, что они публично обслуживают открытые ключи пользователей SSH по адресу https://github.com/<username>.keys.

Вот одна строка, которую вы можете использовать, чтобы воспользоваться ею.

$ curl -sL https://github.com/RichardBronosky.keys | while read; do echo -e "\nkey #$((++i)):"; ssh-keygen -E md5 -lf - <<<"$REPLY"; echo $REPLY; done

key #1:
2048 MD5:07:b4:00:a4:65:ef:44:89:05:84:60:0c:c9:b2:36:5e no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJGT35gvsFveu+80qgurrLHId0h55E9jliM7Fo0mV9b7eg3EfyagkAcJUSMFkoov3HY4CW0yzOc7WlN57ABwvpRz1ioFDex0n0FkjoSEs5ROeT1OneRK6Bf6XnplgPuQ/LSSkv3kmK6I29R+YWi6TjDvLLoA5BrXJjOMfUv36jxWCDtk/5ZdhMZqhsMuDm06Jg5JBu6n5jQaZkmaIaunz7vOfwVG9LoCI+MYyIdo2S4VTva7Ee7jfAvgSUUgHTjhzsPO0/Ww5a/Kz2ehXW27aJxj/QPLfYR2LmTMbQKm3WpB8P1LjoiU7zjPoVoZ43a4P2JLUDidGKCd3eY5b5xewz

key #2:
2048 MD5:f7:98:f1:0b:73:c6:2a:21:00:7a:70:1d:0f:cf:d8:cc no comment (RSA)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCQsZrjwKjB4WnE4SwVdDX5eEMxKzPHFBVKKpo9vvWUXRQwdTZy6iVOkyF26IPR+xDPzslzXOClKXUrWEh6La/EMpRwuMrWAbMIJFeDHOb56q4azgopoJmMJHo0yxGu0Ts4XszMACYRhlG6uK2AP5SYiOTp1zKPFjazXAdwLXyOvJurzy6KKuGJdSs/sj9+4uehgyRNOhehCSfg71tJJYwRvO2DDfLgaVEKOgZx58gEnJfhhz9D7rbvdZNhw/hCgtVNJaQF9Mdke2OPwWSo8i0/XNb9Bu/GRXqwMZrxDBhyzieocW40cwuzxWfzoi03aISdtQ1HtawH8+/sswviM1+B
Бруно Броноски
источник
1
ssh-keygen -r host.name.com

Выводит отпечатки пальцев для всех настроенных открытых ключей на экземпляре sshd.

Затем они могут быть помещены в записи DNS SSHFP .

Майк Шролл
источник