gpt4 book ai didi

google-chrome - 拦截即时生成的代理证书会引发浏览器错误

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:51 31 4
gpt4 key购买 nike

我在 Python 3 中编写了一个拦截代理,它使用中间人“攻击”技术能够即时检查和修改通过它的页面。 “安装”或设置代理的部分过程涉及生成一个“根”证书,该证书将安装在浏览器中,每次通过代理通过 HTTPS 访问新域时,代理都会生成一个新的站点证书-the-fly(并将生成的所有证书缓存到磁盘,因此不必为已经生成证书的域重新生成证书)由根证书签名并使用站点证书与浏览器通信。 (当然,代理会与远程服务器建立自己的 HTTPS 连接。如果您好奇,代理还会检查服务器证书的有效性。)

嗯,它适用于浏览器 surf . (而且,这可能是相关的——至少从几个版本开始,冲浪没有检查/强制执行证书有效性。我无法证明更新版本是否是这种情况。)但是,Firefox 提供了一个SEC_ERROR_REUSED_ISSUER_AND_SERIAL 通过代理和 Chromium 发出的第二个(以及之后的所有)HTTPS 请求中的错误(我没有使用 Chrome 进行过测试)在每个 HTTPS 请求上都会给出 NET::ERR_CERT_COMMON_NAME_INVALID。当尝试浏览我的拦截代理时,这些显然是一个主要问题。

我使用的 SSL 库是 pyOpenSSL 0.14如果这有什么不同。

关于 Firefox 的 SEC_ERROR_REUSED_ISSUER_AND_SERIAL 错误,我很确定我没有重复使用序列号。 (如果有人想检查我的工作,那就太好了:cert.py - 请注意第 168 行的“crt.set_serial_number(getrandbits(20 * 8))”。)当然,根证书颁发者不会改变,但这不会改变,对吧?如果不是根证书颁发者,我不确定错误消息中的“颁发者”究竟是什么意思。

此外,Firefox 的“查看证书”对话框为代理生成的不同证书显示完全不同的序列号。 (例如,我为 www.google.com 生成了一个序列号为 00:BF:7D:34:35:15:83:3A:6E:9B:59:49:A8:CC: 88:01:BA:BE:23:A7:AD 和另一个为 www.reddit.com 生成的序列号为 78:51:04:48:4B:BC:E3:96:47:AC:DA:D4 :50:EF:2B:21:88:99:AC:8C .) 所以,我不太确定 Firefox 到底在提示什么。

我的代理为它即时创建的所有证书重用私钥(以及公钥/模数)。我开始怀疑这就是 Firefox 犹豫不决的原因,并尝试更改代码以为代理即时创建的每个证书生成一个新的 key 对。这并没有解决 Firefox 中的问题。我仍然收到相同的错误消息。我还没有测试它是否解决了 Chromium 问题。

关于 Chromium 的 NET::ERR_CERT_COMMON_NAME_INVALID 错误,站点证书的通用名称应该是域,对吗?我不应该包括端口号或任何东西,对吧? (同样,如果有人想检查我的工作,请参阅 cert.py 。)如果有帮助,我的拦截代理没有在证书通用名称或任何东西中使用任何通配符。生成的每个证书都针对一个特定的 fqdn。

我很确定在不让 Firefox 或 Chrome(或 Chromium 或 IE 等)犹豫的情况下完成这项工作是可能的。我曾经工作的一家公司购买并成立了 man-in-them-middling proxy从公司网络内部到互联网的所有流量都必须通过它。该公司的 PC 管理员在员工使用的每台公司拥有的计算机上的每个浏览器中安装了自签名证书作为证书颁发机构,结果从未产生任何错误,如 Firefox 和 Chromium 一直为我提供的证书给我的错误。自己的拦截代理软件产生。 PC 管理员可能在 Firefox 中调整了一些 about:config 设置,以使这一切正常工作或其他什么,但我有点怀疑。

公平地说,这家公司使用的代理要么是网络层,要么是传输层,而不是像我这样的应用层。但我希望在应用层 HTTP(s) 代理中也能实现同样的效果。

编辑:我试过按照brain99 的建议设置subjectAltName。以下是我在brain99建议的位置添加的行:

r.add_extensions([crypto.X509Extension(b"subjectAltName", False, b"DNS:" + cn.encode("UTF-8"))])

我仍然从 Firefox 收到 SEC_ERROR_REUSED_ISSUER_AND_SERIAL(在第二次和后续的 HTTPS 请求中,我从 Chromium 收到 ERR_SSL_SERVER_CERT_BAD_FORMAT。

以下是代理生成的几个证书:

google.com:https://pastebin.com/YNr4zfZu

stackoverflow.com:https://pastebin.com/veT8sXZ4

最佳答案

我注意到您只在 X509Req 中设置了 CN。 Chrome 和 Firefox 要求 要存在的 subjectAltName 扩展名;参见例如 this Chrome help pagethis Mozilla wiki page讨论 CA 要求或推荐的做法。引用 Mozilla wiki:

Some CAs mistakenly believe that one primary DNS name should go into the Subject Common Name and all the others into the SAN.

According to the CA/Browser Forum Baseline Requirements:

  • BR #9.2.1 (section 7.1.4.2.1 in BR version 1.3), Subject Alternative Name Extension
    • Required/Optional: Required
    • Contents: This extension MUST contain at least one entry. Each entry MUST be either a dNSName containing the Fully-Qualified Domain Name or an iPAddress containing the IP address of a server.


您应该可以使用 pyOpenSSL 轻松完成此操作:
if not os.path.exists(path):
r = crypto.X509Req()
r.get_subject().CN = cn
r.add_extensions([crypto.X509Extension("subjectAltName", False, "DNS:" + cn])
r.set_pubkey(key)
r.sign(key, "sha1")

如果这不能解决问题,或者只能部分解决问题,请发布一两个显示问题的示例证书。

除此之外,我还注意到您使用 SHA1 进行签名。请注意,使用 SHA1 签名的证书已在几个主要浏览器中弃用,因此我建议切换到 SHA-256。
r.sign(key, "sha256")

关于google-chrome - 拦截即时生成的代理证书会引发浏览器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959989/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com