題 什麼是SSH密鑰指紋以及它是如何生成的?


當我發現時,我總是發現這個消息 ssh 進入一台新機器:

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

它代表什麼?每台機器每次都會有相同的指紋嗎?

這些指紋是如何產生的?他們依賴什麼參數?


97
2018-05-08 14:22


起源




答案:


指紋基於主機的公鑰,通常基於“/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


46
2018-05-08 14:41



“......要小心並仔細檢查你是否真的通過安全連接連接到正確的主機” - 這是一個愚蠢的問題,但你怎麼能這麼做呢? - Savara
@Savara當您連接到之前未連接的SSH服務器時,您應該從服務器管理員請求SSH服務器的公鑰。服務器管理員會給你一段文字。您應該將此文本附加到該文件 ~/.ssh/known_hosts。這樣,當您連接到服務器時,您的SSH客戶端將識別此服務器,因為您已將其公鑰保存到 known_hosts。因此,實際上你應該 決不 當SSH客戶端告訴您“無法建立主機的真實性”時,請說“是”。您應該始終事先添加服務器的公鑰。 - Utku
@Savara如果你這樣做,當你的SSH客戶端告訴你“無法建立客戶端的真實性”或者它告訴你“服務器的公鑰已被更改”時,你就會知道有什麼可疑的事情發生了。因此,您應該始終將服務器的公鑰添加到您的 ~/.ssh/known_hosts 事先和 決不 當您的SSH客戶端告訴您“無法建立客戶端的真實性”或者它告訴您“服務器的公鑰已被更改”時,請說“是”。 - Utku
是的,我完全了解查看SSH指紋的機制是如何工作的,但是很大一部分時間你沒有選擇通過另一個通道獲取指紋。可悲的是,TOFU是我們經常得到的最好的。 - Savara
有沒有辦法檢查真實性,即使在回答“是”之後? - exchange


您可以使用生成公鑰的指紋 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) 是公鑰的指紋,第三部分是公鑰文件本身的位置。


79
2017-07-24 16:26



你知道如何翻譯成12:f8:7e:78:61:b4:bf:e2:de:24:15:96:4e:d4:72:53這個公鑰的格式? - Kit Ho
@KitHo我不確定我是否理解你的問題。我想,我更新了這個例子 ssh-keygen -lf 會做你想做的。 - Benjamin Oakes
當SSH進入新機器時,人們看到的是什麼 不 用戶的pubkey指紋,但是主機的pubkey指紋。因此問題的背景更好的例子是 ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub。它顯示指向SSH登錄到localhost的指紋。 - tanius
我的 ssh-keygen 報導 sha256 指紋。為了得到 md5 指紋我跑了 ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub。 #archlinux - Justin C
(@JustinC)OpenSSH版本6。8(2015年3月)並且更改為SHA256,默認情況下以base64而不是hex顯示。供客戶使用 ssh -o FingerprintHash=md5 或等同於 ssh_config 以及使用的東西 ssh 喜歡 scp。 - dave_thompson_085


指紋是Base64編碼的公鑰的MD5。

$ 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是顯示時的指紋 生成密鑰,只有沒有分隔冒號。


但是,如果您正在處理亞馬遜在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

57
2018-02-08 20:40



我發現這個答案在以下場景中很有用。您的系統使用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
@Liczyrzepa publickey字段可能會或可能不會在結尾處有'==',具體取決於密鑰類型和bitsize;更安全,IMO更容易使用 awk '{print $2}' /path/to/keyfile.pub 或類似的。 - dave_thompson_085
這是解釋指紋計算方式的唯一答案 - greuze
但是在Linux Mint中,命令是: cat id_rsa.pub | cut -d' ' -f2 | base64 -d | md5sum - greuze


ssh-keygen -r host.name.com

將在sshd實例上輸出所有已配置公鑰的指紋。

然後可以將這些放入 DNS SSHFP 記錄。


0
2017-11-26 04:32