AIA通过OpenSSL追踪TLS证书链构建和验证
项目描述
Python中的AIA追逐
此库是为了解决CPython 问题18617(SSL/TLS中TLS连接缺失中间证书的AIA追逐)而构建的。
为什么是会话? 这在HTTP意义上并不是一个会话,它只是将下载的证书缓存到内存中的一种方式,这样就不需要重复验证相同的证书。
它是如何获取证书链的? 它从每个证书的AIA(权威信息访问)扩展中获取整个链,并从系统中本地获取根证书。
它是如何验证证书链的? 通过OpenSSL,它必须作为一个外部依赖项安装。
我应该何时使用它? 理想情况下,永远不要使用,但这可能不是一个选择。当Web服务器配置不包括整个链(除了根证书)时,只有两个“选项”:忽略证书(不安全)或通过AIA获取链中的中间证书(这就是为什么编写了这个小型库)。
如何安装
任何地方,假设OpenSSL已经安装
pip install aia
在Arch Linux系统中进行系统安装时,AUR中也有一个名为python-aia
的软件包。
如何使用它?
对于HTTPS上的简单请求,可以使用标准库中的urllib.request.urlopen
方法。
from aia import AIASession
aia_session = AIASession()
# A GET result (only if status was 200), as bytes
content = aia_session.download("https://...")
# Return a `http.client.HTTPResponse` object, like `urllib.request.urlopen`
response = aia_session.urlopen("https://...")
# Indirectly, the same above
from urllib.request import urlopen
url = "https://..."
context = aia_session.ssl_context_from_url(url)
response = urlopen(url, context=context)
上下文方法也便于使用HTTP客户端库。例如,使用requests
from tempfile import NamedTemporaryFile
from aia import AIASession
import requests
aia_session = AIASession()
url = "https://..."
cadata = aia_session.cadata_from_url(url) # Validated PEM certificate chain
with NamedTemporaryFile("w") as pem_file:
pem_file.write(cadata)
pem_file.flush()
resp = requests.get(url, verify=pem_file.name)
在同步代码中使用httpx
非常简单,因为它接受SSLContext
实例
from aia import AIASession
import httpx
aia_session = AIASession()
url = "https://..."
context = aia_session.ssl_context_from_url(url)
resp = httpx.get(url, verify=context)
此库的证书获取部分和OpenSSL调用是阻塞的,因此此库尚未为异步代码做好准备。但可以很容易地通过一些方法使用它,例如使用tornado.httpclient
或已经看到的httpx
,使用asyncio
import asyncio
from functools import partial
from aia import AIASession
async def get_context(aia_session, url, executor=None):
return await asyncio.get_event_loop().run_in_executor(
executor,
partial(aia_session.ssl_context_from_url, url),
)
# Tornado version
from tornado.httpclient import AsyncHTTPClient
async def download_tornado_async(url):
aia_session = AIASession()
context = await get_context(aia_session, url)
client = AsyncHTTPClient()
try:
resp = await client.fetch(url, ssl_options=context)
return resp.body
finally:
client.close()
result = asyncio.run(download_tornado_async("https://..."))
# httpx version
import httpx
async def download_httpx_async(url):
aia_session = AIASession()
context = await get_context(aia_session, url)
async with httpx.AsyncClient(verify=context) as client:
resp = await client.get(url)
return resp.content
result = asyncio.run(download_httpx_async("https://..."))
项目详情
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码分发
aia-0.2.0.tar.gz (7.0 kB 查看哈希值)
构建分发
aia-0.2.0-py3-none-any.whl (7.0 kB 查看哈希值)
关闭
aia-0.2.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | cdc09ecb8de9004fa9f399e4d41ed0c029947651c8466af02e6f08305f880672 |
|
MD5 | 185c3563230dee0b362d7782df42c52d |
|
BLAKE2b-256 | 9623dede6bbc91c9334501762995bd817228ee5edc4f7f4a09b616519260ee46 |
关闭
aia-0.2.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1bcd020f2d3b11792e86b24f9686616e753ad83f7347a2872c13ad0ce47747e7 |
|
MD5 | 71ba1eb998912338c7af442eb891b3c4 |
|
BLAKE2b-256 | 3e5c621da51ea01d34d0b940b26f8a34b7b68096c192d01c38bf672498c234f9 |