- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 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 page或 this 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.
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")
r.sign(key, "sha256")
关于google-chrome - 拦截即时生成的代理证书会引发浏览器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959989/
我已经四处寻找我的问题的解决方案,但它们似乎都涉及看似复杂的方法,如数据透视表、交叉表等。似乎必须有一个更简单的解决方案来解决那些没有解决的问题在我看来是一个特别复杂的问题。我正在使用 MS SQL
我在共享服务器上安装了 MySQL,并且可以通过 phpMyAdmin 进行访问。我想将该数据库连续实时克隆到云 mySQL 数据库(我们专门为此数据库创建了一个支持 Nginx 的 MySQL 服务
我目前正在围绕一个相当复杂的数据模型编写一个 Django 应用程序。对于许多用例,我需要构建相似但略有不同的模板(包括 graphviz 等)。 现在我想知道是否有一种方法可以遵循 DRY 并“即时
我选择了图片并在提交表单之前进行了预览。但是我想在选择图像并预览并提交文件后即时编辑文件。 js代码: var img = null; var canvas1 = document.g
目前,我们的网站存储 2/3 的固定图像尺寸。这些在上传时生成并通过我们的 CDN 分发。然而,我们需要实现更灵活的解决方案,我们正在开发需要多种不同尺寸的移动和平板电脑应用程序。我们建议的解决方案是
在 Google Wave 的介绍视频中,他们谈到了网络应用程序中的聊天问题。在许多 Web 应用程序中,您会看到如下消息: is typing.. (消息提交前) Google 想出了一个想法“在键
这个问题在这里已经有了答案: Formatting a number with leading zeros in PHP [duplicate] (11 个回答) 关闭3年前. PHP - 是否有一种
如何在VBA的“即时”窗口中打印二维数组?是否存在执行此操作的通用方法?一种在“即时”窗口中为每行绘制一排数组的方法可以解决此问题,因为唯一要做的就是为数组的每一行循环此代码。 最佳答案 我做了一个简
与非 JIT 编译器相比,JIT 编译器具体做什么?谁能给出一个简洁易懂的描述? 最佳答案 JIT 编译器在程序启动后运行,并将代码(通常是字节码或某种 VM 指令)动态(或称为即时)编译为通常更快的
我已经在我的 Windows 2003 服务器上安装了 VisualSVN,并将其配置为提供匿名读取访问。据我了解,VisualSVN 仅使用 apache 和下面的官方 SVN 存储库服务器。 现在
我正在开发一个使用 Twig 的 PHP 应用程序(但这并不重要)作为 View 层。这个 View 层有一个自定义扩展,允许我注册远程样式和脚本 Assets 以及样式和脚本内联 block 。系统
如今在许多网页上,您会经常看到带有指向目标的箭头的即时工具提示,类似于: https://www.w3schools.com/css/tryit.asp?filename=trycss_tooltip
我正在用 C++ 编写并在 Windows 中使用 OpenGL。 我创建了一个立方体,我希望它通过按“4”或“6”小键盘键围绕 y 轴旋转(使用 glRotate3f(),而不是 gluLookat
与非 JIT 编译器相比,JIT 编译器具体做什么?谁能给出一个简洁易懂的描述? 最佳答案 JIT 编译器在程序启动后运行,并将代码(通常是字节码或某种 VM 指令)动态(或称为即时)编译为通常更快的
这个问题在这里已经有了答案: 关闭 10 年前。
与非 JIT 编译器相比,JIT 编译器具体做什么?谁能给个简洁易懂的描述? 最佳答案 JIT 编译器在程序启动后运行,并将代码(通常是字节码或某种 VM 指令)即时(或所谓的即时)编译成通常速度更快
与非 JIT 编译器相比,JIT 编译器具体做什么?谁能给个简洁易懂的描述? 最佳答案 JIT 编译器在程序启动后运行,并将代码(通常是字节码或某种 VM 指令)即时(或所谓的即时)编译成通常速度更快
我希望能够即时将音频文件转换为 MP3 以供用户浏览器使用。我正在使用的软件是:ubuntu 系统上的 Apache、PHP 和 FFMPEG。这是我到目前为止的代码: 使用此代码,仅转换音频的前几
我正在使用 IntervalObservable 连续调用我的应用程序的服务器端。我可以订阅和取消订阅 Oberservable,一切正常,但有一个异常(exception): 对服务器的第一次调用被
从服务器上的文件夹压缩(比如 2 个文件)并强制下载的最简单方法是什么?不将“zip”保存到服务器。 $zip = new ZipArchive(); //the string "fil
我是一名优秀的程序员,十分优秀!