httpx SSL证书
通过 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 服务情况),则需要创建并使用自己的证书。这是一种方法:
- 使用 trustme-cli 生成一对服务器密钥/证书文件和一个客户端证书文件。
- 启动本地服务器时传递服务器密钥/证书文件。(这取决于您使用的特定 Web 服务器。例如,Uvicorn 提供了
--ssl-keyfile
和 --ssl-certfile
选项。 - 告诉 HTTPX 使用存储在
client.pem
中的证书:
>>> import httpx
>>> r = httpx.get("https://localhost:8000", verify="/tmp/client.pem")
>>> r
Response <200 OK>