问题描述&解决

远端重置 SSH 后,连接失败,提示错误内容如下

1
2
3
4
5
6
7
8
9
10
11
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is 36:68:a6:e6:43:34:6b:82:d7:f4:df:1f:c2:e7:37:cc.
Please contact your system administrator.
Add correct host key in /u/xlian008/.ssh/known_hosts to get rid of this message.
Offending key in /u/xlian008/.ssh/known_hosts:2RSA host key for 116.62.242.180 has changed and you have requested strict checking.
Host key verification failed. 

根据描述,本地 known_hosts 下已记录远端的公钥信息,需要删除掉本地的记录

解决方式一

手动删除 ~/.ssh/known_hosts 文件中对应内容

解决方式二

命令行删除

1
ssh-keygen -f "~/.ssh/known_hosts" -R 116.62.242.180

删除 known_hosts 中对应记录依然连接不上,提示错误内容如下

1
2
3
4
5
ssh root@116.62.242.180
The authenticity of host '116.62.242.180 (116.62.242.180)' can't be established.
ECDSA key fingerprint is SHA256:tAdae+FbyMnCDJdVp7BpN+qhrOGm6PWDdd8BPIImmOU.
Are you sure you want to continue connecting (yes/no)?
Host key verification failed.

解决方式

通过信息提示中的指纹获取远端公钥信息,并加入到 known_hosts 文件中

S1.获取公钥

1
ssh-keyscan -t ECDSA -p 22 116.62.242.180

S2.将返回的内容追加到 known_hosts 文件内容中

SSH 之 konw_hosts

为什么有 known_hosts 这个设计呢?

首先了解 SSH 连接建立的过程:

  1. 客户端发起 SSH 连接请求
  2. 服务端传送公钥给客户端: 此时客户端接收到服务端的公钥
  3. 客户端记录/对比服务器的公钥并记录到~/.ssh/known_hosts : 若客户端第一次接收到此服务器,则将服务器的公钥记录在 ~/.ssh/known_hosts 。若已经记录过,则会进行对比,如果有差异则报错。
  4. 客户端传送公钥数据到服务端: 此时服务端接收到客户端的公钥
  5. 开始双向加解密来验证登陆权限: 服务端传送数据时用客户端的公钥加密,那么客户端接收用自己的私钥解密;客户端传送数据时用客户端的公钥加密,同理服务端接收用自己的私钥解密。

在实际操作中,有这样的安全问题,有人截获了登陆请求,伪造了公钥,那么真的难以分辨出来。所以在第一次连接某个ip地址时,都会有指纹信息的提示,这个步骤通常情况下是需要人工校验的

1
2
3
4
ssh root@116.62.242.180
The authenticity of host '116.62.242.180 (116.62.242.180)' can't be established.
ECDSA key fingerprint is SHA256:tAdae+FbyMnCDJdVp7BpN+qhrOGm6PWDdd8BPIImmOU.
Are you sure you want to continue connecting (yes/no)?

为了减少这样的安全风险,连接过的 ip 及其对应公钥信息就存储在客户端本地了,可靠性更高,这就是 known_hosts 的设计目的

 

那么首次连接时,如何校验指纹信息是否正确呢?

(这个过程不是必须的,为安全起见,建议校验正确再进行 SSH 连接)

需要使用 ssh-keygen 工具来计算公钥指纹

进入服务器,**/etc/ssh** 下有几种密钥,这些文件是在安装 openssh-server 后生成的,SSH 服务就是使用这些密钥进行加密和解密的

1
2
3
4
5
6
7
8
9
$ ls -1 /etc/ssh/ssh_host* 
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_dsa_key.pub
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ecdsa_key.pub
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_rsa_key.pub

在服务器通过如下命令生成密钥指纹

1
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub

-E 默认为 rsa,根据需要可以改为 ecdsa、md5.. 同时文件也要对应
-l 默认为 sha256

SSH 之 ssh-keyscan

ssh-keyscan 命令是一个收集大量主机公钥的使用工具。可以使用该工具生成和验证 ssh 的 known_hosts 文件。

使用语法如下,详细参数见文档

1
ssh-keyscan [-46Hv] [-f file] [-p port] [-T timeout] [-t type] [host | addrlist namelist] ...

在上面的遇到的问题中,type 根据错误提示知道远端用的是 ECDSA 密钥类型,其他可能有 rsa1rsadsa,这些都是数字签名算法。几者的差别可以见此讨论

这个工具很有用,考虑如果在大量机器组成的集群可以实现自动化进行 SSH 访问和部署工作。