如何安全获取、验证并保存SSH known_hosts中的主机公钥以避免首次连接交互
如何安全获取、验证并保存SSH known_hosts中的主机公钥以避免首次连接交互
这个场景太常见了——刚部署完新实例,首次SSH连接就弹出主机真实性验证的提示,既要自动化跳过这个交互,又不能傻乎乎地直接关掉验证(那可是给中间人攻击开门啊)。下面是几个安全靠谱的操作步骤:
第一步:从可信渠道获取主机公钥/指纹
首先得拿到目标主机的真实公钥或指纹,这是安全的核心,必须从绝对可信的来源获取:
- 如果能直接访问目标主机的本地控制台(比如云服务商的Web管理终端、物理机的本地shell),直接在主机上执行命令导出公钥或指纹:
- 查看RSA公钥指纹:
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub - 查看ED25519公钥指纹(现在很多新系统用这个更安全):
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub
也可以直接查看完整公钥内容:cat /etc/ssh/ssh_host_rsa_key.pub(对应RSA),把内容记下来。
- 查看RSA公钥指纹:
- 如果是云服务商提供的实例,大部分厂商会在实例详情页面直接展示SSH主机的公钥指纹(比如AWS EC2、阿里云ECS等),直接从官方控制台拿就好,这是最安全的方式。
第二步:验证公钥/指纹的真实性
拿到公钥/指纹后,一定要做验证:
- 如果是手动第一次连接,当SSH弹出提示时,把提示里的指纹和你提前拿到的对比,完全一致再输入
yes,这次之后主机信息就会自动保存到~/.ssh/known_hosts里,下次就不会再提示了。 - 如果要自动化处理,先通过
ssh-keyscan命令获取目标主机的公钥:
执行后会输出类似这样的内容:ssh-keyscan <你的主机名> <主机IP地址><主机名> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD...(后面是完整公钥)
把这段输出里的公钥部分,和你从可信渠道拿到的主机公钥对比,确认完全一致,确保没有被篡改。
第三步:安全写入known_hosts文件
验证通过后,就可以把公钥写入本地的known_hosts文件,避免后续交互:
- 直接追加到用户目录下的known_hosts:
ssh-keyscan <你的主机名> <主机IP地址> >> ~/.ssh/known_hosts - 如果是系统级的配置(所有用户都生效),可以写入
/etc/ssh/ssh_known_hosts:ssh-keyscan <你的主机名> <主机IP地址> >> /etc/ssh/ssh_known_hosts
重要提醒!绝对不要做的事
千万别图省事就直接在SSH配置里加StrictHostKeyChecking no或者UserKnownHostsFile /dev/null——这种操作会完全跳过主机真实性验证,任何中间人都能伪装成你的目标主机,风险极高,绝对不可取。
备注:内容来源于stack exchange,提问作者Eugen Konkov
相关产品推荐
相关产品推荐

