直接回答:SSH 证书登录是在密钥登录的基础上加了一层 CA。服务器不再保存每个人的公钥,只信任 CA 的公钥;用户拿 CA 签发的证书登录,有效期到了自动失效,人离职也不用逐台清理。多服务器、多用户,或者经常要发临时访问权限的场景,比手工分发公钥省事得多。

三种登录方式的取舍

方式 优点 缺点
密码登录 不用配置 容易被暴力破解,脚本化困难,多机器要记多个密码
密钥登录 免密、可自动化 每台服务器都要存每个人的公钥;人一多、机器一多,增删用户很痛苦
证书登录 服务器只认 CA,签发和吊销集中管理,可设置有效期 需要自己维护一台 CA

密钥登录最大的问题不是安全,而是运维成本:新同事入职要在 N 台机器上加公钥,离职要在 N 台机器上删公钥,漏一台就是一个后门。证书登录把这件事收敛成"CA 签一次证书"。

角色和流程

  • CA:持有私钥,用来签发证书,自己不上任何服务器;
  • 服务器:持有 CA 的公钥,声明"我信任这个 CA 签发的用户证书";
  • 用户:拿 CA 签发的证书加自己的私钥去登录。

登录时服务器做两件事:验证客户端证书是不是 CA 签的、有没有过期;再确认证书里的 principals 是否被允许登录。

一、生成 CA 的密钥对

1
2
3
# CA 私钥,务必离线保存,不要放在生产服务器上
ssh-keygen -t ed25519 -f ca_key -C "ssh-ca"
# 得到 ca_key(私钥)和 ca_key.pub(公钥,下发给所有服务器)

CA 私钥是整套体系的核心:丢了等于所有人都能签发证书,泄露等于所有人都能登录。生产做法是放在离线的机器或者硬件里,只在签发时拿出来。

二、签发服务器证书

服务器自己先有一对主机密钥(安装 sshd 时就有),用 CA 给它的公钥签一个证书:

1
2
3
4
5
6
ssh-keygen -s ca_key \
-I "host-$(hostname)" \
-h \
-n "$(hostname),$(hostname -I | awk '{print $1}')" \
-V +52w \
/etc/ssh/ssh_host_ed25519_key.pub
  • -h 表示这是主机证书;
  • -n 后面是主机名和 IP,客户端用哪个地址连,证书里就要有哪个;
  • -V +52w 是有效期,52 周。

生成的是 /etc/ssh/ssh_host_ed25519_key-cert.pub,放在原公钥旁边即可。

三、签发用户证书

1
2
3
4
5
6
7
8
9
# 用户自己生成密钥对,把公钥交给 CA
ssh-keygen -t ed25519 -f id_ed25519 -C "your-name"

# CA 签发,有效期 7 天
ssh-keygen -s ca_key \
-I "your-name-$(date +%Y%m%d)" \
-n deploy,ops \
-V +7d \
id_ed25519.pub
  • -n 是 principals,也就是"这个证书能以哪些身份登录",服务器端配合 AuthorizedPrincipalsFile 使用;
  • -V +7d 表示有效期 7 天,适合临时权限;
  • -I 是证书标识,写清是谁签的,日后审计方便。

会生成 id_ed25519-cert.pub,和私钥放在一起,SSH 连接时自动带上。

四、服务器端配置

1
2
3
4
5
6
# /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ca_key.pub
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub

# 可选:限制证书里的 principals 必须匹配某个文件
# AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u

把 CA 公钥拷到 /etc/ssh/ca_key.pub,改完先 sshd -t 检查语法,再 systemctl reload sshd。先别急着关密码登录,另开一个终端确认证书能登上来再说。

五、客户端配置

1
2
3
4
5
6
7
Host app-server
HostName 10.0.0.20
User deploy
IdentityFile ~/.ssh/id_ed25519

# 让客户端也信任服务器的主机证书(可选,省掉 known_hosts 的确认)
@cert-authority *.internal ssh-ed25519 AAAAC3...ca

加了 @cert-authority 之后,换机器也不用清 known_hosts,只要新机器的主机证书还是同一个 CA 签的。

六、废除证书

证书登录最大的好处在这里:不用改服务器配置。

  • 临时权限:-V +1d 签一天,过期自动失效;
  • 提前吊销:用 ssh-keygen -k 维护一份 KRL(Key Revocation List),服务器端用 RevokedKeys 指向它;
  • 批量失效:如果怀疑 CA 泄露,直接换一把 CA 密钥,给所有服务器重新下发公钥。

比"去 20 台机器上删一个人的公钥"可靠得多。

落地时的几个提醒

  1. CA 私钥不要放服务器上,最好离线,签证书时手动拷进拷出;
  2. 证书有效期要短,长期权限用"重新签发"解决,而不是一次签一年;
  3. sshd -t 先验证再 reload,配置写错会导致所有连接被拒;
  4. 保留一个已登录的会话作为保险,改完配置在另一个窗口验证;
  5. Ansible、CI 这类自动化场景,用证书比管理一堆密钥文件省事得多。

本文整理自我自己早先收藏的一篇教程(阮一峰的《SSH 证书登录教程》),按"从生成 CA 到吊销"的顺序重新组织,补上了实践中的注意事项,文字由 AI 协助改写后经我复核。具体参数以 man ssh-keygen 和所用 OpenSSH 版本为准。

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!