全球超过1400万台服务器每天承受着同一个痛点:新员工入职要往几十台机器里塞公钥,有人离职时你永远不知道他的密钥还躺在哪台机器的哪个角落。这不是某个创业公司的技术债,这是SSH协议设计者2010年就埋好的解药——只是没人按说明书吃。
SSH证书体系在OpenSSH 5.4版本(2010年3月)就已内置,比Kubernetes诞生还早4年。
传统SSH密钥管理像什么?像给公司每个员工配一把实体钥匙,而且要亲手把钥匙插进每一扇他可能需要打开的门。十个人、三十台服务器,钥匙数量就是300把。有人离职,你得回忆他摸过哪些门,然后一把一把换锁。现实中没人这么干,但服务器管理上,这就是标准操作。
证书体系做的第一件事,是把"信任谁"和"信任什么"拆开。你不再维护一张巨大的"人→机器"映射表,而是建立一个证书颁发机构(CA)——其实就是另一对SSH密钥。所有服务器信任这个CA,CA签发的证书就自动被信任。员工入职,CA给他签一张用户证书;服务器上线,CA给它签一张主机证书。两张证书,解决300把钥匙的问题。
15年无人问津的技术,到底卡在哪
2010年的OpenSSH 5.4 release notes里,证书功能被描述为"支持SSH协议2.0的证书格式"。没有发布会,没有博客教程,文档里几行配置示例淹没在数百页man page中。当时的典型场景是:运维工程师打开文档,看到ssh-keygen -s参数,以为是什么高级用法,直接跳过。
更大的障碍是心智模型。TLS证书在Web领域普及花了十年,靠的是浏览器厂商强制推行和可视化锁图标。SSH没有UI,没有绿色小锁,证书验证成功时命令行毫无反馈——这恰恰是设计者的意图,静默信任比弹窗确认更符合自动化场景。但副作用是,工程师根本意识不到这个功能存在。
云厂商的介入进一步固化了旧习惯。AWS EC2的密钥对导入、Azure的SSH公钥扩展、GCP的OS Login,都在传统公钥模型上叠床架屋。它们解决了部分痛点(比如集中存储公钥),却让证书方案显得更加"非主流"。一个讽刺的事实:你在AWS控制台点击"下载密钥对"时,后台完全可以用证书实现同样的功能,但AWS选择了兼容2010年之前的工作流。
技术社区并非完全没有尝试。2012年,Facebook工程师在USENIX LISA大会上分享了内部SSH证书部署经验,提到他们管理着"数万台服务器"的证书轮换。但演讲视频播放量至今不到两千,且Facebook的解决方案高度定制,依赖内部基础设施,外部团队难以复制。2018年,Netflix开源了BLESS(Bastion's Lambda Ephemeral SSH Service),用AWS Lambda实现短期证书签发,算是把证书方案拉回了主流视野——但BLESS本身已于2021年归档,维护者建议迁移到更现代的替代方案。
证书体系的工作机制:比TLS更简单
如果你理解HTTPS证书,SSH证书几乎是子集。核心差异只有两点:没有证书链(通常只有一级CA),没有在线撤销检查(依赖短期有效期)。
部署需要两个独立的CA密钥对。用户CA签发员工证书,主机CA签发服务器证书。分离的原因是攻击面控制:如果用户CA私钥泄露,攻击者只能伪造员工身份;主机CA泄露,攻击者只能伪造服务器身份。两者同时泄露的概率,远低于单一CA的平方级风险。
生成CA密钥的操作和生成普通SSH密钥无异:
ssh-keygen -t ed25519 -f user_ca -C "user-ca@yourorg"
ssh-keygen -t ed25519 -f host_ca -C "host-ca@yourorg"
私钥文件(user_ca和host_ca)需要离线存储,物理隔离,多人分持。这不是过度谨慎——这些密钥的泄露意味着攻击者可以签发任意服务器的可信证书,或伪装成任意员工登录任意服务器。
主机证书的签发流程:获取服务器的现有主机公钥(通常是/etc/ssh/ssh_host_ed25519_key.pub),用主机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指定签名密钥,-I是证书标识(用于审计日志),-h声明这是主机证书而非用户证书,-n列出证书有效的主机名和IP,-V设置52周有效期。输出文件ssh_host_ed25519_key-cert.pub需要复制回服务器,并在sshd_config中声明:
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
重启sshd后,服务器连接时自动呈现证书。客户端无需再面对"是否信任此主机指纹"的提示——因为证书已由受信任的CA签名。
客户端配置同样简洁。将主机CA的公钥加入known_hosts,使用@cert-authority指令:
@cert-authority *.example.com ssh-ed25519 AAAA...your-host-ca-public-key...
通配符*.example.com意味着:该CA签发的任何example.com子域证书,客户端自动信任。新服务器上线,只需签发证书,无需触碰任何客户端配置。
用户证书:入职一张卡,离职即失效
主机证书解决了"服务器身份验证"问题,用户证书解决"员工权限管理"问题。
传统模型中,员工公钥分散在各服务器的authorized_keys文件中。权限变更(比如从只读改为可写)需要登录每台服务器修改文件。证书模型把权限信息编码进证书本身,通过principals字段声明。
签发用户证书的命令:
ssh-keygen -s user_ca \
-I "alice@company.com" \
-n "developers,prod-readonly" \
-V +1w \
alice.pub
这里的关键是-n参数:alice获得的证书包含两个principals,"developers"和"prod-readonly"。服务器端的sshd_config可以基于principals匹配权限:
Match principals "developers"
AllowUsers alice bob carol
ForceCommand internal-sftp
Match principals "prod-readonly"
PermitOpen 10.0.1.0/24:22
X11Forwarding no
权限粒度完全由CA签发时的principals列表决定。alice从开发岗调到运维岗,不需要修改任何服务器配置——新证书包含"operators" principal,旧证书过期后自动失效。
证书有效期是安全设计的核心。短期证书(如24小时或1周)意味着泄露的窗口极窄,且无需实现复杂的撤销机制。对比传统公钥:员工2019年离职,他的公钥可能在某台2021年克隆的镜像服务器里沉睡至今。
大规模部署需要自动化签发流程。小型团队可以用脚本+YubiKey保护CA私钥;中型团队考虑HashiCorp Vault的SSH秘密引擎,支持动态证书签发;大型基础设施可能需要自研服务,对接HR系统实现入职自动授权、离职即时失效。
现实阻力:为什么2010年的功能2025年还没普及
技术债的积累有路径依赖。2010年的运维团队已经习惯了authorized_keys的编辑流程,证书方案没有压倒性优势——直到服务器数量从"几十台"变成"几千台"。
监控和审计是另一个隐形门槛。传统模型中,grep authorized_keys能直观看到谁有权限。证书体系下,权限信息分散在:CA签发日志、证书本身的principals字段、各服务器的Match配置。需要额外建设集中化审计系统,才能回答"alice现在能访问哪些服务器"这个问题。
混合环境的兼容性也需考虑。部分嵌入式设备、老旧网络设备运行的是裁剪版SSH实现,可能不支持证书扩展。证书方案通常需要并行运行传统公钥作为fallback,增加了部署复杂度。
但最大的障碍可能是组织惯性。证书体系要求安全团队持有CA私钥,开发和运维团队改变"我自己管理服务器访问"的习惯。这不是技术问题,是权责重新划分的问题。很多公司的SSH密钥管理混乱,恰恰因为"没人觉得这是自己的责任"。
一些团队尝试的折中方案:保持传统公钥,但用配置管理工具(Ansible/Puppet/Chef)集中推送authorized_keys。这解决了"分散管理"问题,却没解决"长期有效"和"主机身份验证"问题。配置管理工具的密钥泄露,攻击面比CA私钥泄露更广——因为工具通常拥有所有服务器的root权限。
2025年的重新评估:云原生时代的契合点
容器和短暂工作负载的兴起,让证书方案的优势更加凸显。Kubernetes节点每小时自动伸缩,传统公钥模型下,新节点需要某种机制获取authorized_keys内容——通常是打包进镜像或从Secret挂载,两者都有明显的安全或运维缺陷。证书方案中,节点启动时向CA服务申请短期主机证书,生命周期与节点本身绑定。
GitHub在2023年宣布支持SSH证书用于仓库访问,虽然实现方式与服务器登录场景不同,但标志着主流平台开始认可证书模型的价值。云厂商的托管服务也在缓慢跟进:AWS Systems Manager Session Manager支持基于IAM角色的临时SSH访问,底层实现类似证书机制,只是对用户透明。
开源生态的成熟降低了 adoption 门槛。Smallstep的step-ca项目提供完整的SSH证书CA实现,支持ACME协议自动签发;Teleport(现Gravitational)将证书体系包装成完整的基础设施访问平台;OpenSSH 8.9+引入的FIDO/U2F密钥支持,可以与证书结合实现硬件绑定的双因素认证。
一个值得关注的细节:OpenSSH 9.0(2022年4月)默认禁用了RSA签名算法,推荐ed25519或ECDSA。证书体系同样受益——ed25519证书比RSA证书小约75%,签发和验证更快,在大规模自动化场景中差异显著。
部署证书体系的最佳切入点,通常是新环境或新团队。从Greenfield项目开始,建立CA基础设施和签发流程,再逐步迁移存量服务器。试图一次性改造十年积累的SSH密钥,往往因复杂度而失败。
热门跟贴