主要观点:生活短暂,不应向SSL_CTX_load_verify_locations()
发送垃圾调用。通过一个并发请求脚本发现,验证证书和不验证证书时时间差异很大,主要原因是验证证书时ssl
模块的load_verify_locations()
函数花费大量时间,该函数通过 C FFI 调用 OpenSSL 的SSL_CTX_load_verify_locations()
,速度较慢,且在高并发场景下性能影响更明显,不验证证书时这些调用会被跳过,从而大幅提高并发性能。提出了一个可能的修复方法,在verify=True
时为连接池提供已加载 CA 证书的SSLContext
,避免load_verify_locations()
的冗余调用,同时对verify
为字符串的情况进行了处理。更新:相关拉取请求已被接受并合并,在 Requests 的 2.32.0 版本中发布。
关键信息:
- 脚本通过并发请求测试验证证书和不验证证书的时间差异,本地差异较大,在某些环境中差异超 500%。
- 验证证书时
load_verify_locations()
函数花费 0.68 秒,比网络等待时间长,高并发时会有全局阻塞。 - 修复方法:Requests 新增
_get_connection()
函数缓存连接池,在verify=True
时为连接池提供已加载 CA 证书的SSLContext
,避免load_verify_locations()
调用,对verify
为字符串的情况也进行了处理。
重要细节:
urllib3
库在禁用证书验证时会屏蔽警告。- 验证证书和不验证证书时各函数调用的时间和次数统计。
- 修复方法中对不同
verify
情况的处理逻辑,如创建HTTPSConnectionPool
和ssl_wrap_socket()
函数中的处理。 - 拉取请求已被接受并合并,在 Requests 的 2.32.0 版本中发布。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。