SSH 认证失败 (从问题理解 SSH 认证)
问题描述&解决
远端重置 SSH 后,连接失败,提示错误内容如下
1 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
根据描述,本地 known_hosts
下已记录远端的公钥信息,需要删除掉本地的记录
解决方式一
手动删除 ~/.ssh/known_hosts
文件中对应内容
解决方式二
命令行删除
1 | ssh-keygen -f "~/.ssh/known_hosts" -R 116.62.242.180 |
删除 known_hosts
中对应记录依然连接不上,提示错误内容如下
1 | ssh root@116.62.242.180 |
解决方式
通过信息提示中的指纹获取远端公钥信息,并加入到 known_hosts
文件中
S1.获取公钥
1 | ssh-keyscan -t ECDSA -p 22 116.62.242.180 |
S2.将返回的内容追加到 known_hosts
文件内容中
SSH 之 konw_hosts
为什么有 known_hosts 这个设计呢?
首先了解 SSH 连接建立的过程:
- 客户端发起 SSH 连接请求
- 服务端传送公钥给客户端: 此时客户端接收到服务端的公钥
- 客户端记录/对比服务器的公钥并记录到~/.ssh/known_hosts : 若客户端第一次接收到此服务器,则将服务器的公钥记录在 ~/.ssh/known_hosts 。若已经记录过,则会进行对比,如果有差异则报错。
- 客户端传送公钥数据到服务端: 此时服务端接收到客户端的公钥
- 开始双向加解密来验证登陆权限: 服务端传送数据时用客户端的公钥加密,那么客户端接收用自己的私钥解密;客户端传送数据时用客户端的公钥加密,同理服务端接收用自己的私钥解密。
在实际操作中,有这样的安全问题,有人截获了登陆请求,伪造了公钥,那么真的难以分辨出来。所以在第一次连接某个ip地址时,都会有指纹信息的提示,这个步骤通常情况下是需要人工校验的
1 | ssh root@116.62.242.180 |
为了减少这样的安全风险,连接过的 ip 及其对应公钥信息就存储在客户端本地了,可靠性更高,这就是 known_hosts 的设计目的
那么首次连接时,如何校验指纹信息是否正确呢?
(这个过程不是必须的,为安全起见,建议校验正确再进行 SSH 连接)
需要使用 ssh-keygen
工具来计算公钥指纹
进入服务器,**/etc/ssh** 下有几种密钥,这些文件是在安装 openssh-server 后生成的,SSH 服务就是使用这些密钥进行加密和解密的
1 | $ ls -1 /etc/ssh/ssh_host* |
在服务器通过如下命令生成密钥指纹
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
密钥类型,其他可能有 rsa1
、rsa
、dsa
,这些都是数字签名算法。几者的差别可以见此讨论。
这个工具很有用,考虑如果在大量机器组成的集群可以实现自动化进行 SSH 访问和部署工作。