關於SSH登入中 公鑰指紋 科普

reggie發表於2021-08-23

昨天公司 Git 伺服器進行了升級 導致金鑰全部都沒了 需要重新上傳 有個別幾個專案順便換了個地址

SSH 首次登陸

當重新上傳SSH Key 然後設定完 Git 遠端專案地址後 發現有個小提示資訊 如下

$ git fetch
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec.
Please contact your system administrator.
Add correct host key in /c/Users/reggie/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /c/Users/reggie/.ssh/known_hosts:2
ECDSA host key for [xxx.xxx.com]:12222 has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

$ git fetch
The authenticity of host '[host]:12222 ([xxx.xxx.xx.xxx]:12222)' can't be established.
ECDSA key fingerprint is SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[host]:12222' (ECDSA) to the list of known hosts.
Warning: the ECDSA host key for '[host]:12222' differs from the key for the IP address '[121.201.57.228]:10022'
Offending key for IP in /c/Users/reggie/.ssh/known_hosts:7
Are you sure you want to continue connecting (yes/no)? yes

大概翻譯下就是有可能有某人在伺服器做了些 “壞事”
有人可能在竊聽你(中間人攻擊)
還可能更換了主機金鑰
下面是主機傳送的 公鑰指紋 其值
SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec.

發生的原因

找了下相關 known_hosts 內容 這個提示一般發生在第一次連線伺服器的時候 SSH 會對進行連線的伺服器核對你歷史資訊登入的伺服器檔案 也就是 known_hosts 檔案

這個裡面記錄了你登入過的伺服器資訊 什麼IP啦埠啦 還有最重要的 伺服器的 公鑰指紋 而本次我們換了Git伺服器 公鑰指紋也發生了變動 然後SSH在下面進行比對的時候發現不一致

給出提示 有可能會發生中間人攻擊 問我們是否信任主機 同時還返回了伺服器的 公鑰指紋 我們可以校驗伺服器的 公鑰指紋 已確認是否是我們需要真正連線的伺服器 而不是中間人的伺服器。

如果我們輸入 yes 表示確認是正確的伺服器 然後他會吧相關資訊寫入 到 known_hosts 檔案 然後繼續下面的連線。

後面還有一個小插曲 就是我輸入了一個yes後 資訊也寫入了 但是每次連線還是會提示這個 後面我發現是Git伺服器的域名沒變 IP變了

然後上面一條記錄是連線的老的伺服器 而指紋已經變了,新的指紋資訊在最下面。

推測應該是從上而下讀取記錄資訊 然後比對的 比對到老的地址了 然後發現指紋不一致 直接彈了這個出來

後面我直接把 known_hosts 檔案清空了 重新連線一次 OK 搞定

中間人攻擊

SSH的首次連線會下載服務端的公鑰,使用者確認後公鑰將被儲存並信任。

下次訪問時客戶端將會核對服務端發來的公鑰和本地儲存的是否相同,不同就發出中間人攻擊的警告拒絕連線,除非使用者手動清除已儲存的公鑰。

所以,如果首次連線沒有中間人,之後的連線就無需擔心中間人,因為中間人給出的公鑰和服務端給出的公鑰相同的可能性可以忽略。

如果首次連線就有中間人攻擊,那麼恭喜你中獎了。

校驗公鑰指紋

關於上一步給出來的 伺服器 公鑰指紋如何校驗 找了一圈內容 大概都沒有好的辦法來校驗。

一般都是伺服器端公開自己的金鑰指紋 比如 Github 他們公開了自己的公鑰指紋 然後連線的時候返回過來可以自己對比下是否一致。

還有一種校驗方式操作如下

獲取服務端公鑰

$ ssh-keyscan -t ECDSA -p 22 host > xx.txt
# host:22 SSH xxxx

然後我們可以檢視 xx.txt 檔案(注意你的路徑哈)

[host]:22 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBAv7EZMq4b//f0Wj1ik/GK8G1/YwwU4dpS2d3C6YuPY0lMHeivFW4OyWOADqi7wnlO3Ot6fVZ6t1hZjQqhj2u4=

這個內容其實和寫入你的 known_hosts 的內容是一樣的

校驗公鑰指紋

可以使用下面的命令來生成公鑰指紋 -E 引數是指定指紋的型別 注意一開始返回的型別一致 上面是sha256

$ ssh-keygen -E sha256 -lf xx.txt
256 SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec no comment (ECDSA)

可以看到返回的值是 SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec 這和一開始第一次連線伺服器時返回的指紋是一致的 SHA256:7g/bojcSbdVWBrfNrQ5+k+XQZuo4mp0V7MnUPD21nec。 這樣就完成了一次校驗 但是這個校驗真的是準確的嗎 如果你獲取到的公鑰都是 中間人的呢… 好吧我也不知道了!!! 一般都是伺服器放公開自己的指紋 然後比對吧 這樣靠譜點。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
微信公眾號:碼咚沒 ( ID: codingdongmei )

相關文章