打开网易新闻 查看精彩图片

全球超过90%的服务器运行OpenSSH,但用到SSH证书的团队不到5%。这个数据来自2023年SANS Institute的调研——不是技术不成熟,是2010年发布的5.4版本就内置了全套功能,整整15年。

运维工程师的日常:新人入职,把公钥复制到20台服务器的authorized_keys;有人离职,翻遍所有机器找他的密钥残留;凌晨3点被告警叫醒,面对陌生的主机指纹犹豫要不要点yes。SSH证书本可以终结这一切,却像超市货架最底层的商品,人人都路过,没人拿起来看。

密钥管理的债务雪球

传统SSH模型是个人英雄主义的产物。一个人管三台服务器,手动维护authorized_keys确实轻松。但团队扩张到20人、200台机器时,这个模型开始散发技术债的腐臭味。

密钥分发是场噩梦。每个新成员要把公钥发给运维,运维再逐个登录服务器追加到authorized_keys。有人用Ansible批量处理?恭喜,你只是在自动化债务的转移,没有消除债务本身。离职场景更糟——除非你有完整的密钥审计日志,否则只能祈祷没漏掉某台角落里的测试机。

主机身份验证同样尴尬。第一次SSH到新服务器时,那串十六进制指纹你根本无从核对。大多数人直接敲yes,把中间人攻击的风险敞口留给自己。企业级方案?买堡垒机,或者雇人维护庞大的known_hosts文件,都是昂贵的补丁。

SSH证书的设计者早就看穿了这套把戏。核心洞察很简单:与其信任上千个孤立的公钥,不如信任一个签发它们的权威机构。这和TLS证书的逻辑完全一致——浏览器不会存储每个网站的公钥,它信任根证书颁发机构。

双CA架构:把鸡蛋分两个篮子

双CA架构:把鸡蛋分两个篮子

实施SSH证书需要两个独立的证书颁发机构(Certificate Authority,证书颁发机构)。用户CA签发个人登录凭证,主机CA签发服务器身份证明。物理隔离是关键:一个泄露不会拖垮另一个。

生成CA密钥对的命令平淡无奇,但安全意识决定成败:

# 用户CA——离线保管,物理锁柜或HSM

ssh-keygen -t ed25519 -f user_ca -C "user-ca@yourorg"

# 主机CA——相对可接触,但仍需严格权限控制

ssh-keygen -t ed25519 -f host_ca -C "host-ca@yourorg"

私钥文件user_ca和host_ca就是新世界的根信任。泄露用户CA,攻击者能签发任意员工的登录证书;泄露主机CA,能伪造任意服务器的身份。存储方案参考TLS根证书的行业惯例:离线、分片、多人控制。

主机证书的签发流程把繁琐的指纹核对变成一次性配置。拿现有服务器的公钥,用主机CA签名:

ssh-keygen -s host_ca \

-I "webserver-prod-01" \

-h \

-n "webserver-prod-01.example.com,10.0.1.50" \

-V +52w \

/etc/ssh/ssh_host_ed25519_key.pub

参数含义直白:-s指定签名密钥,-h声明这是主机证书而非用户证书,-n列出证书绑定的主机名和IP,-V设有效期52周。输出文件ssh_host_ed25519_key-cert.pub放回服务器,在sshd_config里加一行HostCertificate指向它,重启服务。

客户端侧的配置更简洁。不再需要逐台记录主机指纹,只需在known_hosts里写入CA公钥:

@cert-authority *.example.com ssh-ed25519 AAAA...your-host-ca-public-key...

@cert-authority指令是魔法所在。它告诉SSH客户端:任何匹配*.example.com的主机,只要出示由这个CA签名的证书,就自动信任。第一次连接webserver-prod-01.example.com时,客户端验证的是证书签名而非孤立指纹——而签名验证是密码学自动完成的,不需要人类在凌晨3点做判断。

用户证书:入职即失效,离职即注销

用户证书:入职即失效,离职即注销

主机证书解决的是"这台服务器是谁",用户证书解决的是"谁可以登录"。流程对称:用用户CA给员工公钥签名,生成短期凭证。

签发命令:

ssh-keygen -s user_ca \

-I "zhangsan@yourorg" \

-n "zhangsan,ops,dev" \

-V +1d \

zhangsan_id_ed25519.pub

-n参数是权限控制的核心。这里允许zhangsan以三个身份登录:个人账号zhangsan、运维组共享账号ops、开发组共享账号dev。有效期设为1天(+1d)是推荐实践——证书过期自动失效,比revoke清单更干净。

服务器端配置需要信任用户CA。在sshd_config里添加:

TrustedUserCAKeys /etc/ssh/user_ca.pub

AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u

第一行声明信任哪个CA签发的用户证书。第二行开启基于身份(principal)的授权,替代传统的authorized_keys。/etc/ssh/auth_principals/目录下,文件名对应系统用户名,文件内容列出允许登录的证书身份。

比如auth_principals/root文件写入ops,意味着任何持有ops身份证书的用户都能root登录。这比把20个运维的公钥塞进authorized_keys优雅得多——人员变动时改CA的签发策略,或者简单等待证书过期,不需要逐台服务器清理文件。

为什么15年了还没普及

为什么15年了还没普及

技术方案清晰,落地阻力来自组织惯性。首先是学习曲线:大多数运维工程师的SSH知识停在"生成密钥对-复制公钥"层面,证书概念需要重新理解PKI(Public Key Infrastructure,公钥基础设施)思维。其次是工具链缺失:没有开箱即用的证书生命周期管理平台,团队得自己写签发脚本、监控过期、处理revoke。

云厂商的态度也暧昧。AWS、GCP、Azure的托管服务默认仍走传统密钥路线,证书方案需要用户自己搭建。只有HashiCorp Vault等少数工具原生支持SSH证书工作流,但引入Vault本身又是另一个架构决策。

最隐蔽的障碍是"够用了"心态。20台服务器的团队觉得手动管理还能忍,等到200台时才想迁移,此时债务利息已经高到无法承受。SSH证书的真正价值在规模拐点后指数级释放——但多数人没活到那个拐点就换工作了,或者把烂摊子留给下一任。

Netflix在2014年公开了他们的SSH证书实践,声称把新服务器上线时间从小时级降到分钟级。Facebook(现Meta)更早,2012年内部就全量切换。这些案例没有催生行业标准,反而成了"大厂才需要"的心理暗示。

一个值得玩味的细节:OpenSSH 8.2(2020年)开始支持FIDO2硬件密钥与证书结合,把钓鱼攻击风险降到物理层面。这个功能比证书本身更新,文档却更完善——或许因为安全硬件的营销预算比基础设施重构充足。