ssh遠程登錄報錯REMOTE HOST IDENTIFICATION HAS CHANGED!解決方式及原因


注意,文檔中的ip和指紋已經替換為了ip.ip.ip.ipaa:... ,以免引起不必要的誤會。

icode@test:~/lab/dir/sadf$ ssh remote_name@ip.ip.ip.ip
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa.
Please contact your system administrator.
Add correct host key in /home/hicode/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/hicode/.ssh/known_hosts:28
  remove with: ssh-keygen -f "/home/hicode/.ssh/known_hosts" -R ip.ip.ip.ip
ECDSA host key for ip.ip.ip.ip has changed and you have requested strict checking.
Host key verification failed.

之前使用提示中的

  remove with: ssh-keygen -f "/home/hicode/.ssh/known_hosts" -R ip.ip.ip.ip

刪除了也就ok了。只是今天說是

/home/hicode/.ssh/known_hosts is not a valid known_hosts file.
Not replacing existing known_hosts file because of errors

我也不知道為什么。要下功夫想想原因了。
解決方式:然而登錄時候的報錯,當中有一句

Offending ECDSA key in /home/hicode/.ssh/known_hosts:28

刪除掉文檔中第28 行就可以

sed -i '28d' /home/hicode/.ssh/know_hosts

此時再登錄就和第一次ssh登錄就一致了。

why?

大學時候password學學的不好,大概是私鑰加密。公鑰解密。 私鑰和公鑰之間有全映射關系。因此即使想要偽造公鑰的同一時候,也得提供出來偽造的公鑰相應的私鑰。
阮一峰老師翻譯的一篇博客非常通俗易懂,這里附上鏈接數字簽名是什么?

以我的推測,本次問題能夠反映出來例如以下運行過程。
第一次連接時,server將已經生成的公鑰(已存放在本地)發送給連接方,連接方沒有相應的私鑰。

server重裝之后,生成的公鑰發生了變化。連接方存放的還是曾經的公鑰。

因此公鑰不匹配。即認同為server身份已變。

(這樣的嚴格驗證host方式能夠能夠在server/etc/ssh/sshd.conf 文件里改變。SSH下know_hosts的作用(轉)

解決方法是將原來的公鑰給刪除了,也就是一切重頭再來。又開始了第一次的工作。

ssh登陸憑證

hicode@test:~/.ssh$ tree -h
.
├── [1.9K]  known_hosts             自己的私鑰+其它已連接的server公鑰存放
└── [ 393]  known_hosts.pub         公鑰存放

0 directories, 2 files

我沒有找到對known_hosts 的一些看法。由於大家都在說里面存放了公鑰,可是我查看的時候好像檔案開頭有private key 的存在,懷疑這個文件里還夾雜了自己私鑰內容。

兩個文件部分內容已用... 來代替
file_content: known_hosts

-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA64x5NuQz1PY3tLHwwu/hdr3f2o5BDcw5u7l/493iEKR3Mbpa
......
-----END RSA PRIVATE KEY-----
|1|KdYUlhdX3x97z38/nKEQQyvBv9k=|ZTzOP8JPfk+kAOQzbnVA9GVmCCs= ecdsa-sha2-nistp256 A...
|1|TNRQAp+HHSztEPGOlckiWCJFxQ8=|+XkgfL/fd/v4cHMgmB47dQiHTgU= ecdsa-sha2-nistp256 AA...

為了試驗分別連接了兩台設備,果然是自己的私鑰 +已加入信任的公鑰集合。

file_content:know_hosts.pub 存放了自己的公鑰

ssh-rsa AAAAB3NzaC1yc2....p hicode@test

相同能夠測試一下。發現帶有已連接server公鑰文件的know_hosts文件修改了兩次,而自己的公鑰文件一直沒有修改。

hicode@test:~/.ssh$ ls -lh known_hosts*
-rw-r--r-- 1 hicode hicode 2.1K Jul  1 05:26 known_hosts
-rw-r--r-- 1 hicode hicode  393 Jun 23 16:16 known_hosts.pub
hicode@test:~/.ssh$ date 
Wed Jul  1 05:58:58 CST 2015

免password登陸的過程:
免password登陸是說,server相信就是真實的客戶機。

那么肯定server上要有關於真實的定義,這里的真實是指server上存放了關於客戶機的公鑰(server上肯定不會存放人家的私鑰)。僅僅要驗證對方的公鑰和server上的一致就可以。


步驟例如以下:

  1. server發送字符串str(應該是未加密明文吧)給客戶機。
  2. 客戶機將str用自己的私鑰加密后的結果發送給server。

  3. server用待驗證的客戶機公鑰解密后發現一致。

    說明白實是對方。通過。

以上步驟的實現,須要用戶事先將自己的公鑰發送給server留作記錄。網上有ssh-keygen 方式生成后傳給server的,非常easy。

可是。我不明白的是know_host.pub 中的公鑰不是已經存在了嘛,為什么還要必須生成另外一個公鑰id_rsa.pub 呢。

。莫非免登陸的時候。協議中規定用的不是know_hosts.pub 中的公鑰?

最后附上另外一篇阮老師的文章。非常清楚的講了ssh登陸 過程,就是沒有解答我的困惑。
SSH原理與運用(一):遠程登錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM