使用
truststore
库,您可以普遍注入上下文对象,但在维护者最近的更新中,它说您不应该这样做。
如何将
truststore
与 requests.Session 对象一起使用?我似乎无法找到有关如何执行此操作的指南/文档。 (不过可能是我)
有人可以发布一个使用
requests.Session
对象与 truststore
SSLContext 的示例吗?
参考:
https://truststore.readthedocs.io/en/latest/#user-guide
参考公关:https://github.com/sethmlarson/truststore/pull/122
您可以利用 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
localhost
,其他可以留空openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.cer -sha256 -days 365
将
cert.cer
放入计算机的受信任证书存储中,这取决于您的操作系统,如果您不确定它是如何针对您的特定操作系统完成的,请在线搜索。
创建并运行一个简单的 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()
使用答案中的代码向服务器发送请求
https://localhost:4443
,应该返回 200 OK
保持服务器运行,但从操作系统的受信任存储中删除之前生成的证书,注意仅删除我们生成的证书
尝试在
https://localhost:4443
上向服务器发送另一个请求,现在我们应该看到引发异常 requests.exceptions.SSLError
“证书链已处理,但终止于信任提供者不信任的根证书。”这意味着 truststore
正在正确地完成其工作。