CA私钥必须离线生成且永不上传,应在物理隔离、无网络连接的机器上执行ssh-keygen -t ed25519 -f ssh_ca -N "强密码" -C "ssh-ca@prod";生成后立即设权限600,仅root可读,仅分发ssh_ca.pub;服务端须配置TrustedUserCAKeys、PubkeyAuthentication yes和AuthorizedKeysCommand none三行关键指令并重启sshd;用户证书签发必须指定-V +7d(短时效)和-n "alice"(用户名约束),客户端自动识别同名-cert.pub文件,私钥仍需保留密码以保障双因子安全。

CA私钥必须离线生成且永不上传
CA私钥是整个信任链的根,一旦泄露,所有签发的证书都不可信。不能在服务器或CI/CD节点上生成,必须在物理隔离、无网络连接的机器上执行:ssh-keygen -t ed25519 -f ssh_ca -N "强密码" -C "ssh-ca@prod"。生成后立刻设权限为600,仅限 root 本地读取;ssh_ca.pub才是唯一需要分发的文件,其他任何地方都不该出现ssh_ca。
服务端必须禁用传统 authorized_keys 回退路径
只签发证书没用,服务端不强制验证就等于形同虚设。关键配置只有三行,缺一不可:
-
TrustedUserCAKeys /etc/ssh/ca_users.pub—— 指向 CA 公钥,不是证书,也不是私钥 PubkeyAuthentication yes-
AuthorizedKeysCommand none—— 这句最关键,它关闭了通过authorized_keys文件绕过证书验证的可能性
改完务必运行sshd -t校验语法,再systemctl restart sshd;重启后查日志:journalctl -u sshd | grep certificate,确认看到Loaded CA key字样。
用户证书必须带时效与用户名约束
短效性不是靠人工轮换密钥,而是由证书本身强制控制。签发时必须指定-V和-n:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
-V +7d:证书7天后自动失效,避免用-V 20261001:20261008这种绝对时间,防止服务器时钟偏差导致拒认 -
-n "alice":严格限定登录用户名,不能是root或通配符;支持逗号分隔多个名,如-n "alice,bob" -
-I "alice-2026q4":提供可读标识,审计日志里直接显示,便于追踪谁、何时、为何签发
命令示例:ssh-keygen -s ssh_ca -I "alice-2026q4" -n "alice" -V +7d ~/.ssh/id_ed25519.pub,输出为id_ed25519-cert.pub,需和原私钥放同一目录。
客户端无需改命令,但必须保证证书与私钥同目录
OpenSSH 会自动识别同名的-cert.pub文件,不需要加-o CertificateFile=...参数。只要~/.ssh/id_ed25519和~/.ssh/id_ed25519-cert.pub都在,ssh alice@host就会自动走证书流程。
容易被忽略的是:证书不替代私钥密码(passphrase)。如果私钥本身有密码,登录时仍需输入——这是双因子保障,不是缺陷。别为了“免输”而生成无密码私钥,那等于把CA体系的安全性降级回裸密钥模式。










