Fork me on GitHub

解决 ssh 时 Host key verification failed 的错误

如果因为某种原因( 服务器系统重装、服务器间IP地址交换、DHCP、虚拟机重建、中间人劫持 ),这里笔者是因为虚拟机重建的缘故,该IP地址的公钥改变了,当使用 SSH 连接的时候会出现下面的错误:

SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机

1
2
3
The authenticity of host '192.168.164.23 (192.168.164.23)' can't be established.
RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
Are you sure you want to continue connecting (yes/no)?
StrictHostKeyChecking

SSH 对主机的 public_key 的检查等级是根据 StrictHostKeyChecking 变量来配置的。简单所下三种配置值:

StrictHostKeyChecking=no

最不安全的级别,相对安全的内网测试时建议使用。如果连接 server 的 key 在本地不存在,那么就自动添加到文件中( 默认是known_hosts ),并且给出一个警告。

StrictHostKeyChecking=ask

默认的级别。如果连接和 key 不匹配,给出提示,并拒绝登录。

StrictHostKeyChecking=yes

最安全的级别,如果连接与 key 不匹配,就拒绝连接,不会提示详细信息。

在内网的进行的一些测试,为了方便,选择最低的安全级别。在 .ssh/config(或者 /etc/ssh/ssh_config )中配置:

1
2
3

Host *
StrictHostKeyChecking no
防止远程主机公钥改变导致 SSH 连接失败

当确认中间人劫持风险比较小的情况下,才可以使用下面的方法,禁用 SSH 远程主机的公钥检查。 SSH 客户端提供一个 UserKnownHostsFile 配置,允许指定不同的 known_hosts 文件。那么将 known_hosts 指向不同的文件,就不会造成公钥冲突导致的中断。

.ssh/config(或者 /etc/ssh/ssh_config )中配置:

1
2
Host *
UserKnownHostsFile /dev/null

综上
.ssh/config(或者 /etc/ssh/ssh_config )中配置:

1
2
3
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

或者将两个命令结合起来使用

1
ssh-copy-id -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /root/.ssh/id_rsa.pub root@client
解决 ssh-copy-id 时 Host key verification failed 的错误

同样第一次连接需要

1
ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@client

以后就可以直接使用 ssh client 连接了

然后 scp 复制文件也是同样的道理

1
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -r /var/tmp/performance/moo.dat root@client:/var/tmp/
配置 SSH 集群参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 集群信息,配置每台机器的 /etc/hosts 文件

10.1.1.107 master
10.1.1.108 slave1
10.1.1.109 slave2


# 安装 Openssh server

sudo apt-get install openssh-server

# 登录 master

ssh-keygen -t rsa


# 需要让机器间都能相互访问,就把 master 中 .ssh 目录下所有文件发送到所有机器,传输公钥可以用 scp 或者 ssh-copy-id

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp -r ~/.ssh/ slave1:~/
scp -r ~/.ssh/ slave2:~/

ssh master
ssh slave1
ssh slave2

如果登陆测试不成功,则可能需要修改文件 authorized_keys 的权限( 权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用 RSA 功能 )

chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
坚持原创技术分享,您的支持将鼓励我继续创作!