什么是证书固定?
证书固定通过将服务器证书与已知副本比对来验证客户端-服务器连接。不过,由于复杂度高且存在风险,该机制目前已基本被淘汰。本文将介绍其发展历史、优势及风险。
什么是证书固定?
证书固定是一种用于验证客户端-服务器连接的在线应用安全技术。Web 浏览器借助该机制,让客户端应用将服务器证书与已知副本进行校验。若二者匹配,该连接即被视为已授权(即“已固定”)。任何使用非固定证书发起的安全连接请求都会被拒绝。
应用最常固定的是 X.509 证书,不过仅固定受信任的证书颁发机构(CA)或公钥也可实现该机制。此外,公钥也可以单独被固定,无需绑定到某一张证书。
证书固定最初是为防范中间人攻击(MITM)而设计的。但由于其实现复杂度高、存在风险,目前已基本被淘汰,多数 Web 浏览器也不再支持该机制。在证书固定应用较为普遍的时期,大多数企业的固定实现方式都存在错误,进而引发了多起 服务中断。证书固定的错误实现可能造成严重后果。因此,Sectigo 不建议使用证书固定。
下文将详细介绍该技术的发展历史、工作原理、优势及风险。
该技术的发展历史
2011 年,谷歌成为最早采用该技术的机构之一:Chrome 浏览器连接谷歌服务器时即启用了 SSL/TLS 证书固定机制。Chrome 被设定为在将域名连接至 Google.com 时,仅接受当前已固定的证书。如此一来,即使攻击者通过欺骗手段获取了受信任 CA 签发的证书,Chrome 仍会判定该证书无效,从而拒绝连接。
尽管 Chrome、Firefox 等 Web 浏览器是最早实现该技术的应用,但它的使用场景很快得到拓展。不久后,物联网(IoT)设备、iOS 与安卓系统的移动应用,以及各类其他软件应用都开始采用该技术防御中间人攻击。
但在快速迭代的网络安全领域,SSL 证书固定已被广泛认为不再适用——它会带来不可接受的 证书敏捷性 成本,其中 HTTP 公钥固定(HPKP)这一形式已被彻底弃用。
证书固定的工作原理是什么?
从本质上来说,证书固定的原理非常简单:该流程会将需要发起连接的主机,与预先指定的证书、或是符合IETF X.509密码学标准的服务器公钥进行关联。一旦主机与证书之间的关联建立完成,二者的绑定关系就正式生效,即证书被固定到对应主机上。只有当服务器提供的证书存在于固定证书集合中时,对应的客户端连接或API调用才会被允许通过。
大多数情况下,经认可的固定证书会在应用开发阶段就嵌入到应用内部。开发阶段完成的固定操作会提升攻击者破坏固定机制的难度,从而增加一层安全防护。证书也可以在应用首次发起连接时完成固定——这一流程被称为密钥连续性。但使用密钥连续性方案会带来更高的风险敞口,因为在主机与应用的首次连接阶段就可能遭受攻击。
证书固定的前提是客户端与主机之间存在预先定义、预先建立的信任关系,且对应的协议和参数已被所有合法参与方知晓并认可。这种机制无需持续向体系内的组件发起查询——例如无需持续向证书颁发机构(CA)请求证书状态的最新更新。
哪些证书可以被固定?
应用所有者可以自主选择固定证书链中的哪一部分。最基本的要求是,信任链中至少要有一张证书完全由应用所属的组织掌控。但一个非常常见的错误是仅固定证书链中的根证书。这种过度简化的操作会留下安全漏洞:恶意攻击者可以利用从同一家证书颁发机构(CA)签发的其他证书获取访问权限。因此,希望使用该技术的应用开发者应当考虑固定证书链中的多张甚至全部证书,具体包括:
- 根证书: 根证书由受信任的证书颁发机构(CA)基于明确的证书验证方法签发,其公钥、私钥对通过复杂的密码学算法和哈希算法生成。根证书由签发它的根CA进行严格监控和保护。这意味着仅固定根证书本质上是信任了签发该根证书的CA,以及从该根证书派生的所有中间证书对应的CA。
- 中间证书: 中间证书是叶子证书与根证书之间的衔接环节。一条证书链中至少要包含一张中间证书,单条链中也可以部署多张中间证书。仅固定中间证书的做法虽然可以实现,但并不推荐,因为这相当于你将全部信任托付给了对应的中间CA。
- 叶子证书: 叶子证书是证书链中最末端的证书。固定叶子证书几乎可以确保证书完全匹配。叶子证书也被称为终端用户证书或终端实体证书,通常需要频繁吊销和更换,这就要求所有客户端应用同步完成对应更新。
证书固定有哪些优势?
对于希望将基于证书的认证与加密安全能力定制化直接嵌入到网页应用和移动应用中的组织,证书固定可以提供更强的管控能力。理论上,证书固定会大幅提升网络犯罪分子利用欺诈证书非法获取应用或数据访问权限的难度,可防范以下风险场景:
- 无效证书签发
- 证书颁发机构被入侵
- 中间人攻击
证书固定存在哪些问题?
尽管SSL固定可以发挥安全效用,但它本身也存在较高风险。这种方式会给组织带来成本高昂的证书管理难题,还可能影响用户体验。以下是使用该技术的组织可能面临的部分常见问题:
- 泄露密钥的处置: 使用HPKP时,每张叶子证书通常会在应用中固定60天。而很多将叶子证书有效期设为60天的组织,并不会预留任何备份密钥。一旦密钥泄露,证书颁发机构(CA)必须吊销该密钥。在没有可用备份密钥的情况下,合法客户端将无法再建立连接。密钥泄露问题的解决往往难度高、成本大,还会耗费大量时间。
- 缺乏密码敏捷性: 密码学层面的变更发生频率可能超出你的预期。当你或你的证书颁发机构(CA)不再信任现有密钥,必须更换采用新密码学算法的证书时,就需要具备密码敏捷性。由于证书固定会将证书要求硬编码到应用中,证书的任何变更都既需要更新证书本身,还需要向应用推送更新补丁。软件更新的落地存在难度,尤其是在时间紧张的情况下,而未安装最新版应用的客户端可能无法访问应用,或是会收到应用连接不安全的警告。
- 证书吊销: 证书颁发机构(CA)能够且确实会吊销证书. 证书吊销可能由多种场景触发。例如,审计过程中发现的问题就可能启动吊销流程。证书颁发机构(CA)可能在几乎无提前预警的情况下被要求执行吊销,这类事件未必能匹配您的开发规划节奏。与密码算法变更的情况类似,您可能需要仓促紧急更新软件,才能保障用户可正常访问、或避免出现安全警告。
证书固定的替代方案
尽管不存在与证书固定完全一一对应的替代方案,但已有若干技术可实现相同的安全目标。最常用的替代方案是证书透明度(CT)。这是一套用于监控和审计证书颁发机构(CA)签发的所有公开SSL/TLS证书的开放框架。当证书颁发机构(CA)签发公开信任的SSL/TLS证书时,会将证书详情提交至证书透明度日志。这些日志可公开访问,使浏览器能够验证证书的签发流程是否合规。各组织机构也应当监控CT日志,核对指向自身域名的证书签发情况。
此外,自动化证书生命周期管理(CLM)是确保待认证证书在全部生命周期阶段中始终保持安全、处于最新状态的理想方案:涵盖申请与注册、签发与部署、使用与监控、到期与续期,以及吊销全流程。了解这款兼容多CA的Sectigo 证书生命周期管理平台.
您还可以收听我们的 Root Causes 播客,深入了解证书固定的相关知识、其诞生背景,以及如今为何几乎所有开发者都应当避免使用证书固定。