必须搭建专用ca并分别签发用户与主机证书:ca需物理隔离、密钥强密码保护且离线备份;用户证书用-n指定用户名、-v设有效期,主机证书必加-h标志;服务端配置trustedusercakeys和hostcertificate,客户端自动识别同名证书。

一、搭建专用 SSH 证书颁发中心(CA)
选一台物理隔离、不对外开放 SSH 服务的加固服务器作为 CA,仅用于签发和吊销证书。它不参与日常运维,安全性必须优先保障。
生成高强度 CA 密钥对,并设密码保护:
- ssh-keygen -t rsa -b 4096 -f /etc/ssh/ca_key -C "ssh-ca@company"
- 私钥权限必须为 600,并离线备份;公钥提取命令:ssh-keygen -L -f /etc/ssh/ca_key.pub
- 将输出中以 ssh-rsa AAAA... 开头的整行内容保存为 /etc/ssh/ca_key.pub
该公钥后续需部署到所有目标服务器,供 TrustedUserCAKeys 指令引用。
二、分别签发用户证书与主机证书
SSH 证书分两类:用户证书验证“你是谁”,主机证书验证“你连的是不是真机器”。两者配合才能防中间人攻击,缺一不可。
用户证书签发示例(由 CA 执行):
- ssh-keygen -s /etc/ssh/ca_key -I user-alice -n alice -V +4w id_ed25519.pub
-
-n alice表示授权登录用户名为alice -
-V +4w设定证书有效期为 4 周,支持+24h、+90d等格式 - 生成文件:
id_ed25519-cert.pub,需与私钥同名且放同一目录
主机证书签发示例(在每台目标服务器上执行):
- ssh-keygen -s /path/to/ca_key -I web01 -h -V +52w /etc/ssh/ssh_host_rsa_key.pub
-
-h表示签发主机证书;生成ssh_host_rsa_key-cert.pub - 更新
/etc/ssh/sshd_config:HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub - 重启前务必执行
sshd -t校验配置语法
三、服务端配置信任与客户端自动使用
在每台目标服务器上完成以下配置,使 SSH 守护进程信任 CA 并启用证书验证:
- 把 CA 公钥写入
/etc/ssh/ca_key.pub,并在sshd_config中添加:TrustedUserCAKeys /etc/ssh/ca_key.pubPubkeyAuthentication yesPasswordAuthentication noRevokedKeys /etc/ssh/revoked_keys(可选,用于吊销) - 确保
~/.ssh/authorized_keys不再用于用户认证——证书机制下该文件不再生效 - 客户端只需将私钥(如
id_ed25519)和对应证书(id_ed25519-cert.pub)放在~/.ssh/下,文件名严格匹配 - OpenSSH 7.2+ 会自动识别并携带证书连接,无需额外参数;也可显式指定:
ssh -o CertificateFile=~/.ssh/id_ed25519-cert.pub alice@web01
四、生命周期管理与安全加固要点
证书机制的核心价值在于可控、可审计、可快速失效,而非单纯“免密”。
- 禁用长期有效证书,建议用户证书有效期控制在 24 小时至 4 周,主机证书可稍长(如 1 年),但需定期轮换 CA 自身
- 所有证书必须带唯一标识(
-I参数),便于日志审计与吊销追踪 - 时间同步至关重要:所有服务器与 CA 必须运行 NTP,否则证书因时间偏差被拒绝
- 批量部署推荐 Ansible:
copy模块分发证书 +file模块修复.ssh目录权限(700)与证书文件权限(600) - 生产环境建议配合 Jumpserver 等堡垒机,实现策略驱动签发、会话审计与双因素增强











