openssh私有ca认证需“一签、双证、两端控”:离线生成ca私钥,分别签发用户证书(带-n用户名)和主机证书(加-h参数),服务端禁用密码与传统密钥登录,客户端自动加载同名-cert.pub证书实现零配置安全连接。

服务器 SSH 证书颁发机构(CA)认证不是配几个文件就完事,而是用一个可信根来统一管住所有用户身份和主机身份。核心是“一签、双证、两端控”:一个离线生成的 CA 私钥,分别签发用户证书和主机证书,服务端与客户端都明确配置验证逻辑,缺一不可。
建一个真正可信的 CA 根
CA 是整个体系的信任起点,必须物理隔离、密码保护、严格权限:
- 在不联网的加固机器上执行:ssh-keygen -t ed25519 -f /etc/ssh/ca_key -N "强密码" -C "ssh-ca@prod",私钥绝不上传、不进 Git、不放服务器
- 提取公钥:ssh-keygen -L -f /etc/ssh/ca_key.pub,取输出中以 ssh-ed25519 AAAA... 开头的整行,保存为 /etc/ssh/ca_key.pub
- 该公钥是唯一需分发的文件,部署到所有目标服务器的 /etc/ssh/ca_users.pub(用户证书验证)和 /etc/ssh/ca_hosts.pub(主机证书验证)
必须分开签发两类证书
用户证书和主机证书用途不同,OpenSSH 强制区分,混用会失败:
-
用户证书(用于登录):用员工已有公钥(如 id_ed25519.pub)签名,带 -n 限定用户名、-V 设有效期、-I 填可读标识
ssh-keygen -s /etc/ssh/ca_key -I "alice-2026q2" -n alice -V +7d id_ed25519.pub -
主机证书(用于防中间人):用服务器自身主机公钥(如 /etc/ssh/ssh_host_ed25519_key.pub)签名,必须加 -h,-n 填主机名或通配符
ssh-keygen -s /etc/ssh/ca_key -I "web-prod" -h -n "*.prod.example.com" -V +26w /etc/ssh/ssh_host_ed25519_key.pub
服务端配置要堵死回退路径
只签发证书没用,必须让 sshd 主动拒绝非证书登录:
- 编辑 /etc/ssh/sshd_config,确保包含:
TrustedUserCAKeys /etc/ssh/ca_users.pub
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysCommand none(禁用传统 authorized_keys 回退) - 检查权限:/etc/ssh/ 目录不能有组/其他写权限;证书文件权限为 600;公钥文件为 644
- 校验并重启:sshd -t && systemctl restart sshd,查日志确认出现 "certificate authority loaded"
客户端自动识别,无需改命令
用户只需把私钥和对应证书放在默认位置,OpenSSH 7.2+ 会自动加载:
- 私钥 ~/.ssh/id_ed25519 和证书 ~/.ssh/id_ed25519-cert.pub 必须同名匹配(后缀固定为 -cert.pub)
- 连接时直接运行 ssh alice@web01,无需额外参数;也可在 ~/.ssh/config 中指定:
Host *.prod.example.com
CertificateFile ~/.ssh/id_ed25519-cert.pub - 推荐禁用 TOFU:StrictHostKeyChecking yes + UserKnownHostsFile /dev/null,完全依赖主机证书验证











