SSH CA证书认证体系为批量管理服务器提供了一种中心化信任机制。管理员先创建一对CA密钥,然后使用CA私钥对用户公钥进行签名,生成带有有效期和用户名限制的SSH证书。服务器配置TrustedUserCAKeys后,任何持有该CA签发证书的用户都能登录,不再需要在每台主机上维护authorized_keys文件。

一、SSH传统认证的痛点与CA认证思路
在传统SSH公钥认证中,每个用户需要把个人公钥写入目标服务器的authorized_keys文件。服务器数量较少时这种方式还能接受,但当服务器达到几十台甚至上百台后,公钥分发、撤销、审计就成了非常繁琐的工作。新员工入职需要在所有相关机器上追加公钥,离职员工则需要逐台清理,一旦遗漏就可能留下长期有效的访问通道。
SSH CA认证借鉴了PKI数字证书的思路。管理员生成一对CA密钥,使用CA私钥对用户公钥签名,生成一份带有时间戳、身份标识、权限限制的证书文件。服务器配置为信任该CA的公钥,用户登录时提交证书而不是原始公钥。服务器用CA公钥校验证书签名,再检查证书中的principal是否匹配登录用户名、证书是否在有效期内。证书过期后自动失效,即使没有及时删除公钥也能阻断旧凭证的使用。
这种方式把信任锚点从每台服务器分散维护的authorized_keys统一到了CA公钥上。管理员只需要保护CA私钥,签发短期证书即可控制访问。对于拥有大量服务器和频繁人员变动的团队,SSH CA可以显著降低运维成本,同时提升安全性。
二、SSH CA证书类型与证书字段解析
OpenSSH的证书体系支持两种证书:用户证书和主机证书。用户证书用于证明某个用户公钥的身份,主机证书则用于证明服务器身份。本文重点介绍用户证书,但主机证书的原理相同,可以用于防止主机密钥首次连接时的指纹确认问题。
SSH证书本质上是在原始公钥前面附加了一段由CA签名的元数据。使用ssh-keygen签发证书后,会生成一个以-cert.pub结尾的证书文件。证书中最重要的字段包括:
- 类型:区分用户证书和主机证书。
- 公钥:被CA签名的原始用户公钥。
- 序列号:用于吊销列表匹配的唯一编号。
- 有效期:从颁发时间到过期时间的时间窗口。
- principal:允许登录的用户名列表,可以是单个用户名或多个逗号分隔的用户名。
- 扩展选项:可以限制证书只能用于特定功能,例如禁止端口转发、禁止pty分配等。
下面通过命令查看一张已经签发的用户证书内容,能够直观看到这些字段。
ssh-keygen -L -f ~/.ssh/id_ed25519-cert.pub
管理员可以为同一个用户公钥签发出不同principal的证书。例如一个开发人员可能被允许以deploy用户身份登录生产服务器,但只能以普通用户身份登录测试环境。这种细粒度的身份映射比传统authorized_keys灵活很多。
三、搭建SSH CA认证环境
搭建SSH CA认证环境主要分为创建CA密钥、签发用户证书、配置服务器信任三步。第一步需要在一个安全的离线环境或受保护的管理主机上生成CA密钥。CA私钥是信任链的根,必须妥善保管,建议使用硬件安全模块或加密文件存储。
使用ssh-keygen生成CA密钥的命令如下。这里使用ed25519算法,密钥文件和公钥文件分别保存。
ssh-keygen -t ed25519 -f /etc/ssh/ca_user -C "User CA"
生成后会在指定路径得到ca_user私钥和ca_user.pub公钥。接下来对目标用户的公钥签发证书。例如用户张san已经生成了自己的id_ed25519.pub公钥,管理员拿到该公钥后执行以下命令签发8小时有效的证书,允许以zhangsan和root两个用户名登录。
ssh-keygen -s /etc/ssh/ca_user -I user-zhangsan -n zhangsan,root -V +8h /home/zhangsan/.ssh/id_ed25519.pub
命令中的-s指定CA私钥,-I指定证书序列号标识,-n指定principal列表,-V指定有效期。签发完成后,会在原公钥目录下生成id_ed25519-cert.pub证书文件。用户登录时OpenSSH客户端会自动识别同目录下的证书文件并提交给服务器。
服务器端需要在sshd_config中配置TrustedUserCAKeys,指向CA公钥路径。修改配置后重启sshd服务使配置生效。
echo 'TrustedUserCAKeys /etc/ssh/ca_user.pub' | sudo tee -a /etc/ssh/sshd_config sudo systemctl restart sshd
完成以上配置后,用户即可通过ssh命令正常登录。服务器会验证证书签名、有效期和principal,全部通过后接受登录。传统authorized_keys文件中不需要再包含该用户的公钥,维护工作大幅简化。
四、证书吊销与生命周期管理
短期证书是SSH CA认证体系的重要优势,但生产环境中仍可能需要在证书到期前主动吊销,例如员工离职或证书私钥泄露。OpenSSH提供了密钥吊销列表机制,可以记录需要撤销的证书序列号,服务器在认证时发现证书命中KRL就直接拒绝登录。
先生成一个吊销列表文件,然后用以下命令把证书序列号加入吊销列表。
ssh-keygen -k -f /etc/ssh/krl -s /etc/ssh/ca_user < revoked-cert-list.txt
注意上面代码中的输入重定向符号<需要在实际命令中保留。revoked-cert-list.txt文件中包含要吊销的证书序列号或证书文件内容。服务器需要额外配置RevokedKeys字段指向KRL文件。
echo 'RevokedKeys /etc/ssh/krl' | sudo tee -a /etc/ssh/sshd_config sudo systemctl restart sshd
证书过期时间不宜设置过长。对于需要长期运行的自动化任务,可以采用更细粒度的续期机制,例如由配置管理系统定时签发新证书。管理员还应当定期审计CA私钥的使用记录,确保证书签发动作可追溯。
五、安全加固与实际生产建议
SSH CA认证体系虽然简洁,但安全性高度依赖CA私钥的保管。一旦CA私钥泄露,攻击者可以为自己签发任意principal和有效期的证书,等同于拥有所有服务器的入口。因此CA私钥应当与日常业务主机隔离,推荐放在离线签名机或专用密码管理系统中。
证书的扩展选项也能进一步提高安全性。签发证书时可以使用-O参数关闭端口转发、pty分配或强制指定源地址。例如以下命令签发一张禁止端口转发和禁止pty的证书。
ssh-keygen -s /etc/ssh/ca_user -I user-ops -n ops -V +4h -O no-port-forwarding -O no-pty /home/ops/.ssh/id_ed25519.pub
另外,建议在服务器上同时开启日志记录,将证书序列号、登录时间、来源IP等信息写入系统日志,配合集中日志平台进行访问审计。对于已经兼容的主机环境,还可以引入多级CA结构,将不同业务线、不同环境的信任范围隔离,避免单张CA证书影响面过大。
SSH CA证书认证体系非常适合服务器数量多、团队人员流动频繁的场景。它把分散的公钥管理集中到CA上,通过短期证书、principal限制和吊销列表实现精细的访问控制。虽然需要额外维护一台CA签名机,但相比传统authorized_keys方式带来的安全隐患和运维成本,整体收益非常明显。