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

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

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

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

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

7 ответов

Решение

Отпечаток пальца основан на открытом ключе хоста, обычно на основе "/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/wiki/Public_key_fingerprint

Вы можете создать отпечаток для открытого ключа, используя 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) это отпечаток открытого ключа, а третья часть - это местоположение самого файла открытого ключа.

Отпечаток пальца - это 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

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

От github.com/username/repo_name/setting/keys:

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

$ 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:de:ad:be:ef:15:34:15:3d:1e:a0:19:c5:09:3a:4e:95 ec2-user@ip-10-2-1-16.ec2.internal (RSA)

$ ssh-keygen -E md5 -lf id_rsa.pub
2048 MD5:de:ad:be:ef:15:34:15:3d:1e:a0:19:c5:09:3a:4e:95 ec2-user@ip-10-2-1-16.ec2.internal (RSA)

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

ssh-keygen -r host.name.com

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

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

Для проверки отпечатка пальца, присутствующего в Azure Devops, вы можете использовать

      $ ssh-keygen -E md5 -lf .ssh/id_rsa.pub
2048 MD5:ba:42:24:87:d6:7b:71:a2:3e:b5:9a:31:b2:2c:e0:00 CrazyGirrafe@Australasia (RSA)

В OpenSSH 7.8 или более поздней версии при использовании ключей RSA отпечаток пальца будет совпадать с тем, который AWS показывает в своем списке ключей.

      ssh-keygen -ef $path_to_private_key -m PEM | openssl rsa -RSAPublicKey_in -outform DER | openssl md5 -c
Другие вопросы по тегам