跳转到主要内容

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 查看哈希值)

上传时间: Python 3

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面