ssh報錯 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

今天登錄遠程主機的時候,出現以下的報錯信息緩存

ssh 10.0.0.1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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:k3luf7yHghkZGzn6uZxSGvDwxWXvpbOatzG3GQ3X1AE. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:547 ECDSA host key for 10.0.0.1 has changed and you have requested strict checking. Host key verification failed.

從字面意思來看,就是記錄在/root/.ssh/knows_hosts裏面的公鑰改變了,並且我又要求嚴格驗證,全部報錯安全

解決的方法是 ssh-keygen -f /root/.ssh/known_hosts -R 10.0.0.1 而後從新鏈接服務器

目的是清除你當前機器裏關於你的遠程服務器的緩存和公鑰信息,注意是大寫的字母「R」。ssh

# ssh-keygen -R 10.0.0.1 # Host 10.0.0.1 found: line 547
/root/.ssh/known_hosts updated. Original contents retained as /root/.ssh/known_hosts.old

深究一下測試

# ssh-keygen --help ssh-keygen -H [-f known_hosts_file] ssh-keygen -R hostname [-f known_hosts_file]
-f filename
             指定密鑰文件名。
-H      對 known_hosts 文件進行散列計算。這將把文件中的全部主機名/ip地址替換爲相應的散列值。
             原來文件的內容將會添加一個".old"後綴後保存。這些散列值只能被 ssh 和 sshd 使用。
             這個選項不會修改已經通過散列的主機名/ip地址,所以能夠在部分公鑰已經散列過的文件上安全使用。
-R hostname
             從 known_hosts 文件中刪除全部屬於 hostname 的密鑰。
             這個選項主要用於刪除通過散列的主機(參見 -H 選項)的密鑰。

問題緣由
  用OpenSSH的人都知ssh會把你每一個你訪問過計算機的公鑰(public key)都記錄在~/.ssh/known_hosts。當下次訪問相同計算機時,OpenSSH會覈對公鑰。若是公鑰不一樣,OpenSSH會發出警告。this

  個人服務器作了某些操做(清除了與我本地SSH鏈接協議相關信息),本地的SSH協議信息便失效了。SSH鏈接相同的ip地址時因有鏈接記錄直接使用失效的協議信息去驗證該ip服務器,因此會報錯,使用上述命令即可以清除known_hosts裏舊緩存文件。

spa

  SSH對主機的public_key的檢查等級是根據StrictHostKeyChecking變量來配置的。默認狀況下,StrictHostKeyChecking=ask。簡單所下它的三種配置值:

code

1.StrictHostKeyChecking=no #最不安全的級別,固然也沒有那麼多煩人的提示了,相對安全的內網時建議使用。若是鏈接server的key在本地不存在,那麼就自動添加到文件中(默認是known_hosts),而且給出一個警告。 2.StrictHostKeyChecking=ask 
#默認的級別,就是出現剛纔的提示了。若是鏈接和key不匹配,給出提示,並拒絕登陸。
3.StrictHostKeyChecking=yes
#最安全的級別,若是鏈接與key不匹配,就拒絕鏈接,不會提示詳細信息。

 

我通常是用方法2解決
 
-------------
解決方法 1
-------------

對於我來講,在內網的進行的一些測試,爲了方便,選擇最低的安全級別。在.ssh/config(或者/etc/ssh/ssh_config)中配置:server

StrictHostKeyChecking no
UserKnownHostsFile /dev/null
(注:這裏爲了簡便,將knownhostfile設爲/dev/null,就不保存在known_hosts中了)
---------------
解決方法 2
---------------
vi ~/.ssh/known_hosts

刪除對應ip的相關rsa信息blog

---------------
解決方法 3
---------------
rm known_hosts
相關文章
相關標籤/搜索