为了乐趣和(并发)利润而进行的修补请求

主要观点:生活短暂,不应向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情况的处理逻辑,如创建HTTPSConnectionPoolssl_wrap_socket()函数中的处理。
  • 拉取请求已被接受并合并,在 Requests 的 2.32.0 版本中发布。
阅读 144
0 条评论