![]()
全球超过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架构:把鸡蛋分两个篮子
实施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年了还没普及
技术方案清晰,落地阻力来自组织惯性。首先是学习曲线:大多数运维工程师的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硬件密钥与证书结合,把钓鱼攻击风险降到物理层面。这个功能比证书本身更新,文档却更完善——或许因为安全硬件的营销预算比基础设施重构充足。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.