httpx SSL证书

2022-07-26 14:44 更新

通过 HTTPS 发出请求时,HTTPX 需要验证所请求主机的身份。为此,它使用由受信任的证书颁发机构 (CA) 提供的 SSL 证书捆绑包(也称为 CA 捆绑包)。

更改验证默认值

默认情况下,HTTPX 使用 Certifi 提供的 CA 捆绑包。在大多数情况下,这是您想要的,即使某些高级情况可能要求您使用一组不同的证书。

如果要使用自定义 CA 捆绑包,可以使用​verify​参数。

import httpx

r = httpx.get("https://example.org", verify="path/to/client.pem")

或者,也可以使用标准库 ​ssl.SSLContext ​。

>>> import ssl
>>> import httpx
>>> context = ssl.create_default_context()
>>> context.load_verify_locations(cafile="/tmp/client.pem")
>>> httpx.get('https://example.org', verify=context)
<Response [200 OK]>

我们还包含一个帮助程序函数,用于创建正确配置的​SSLContext​实例。

>>> context = httpx.create_ssl_context()

create_ssl_context​函数接受与 ​httpx.Client​或​httpx.AsyncClient ​相同的 SSL 配置参数集(​trust_env​、​verify​、​cert​和​http2​参数)

>>> import httpx
>>> context = httpx.create_ssl_context(verify="/tmp/client.pem")
>>> httpx.get('https://example.org', verify=context)
<Response [200 OK]>

或者您也可以完全禁用SSL验证,这是不推荐的。

import httpx

r = httpx.get("https://example.org", verify=False)

Client实例上的 SSL 配置

如果您使用的是 Client()实例,则应在实例化客户端时传递任何 SSL 设置。

client = httpx.Client(verify=False) 

client.get(...)​方法和其他请求方法不支持基于每个请求更改 SSL 设置。如果在不同情况下需要不同的 SSL 设置,则应使用多个​Client​实例,每个​Client​实例具有不同的设置。然后,每个​Client​将在该池中的所有连接上使用具有特定固定 SSL 配置的独立连接池。

客户端证书

您还可以指定要用作客户端证书的本地证书,可以是 SSL 证书文件的路径,也可以是两元组(证书文件、密钥文件),也可以是三元组(证书文件、密钥文件、密码)

import httpx

r = httpx.get("https://example.org", cert="path/to/client.pem")

或者

>>> cert = ("path/to/client.pem", "path/to/client.key")
>>> httpx.get("https://example.org", cert=cert)
<Response [200 OK]>

>>> cert = ("path/to/client.pem", "path/to/client.key", "password")
>>> httpx.get("https://example.org", cert=cert)
<Response [200 OK]>

向本地服务器发出 HTTPS 请求

向本地服务器(如 ​localhost​ 上运行的开发服务器)发出请求时,通常会使用未加密的 HTTP 连接。

如果确实需要与本地服务器建立 HTTPS 连接(例如,测试仅 HTTPS 服务情况),则需要创建并使用自己的证书。这是一种方法:

  1. 使用 trustme-cli 生成一对服务器密钥/证书文件和一个客户端证书文件。
  2. 启动本地服务器时传递服务器密钥/证书文件。(这取决于您使用的特定 Web 服务器。例如,Uvicorn 提供了​--ssl-keyfile​ 和 ​--ssl-certfile​选项。
  3. 告诉 HTTPX 使用存储在​client.pem​ 中的证书:
>>> import httpx
>>> r = httpx.get("https://localhost:8000", verify="/tmp/client.pem")
>>> r
Response <200 OK>


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号