zoukankan      html  css  js  c++  java
  • 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原理与运用(一):远程登录

  • 相关阅读:
    判断浏览器是否安装ActiveX控件
    浏览器判断及IE版本区分
    获取应用程序根目录
    C#读取csv通用类
    office文档转Txt文档
    合理使用.NET异常处理
    iis操作
    vim配置
    Spring的Annotation使用注意
    JdbcTemplate API备忘
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5096590.html
Copyright © 2011-2022 走看看