将信任库的 SSLContext 与 Python 请求会话对象一起使用

问题描述 投票:0回答:1

使用

truststore
库,您可以普遍注入上下文对象,但在维护者最近的更新中,它说您不应该这样做。

如何将

truststore
与 requests.Session 对象一起使用?我似乎无法找到有关如何执行此操作的指南/文档。 (不过可能是我)

有人可以发布一个使用

requests.Session
对象与
truststore
SSLContext 的示例吗?

参考:

https://truststore.readthedocs.io/en/latest/#user-guide
参考公关:
https://github.com/sethmlarson/truststore/pull/122

python-3.x python-requests truststore
1个回答
0
投票

您可以利用 requests 中的

传输适配器
来修改库的内部结构,并在内部覆盖
ssl_context

import truststore
import requests
import ssl
from requests.adapters import HTTPAdapter

class TruststoreAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
        return super().init_poolmanager(connections, maxsize, block, ssl_context=ctx)

s = requests.Session()
s.mount("https://", TruststoreAdapter())
r = s.get("https://localhost:4443/", verify=True)
print(r) # 200 OK

这将匹配任何以

https://
开头的 url,并用
truststore.SSLContext
中的内容替换内部 ssl 上下文。

另外,为了清楚起见,我想提一下 仅当您创建库或包时才需要

inject_into_ssl() 不得由库或包使用,因为与其他库集成时会导致导入时间问题

您应该可以将

inject_into_ssl()
用于任何其他目的。



此外,如果您想验证此功能是否有效(我仅在 Windows 11 上进行了测试),您可以按照以下步骤操作。你需要

openssl

  1. 生成自签名证书和私钥
    1. 确保通用名称是
      localhost
      ,其他可以留空
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cer -sha256 -days 365
  1. cert.cer
    放入计算机的受信任证书存储中,这取决于您的操作系统,如果您不确定它是如何针对您的特定操作系统完成的,请在线搜索。

  2. 创建并运行一个简单的 http 服务器,该服务器利用步骤 1 中生成的证书和密钥,这是一个简单的 python (从 anvileight 修改)

from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b'Hello, world!')

httpd = HTTPServer(('localhost', 4443), SimpleHTTPRequestHandler)

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="cert.cer", keyfile="key.pem")
httpd.socket = context.wrap_socket(httpd.socket)

print("Starting...")
httpd.serve_forever()
  1. 使用答案中的代码向服务器发送请求

    https://localhost:4443
    ,应该返回
    200 OK

  2. 保持服务器运行,但从操作系统的受信任存储中删除之前生成的证书,注意仅删除我们生成的证书

  3. 尝试在

    https://localhost:4443
    上向服务器发送另一个请求,现在我们应该看到引发异常
    requests.exceptions.SSLError
    “证书链已处理,但终止于信任提供者不信任的根证书。”这意味着
    truststore
    正在正确地完成其工作。

© www.soinside.com 2019 - 2024. All rights reserved.