直接回答:SSH 证书登录是在密钥登录的基础上加了一层 CA。服务器不再保存每个人的公钥,只信任 CA 的公钥;用户拿 CA 签发的证书登录,有效期到了自动失效,人离职也不用逐台清理。多服务器、多用户,或者经常要发临时访问权限的场景,比手工分发公钥省事得多。
三种登录方式的取舍
| 方式 | 优点 | 缺点 |
|---|---|---|
| 密码登录 | 不用配置 | 容易被暴力破解,脚本化困难,多机器要记多个密码 |
| 密钥登录 | 免密、可自动化 | 每台服务器都要存每个人的公钥;人一多、机器一多,增删用户很痛苦 |
| 证书登录 | 服务器只认 CA,签发和吊销集中管理,可设置有效期 | 需要自己维护一台 CA |
密钥登录最大的问题不是安全,而是运维成本:新同事入职要在 N 台机器上加公钥,离职要在 N 台机器上删公钥,漏一台就是一个后门。证书登录把这件事收敛成"CA 签一次证书"。
角色和流程
- CA:持有私钥,用来签发证书,自己不上任何服务器;
- 服务器:持有 CA 的公钥,声明"我信任这个 CA 签发的用户证书";
- 用户:拿 CA 签发的证书加自己的私钥去登录。
登录时服务器做两件事:验证客户端证书是不是 CA 签的、有没有过期;再确认证书里的 principals 是否被允许登录。
一、生成 CA 的密钥对
1 | # CA 私钥,务必离线保存,不要放在生产服务器上 |
CA 私钥是整套体系的核心:丢了等于所有人都能签发证书,泄露等于所有人都能登录。生产做法是放在离线的机器或者硬件里,只在签发时拿出来。
二、签发服务器证书
服务器自己先有一对主机密钥(安装 sshd 时就有),用 CA 给它的公钥签一个证书:
1 | ssh-keygen -s ca_key \ |
-h表示这是主机证书;-n后面是主机名和 IP,客户端用哪个地址连,证书里就要有哪个;-V +52w是有效期,52 周。
生成的是 /etc/ssh/ssh_host_ed25519_key-cert.pub,放在原公钥旁边即可。
三、签发用户证书
1 | # 用户自己生成密钥对,把公钥交给 CA |
-n是 principals,也就是"这个证书能以哪些身份登录",服务器端配合AuthorizedPrincipalsFile使用;-V +7d表示有效期 7 天,适合临时权限;-I是证书标识,写清是谁签的,日后审计方便。
会生成 id_ed25519-cert.pub,和私钥放在一起,SSH 连接时自动带上。
四、服务器端配置
1 | # /etc/ssh/sshd_config |
把 CA 公钥拷到 /etc/ssh/ca_key.pub,改完先 sshd -t 检查语法,再 systemctl reload sshd。先别急着关密码登录,另开一个终端确认证书能登上来再说。
五、客户端配置
1 | Host app-server |
加了 @cert-authority 之后,换机器也不用清 known_hosts,只要新机器的主机证书还是同一个 CA 签的。
六、废除证书
证书登录最大的好处在这里:不用改服务器配置。
- 临时权限:
-V +1d签一天,过期自动失效; - 提前吊销:用
ssh-keygen -k维护一份 KRL(Key Revocation List),服务器端用RevokedKeys指向它; - 批量失效:如果怀疑 CA 泄露,直接换一把 CA 密钥,给所有服务器重新下发公钥。
比"去 20 台机器上删一个人的公钥"可靠得多。
落地时的几个提醒
- CA 私钥不要放服务器上,最好离线,签证书时手动拷进拷出;
- 证书有效期要短,长期权限用"重新签发"解决,而不是一次签一年;
sshd -t先验证再 reload,配置写错会导致所有连接被拒;- 保留一个已登录的会话作为保险,改完配置在另一个窗口验证;
- Ansible、CI 这类自动化场景,用证书比管理一堆密钥文件省事得多。
本文整理自我自己早先收藏的一篇教程(阮一峰的《SSH 证书登录教程》),按"从生成 CA 到吊销"的顺序重新组织,补上了实践中的注意事项,文字由 AI 协助改写后经我复核。具体参数以 man ssh-keygen 和所用 OpenSSH 版本为准。
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。