我表面上熟悉 SSL 和证书的作用。最近我看到一些关于 cert pinning 的讨论,但没有定义。DDG 搜索没有发现任何有用的信息。什么是证书固定?
什么是证书固定?
通常通过检查签名层次来验证证书;MyCert
签名者IntermediateCert
签名者RootCert
,并且 RootCert 列在我计算机的“信任证书”存储区中。
证书固定是您忽略整个事情的地方,并说仅信任此证书或仅信任由此证书签名的证书,而忽略所有其他可能成为信任锚的根 CA。它通常也被称为 Key Pinning,因为它实际上是保存的公钥哈希。
但在实践中,Key Pinning 导致的问题多于解决的问题。它经常被站点所有者错误配置,而且在站点受损的情况下,攻击者可以恶意固定站点所有者无法控制的证书。Key Pinning 已于 2017 年弃用,并于 2019 年 11 月从 Chrome 和 Firefox 中完全删除。IE 和 Safari 从一开始就不支持它。
推荐的替代方法是使用Expect-CT标头告诉浏览器要求证书显示在证书透明度日志中。
含糊不清,但它指的是 SSL 证书链验证问题的解决方案。从本质上讲,对 SSL 的信任归结为根证书,即您的系统信任的证书是真实的。这些要么随您的操作系统提供,要么随您的浏览器提供。如果其中一个被泄露,则所有由此签名的证书和传递签名的证书都将被视为已泄露。
SSL 服务器证书来自X.509世界。客户端通过验证来自证书颁发机构的大量加密签名来验证服务器证书的有效性。该方案的美妙之处在于它是无状态的:给定的服务器可以每五分钟更改一次它的证书,并且它仍然可以与客户端一起工作。
有人认为,虽然支持快速循环证书很棒但没用,因为在实践中,给定服务器每年更改一次证书;事实上,早期的证书转换表明一些正在进行的可疑业务。证书固定是服务器声明在正常情况下不应该发生这种情况的一种方式,并且如果发生意外的证书切换,客户端应该提出一个隐喻的眉毛。这是一个协议扩展,建议但尚未得到广泛支持。实际上,似乎有几个相对相似的竞争提案。
另请参阅Convergence,这是另一个协议扩展,可以被认为是“受信任的第三方的证书固定”。Convergence 和证书固定提议都围绕着同一个核心思想,即在客户端(或至少在某个地方)有一些状态,并在证书更改过于频繁或过早时触发安全警告。这些提议中的任何一个是否会被广泛接受(即,将由 IE、Firefox、Chrome 和 Safari 以兼容的方式实现,并将被大多数 SSL 服务器系统管理员使用)是任何人的猜测。
通常,在 HTTPS 连接中发生的情况是,客户端从通过 https 与之通信的 SSL 兼容服务器请求 SSL 证书。服务器将提供来自其密钥库的证书。客户端收到此证书后,它会根据是否验证其凭据
- 主机名与请求的相同
- 具有可验证的信任链返回到受信任的(根)证书 [来自客户端信任库]
现在,如果连接被代理并且您可以让设备信任您的(流氓)根 CA 证书,那么您可以拦截安全连接。这本质上是中间人攻击。现在这是 SSL pinning 中发生的事情,它可能会增加一个额外的安全层,防止中间人攻击——
应用程序会将已知的服务器证书与自身捆绑在一起。当应用程序尝试与服务器建立安全连接时,它会验证服务器收到的证书与它捆绑的证书。因此,即使操作系统针对(可能是恶意的)根 CA 验证接收到的证书链,应用程序也会拒绝显示网络错误的连接。
注意:我试图从 Android 应用中 SSL 固定的角度来回答这个问题。SSL pinning 在此类应用程序中很容易实现,因为应用程序已经知道它将连接到的服务器(主机名)。不过,在浏览器中可能很难实现。我认为 chrome 浏览器已经实现了这一点。
我还编写了一个示例代码来演示 Android 中的证书固定。你可以在github上找到它。您也可以在Playstore上找到相同的应用程序。
更多信息 :