Що таке відбиток ключа SSH і як він генерується?


128

Я завжди вважаю, що отримую це повідомлення, коли перебуваю 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/ wiki / Public_key_fingerprint


5
"... будьте обережні та перевірте, що ви насправді підключились до правильного хоста через безпечне з'єднання" - дурне питання, але як це зробити легко?
Савара

1
@Savara Під час підключення до SSH-сервера, до якого ви раніше не підключалися, ви повинні запитати відкритий ключ SSH-сервера у адміністратора сервера. Адміністратор сервера передасть вам фрагмент тексту. Ви повинні додати цей текст до файлу ~/.ssh/known_hosts. Таким чином, під час підключення до сервера ваш клієнт SSH розпізнає цей сервер, оскільки ви зберегли його відкритий ключ у known_hosts. Отже, насправді ви ніколи не повинні говорити "так", коли клієнт SSH скаже вам "Автентичність хоста неможливо встановити". Ви завжди повинні додати відкритий ключ сервера заздалегідь.
Утку

@Savara Якщо ви це зробите, ви дізнаєтесь, що відбувається щось рибне, коли ваш клієнт SSH скаже вам "Автентичність клієнта неможливо встановити" або коли він говорить вам "Публічний ключ сервера змінено". Отже, ви завжди повинні ~/.ssh/known_hostsзаздалегідь додавати відкритий ключ сервера до свого файлу і ніколи не говорити так, коли ваш клієнт SSH каже вам "Автентичність клієнта неможливо встановити" або коли він повідомляє вам "Публічний ключ сервера був змінився ".
Утку

3
Так, я цілком усвідомлюю, як працює механізм перегляду відбитків пальців SSH, але великий відсоток часу у вас немає можливості отримати відбиток пальців через інший канал. На жаль, TOFU - це найкраще, що ми часто отримуємо.
Савара

Чи є спосіб перевірити справжність навіть після відповіді "так"?
обмін

104

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


Ви знаєте, як перекласти на 12: f8: 7e: 78: 61: b4: bf: e2: de: 24: 15: 96: 4e: d4: 72: 53 цей формат із цього відкритого ключа?
Кіт Хо

@KitHo Я не впевнений, чи розумію ваше запитання. Я оновив приклад, бо думаю ssh-keygen -lf, що робитиму все, що завгодно.
Бенджамін Оукс

5
Коли SSH-ing переходить у нову машину, бачимо не відбиток пальця користувача, а відбиток від пабліку господаря. Тож кращим прикладом для контексту питання є ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub. Він показує відбиток пальців, який також відображається на входах SSH до localhost.
таніус

57
Мої ssh-keygenповідомлення про sha256відбитки пальців. Для того, щоб отримати md5відбитки пальців, я побіг ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub. #archlinux
Джастін C

5
(@JustinC) Версії 6.8 (березень 2015 р.) Та новіші версії OpenSSH були змінені на SHA256, відображаються за замовчуванням у базі64, а не у шістнадцятковій. Для використання клієнтом 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 Key Pairs, на жаль, це може бути інший звір . Якщо це 32-значний шістнадцятковий рядок, це стандартний відбиток пальця відкритого ключа MD5 SSH вище. Але якщо це 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

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 може бути, а може і не бути "==" наприкінці, залежно від типу ключа та розряду бітів; більш безпечний і IMO простіший у використанні awk '{print $2}' /path/to/keyfile.pubабо подібний.
dave_thompson_085

13
Це єдина відповідь, яка пояснює, як обчислюється відбиток пальця,
марля

2
Однак у Linux Mint командою є:cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum
greuze

13

Якщо ви хочете перевірити файл ключа SSH, щоб побачити, чи він такий самий, як повідомлено github, як "ключ розгортання", це для вас ...

З приватної 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.