正如sneaker所指出的,客户端将收到代理生成的证书,而不是原始站点证书。原因是代理不能仅凭其证书模拟站点,它必须具有相应的private key。
该证书是 TLS *设置的一个组成部分(即它不是“站点印章”或类似的废话)。它的内容(公钥)被客户端用来加密连接,只有匹配的私钥才能解密才能成功完成连接。代理只能出示其确实拥有密钥的类似证书,这将具有(以非常高的概率)不同的指纹或散列。
[ *协商 TLS 时有很多选项,身份验证和加密的两个主要功能有“空”选项,尽管这些通常不用于 HTTPS。如果您使用空身份验证方法,则不需要证书,例如 ADH]
这种 TLS 拦截的一般方法是代理将生成(在运行中,然后缓存)与目标的 DNS 名称匹配的密钥和证书,证书将由伪 CA 签名,存储在代理,它将被您的操作系统/浏览器“信任”。
信任是这样工作的(稍微简化一下):
- 服务器提供包含公钥的证书,因为客户端使用服务器的公钥随后对对称密钥进行加密,如果服务器无法解密来自客户端的消息(即没有相应的私钥),则 TLS 设置将失败钥匙)
- 客户端验证服务器证书详细信息(DNS 名称、日期范围、可选的撤销以及可能的“使用”属性)
- 客户端验证信任链直至已知(本地副本)信任锚(通常是自签名根 CA)
代理能够成功的原因是您的浏览器“信任”公司伪 CA,通常是通过桌面策略、自定义浏览器部署或类似的方式。信任模型的问题很明显:传统上,任何 CA 都可以为任何名称签署证书(通常也可以通过从属 CA 进行委托)。对此有一些缓解措施,包括 DANE、CAA 和 key-pinning。
在合法证书和代理生成的证书之间发生变化的最小字段集是公钥模数和证书签名。如果存在,则 SKID 和 AKID 字段(从相关密钥派生)也将有所不同。验证相关字段(OCSP、CRL)也可能会被剥离,尽管在技术上也可以为伪 CA 提供这些服务。
实际上,虽然生成的证书可能只是表面上类似于真实证书(足以通过日期和 DNS 名称测试),并且由您公司代理的伪 CA 直接签名。然而,完全有可能重现看起来合法的CA 层次结构,获取真实证书,复制证书链的所有其他细节(除了模数和密钥派生的 AKID/SKID 和签名)。一旦证书的任何细节发生变化,计算出的指纹(摘要)也将(很有可能)发生变化。
(对于混淆指数/模数的更正,感谢 dave_thompson_085 注意到这一点。)
总而言之,任何代理生成的证书:
- 必须在表面上类似于真实证书,DNS 部分(CN 和/或 subjectAltNames)必须匹配
- 可能立即显而易见,因为“发行人”字段可能会泄露它(尽管并非总是如此)
- 可能有许多其他共同的字段(序列号,日期),但可能不会(序列号需要特殊处理,因为它们绝不能按 CA 重复使用)
- 撤销(CRL、OCSP)详细信息可能会被破坏或从证书中删除
will不 应该由商业 CA 签名(Trustwave 过去曾从事过这种可疑的做法),不会有相同的签名数据,也不会有相同的指纹
如果您检查它,浏览器中的站点证书是否会更改?
是的,您可能只检查 Issuer 字段或计算的指纹,但您需要验证整个链才能确定。
它是否仍然可以仅将服务器的证书直观地输出给用户,以便他们仅通过查看证书就不会意识到正在发生拦截?
不,HTTPS 服务器(无论是真正的 Web 服务器还是代理)无法控制这一点(用户界面问题、恶意扩展和伪造的位置栏除外)。浏览器显示的是在 TLS 连接设置期间使用的证书,它不是通过 HTTP 获取的文件。
检查安全站点的证书是否足以检测到中间人,或者您是否必须查看公司笔记本电脑上的所有受信任证书以确定其中是否有任何异常?"
仅从证书可能就很明显,生成的证书可能会直接由代理的伪 CA 证书签名,并且可能很容易通过证书中的文本字段(至少是“颁发者”)来识别。为了彻底,您应该比较所有证书指纹或 AKID/SKID 链接。
FWIW,EV 证书在这里为您提供了一点点额外的保护:代理不能伪造真正的 EV 证书,因为任何合格的浏览器都会有一个硬编码的 EV 能力 CA 证书列表。(但它并没有解决先有鸡还是先有蛋的问题:你怎么知道什么时候可以期待或需要 EV 证书?)
IETF的DANE被提议作为更强大的解决方案。它解决了信任模型的根本问题:
TLS 所依赖的公共 CA 模型从根本上是易受攻击的,因为它允许任何这些 CA 为任何域名颁发证书。
为了真正解决问题,而不是把它踢得更远一点,DANE 需要 DNSSEC。还有一个简单的对策:客户端证书,但由于各种原因,这不是一个通用的解决方案。
其他(部分)解决方案包括:
还有其他的,例如Convergence、Verikey [PDF]、CertPatrol(Firefox 插件)、Monkeysphere(多协议)
也可以看看: