SSH密钥指纹校验自动化通过脚本实现批量采集、比对与同步,涵盖快速获取单机指纹、跨服务器审计报告生成、Ansible驱动的密钥轮换闭环及客户端known_hosts安全更新。

服务器 SSH 密钥指纹校验自动化,核心是把“人眼比对”变成“脚本确认”,既防中间人攻击,又省重复劳动。关键不在于跳过警告,而是在可信前提下批量验证、记录、同步。
快速获取所有密钥的 SHA256 指纹
直接在目标服务器上运行以下命令,一次性列出 ed25519、RSA、ECDSA 三类主机密钥的 SHA256 指纹:
for f in /etc/ssh/ssh_host_*_key.pub; do [ -f "$f" ] && ssh-keygen -E sha256 -lf "$f" | awk '{printf "%-15s %s\n", $4, $2}'; done
输出类似:
ED25519 SHA256:Abc123xyz...
RSA SHA256:Def456uvw...
ECDSA SHA256:Ghi789rst...
建议将结果重定向保存为 fingerprints-$(hostname)-$(date +%F).txt,便于归档比对。
跨服务器批量采集并生成比对报告
用简单 Shell 脚本 + SSH 免密登录,从控制机统一拉取多台服务器的指纹:
- 准备 IP 列表文件 servers.txt(每行一个 IP 或主机名)
- 执行循环采集:
while read host; do echo "== $host =="; ssh "$host" 'for f in /etc/ssh/ssh_host_*_key.pub; do [ -f "$f" ] && ssh-keygen -E sha256 -lf "$f" 2>/dev/null | awk "{print \$4, \$2}"; done' | sed 's/^/ /'; echo; done < servers.txt > audit-report.log - 输出含主机名、算法类型、SHA256 指纹,结构清晰,可直接 diff 或导入表格比对
Ansible 自动化轮换+指纹同步闭环
密钥不是只查不换。用 Ansible 实现“生成→分发→重启→验证”全链路:
- 在 control node 预生成新密钥:
ssh-keygen -t ed25519 -f files/ssh_host_ed25519_key -N "" - playbook 中用 copy 模块推送私钥和公钥,严格设置权限(mode: '0600' 和 '0644')
- 用 systemd 重启 sshd,并加 ignore_errors: no 确保失败即止
- 任务末尾加一步验证:
command: ssh-keygen -E sha256 -lf /etc/ssh/ssh_host_ed25519_key.pub
register: new_fingerprint
changed_when: false - 将 {{ new_fingerprint.stdout }} 提取后写入中央指纹库或通知平台
客户端 known_hosts 安全更新策略
密钥一换,客户端会报错。不能靠 StrictHostKeyChecking=no 糊弄过去,应主动管理:
- 轮换前,用 ssh-keyscan -t ed25519 $host 提前抓取新指纹
- 用 Ansible 的 known_hosts 模块批量更新各管理机的 ~/.ssh/known_hosts,指定 state: present 和 key 内容
- 对高敏环境,可配合 ssh-keygen -R $host 清旧再写新,避免残留冲突
- 测试阶段可用 ssh -o UpdateHostKeys=yes $host 让客户端自动合并(仅限 OpenSSH 7.6+)

















