证书固定是指应用程序预先固定通信目标服务器的 TLS 证书(或公钥),当连接时出示的证书与固定值不一致时拒绝通信的安全技术。它被用作防范中间人攻击(MITM)的对策,这类攻击使用非法证书颁发机构签发的伪造证书。
作为移动应用中的实现示例,iOS 在 URLSession 的委托方法中、Android 在 Network Security Config 中指定证书公钥的哈希值。在短链接应用中,如果在获取重定向目标时遭受 MITM 攻击,用户就有被引导至恶意网站的危险。
过去曾为 Web 浏览器标准化了 HTTP Public Key Pinning(HPKP),但 Google 以使用者少以及存在拒绝服务等风险为由,宣布将在 Chrome 72 中删除 HPKP。Certificate Transparency(CT)是将已签发的证书记录到公开日志中,以便发现不当签发的机制。
证书固定在运维上的挑战是,证书轮换时需要更新应用。通过设置备用固定值,或在中间证书层级进行固定,可以减轻轮换时的影响。
在短链接服务中,也有将两者结合的做法:用证书固定保护 API 通信,并通过监控 CT 日志检测不当的证书签发。