作者:zhoujielcl_767 | 来源:互联网 | 2024-12-04 05:20
概述
在使用 aiohttp 库进行 HTTPS 请求时,默认情况下会启用严格的 SSL 证书验证机制。这可能导致某些环境中出现 ssl.SSLCertVerificationError 错误,提示证书验证失败。本文将介绍几种解决此问题的方法。
忽略 SSL 证书验证
当遇到 SSL 证书验证错误时,可以通过设置 ssl=False
来忽略证书验证:
import aiohttp
import asyncio
async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.example.com', ssl=False) as response:
print(response.url)
print(await response.text())
# 使用 asyncio 运行协程
asyncio.run(fetch_data())
上述代码中,通过设置 ssl=False
,可以绕过 SSL 证书验证,适用于开发或测试环境。但在生产环境中不推荐这样做,因为这可能会导致安全风险。
使用自定义 SSL 证书
如果你有自定义的 SSL 证书,可以通过指定证书路径来验证服务器的身份:
import ssl
import aiohttp
import asyncio
async def fetch_data_with_custom_cert():
sslcOntext= ssl.create_default_context(cafile='/path/to/your/cert.pem')
async with aiohttp.ClientSession(cOnnector=aiohttp.TCPConnector(ssl=sslcontext)) as session:
async with session.get('https://www.example.com') as response:
print(response.url)
print(await response.text())
# 使用 asyncio 运行协程
asyncio.run(fetch_data_with_custom_cert())
这里,我们创建了一个 SSL 上下文,并指定了 CA 证书文件的路径,然后将其传递给 aiohttp.TCPConnector
。
处理自签名证书
对于自签名证书,除了指定 CA 证书外,还需要加载客户端证书和私钥:
import ssl
import aiohttp
import asyncio
async def fetch_data_with_self_signed_cert():
sslcOntext= ssl.create_default_context(cafile='/path/to/your/ca-bundle.crt')
sslcontext.load_cert_chain(certfile='/path/to/your/client-cert.pem', keyfile='/path/to/your/client-key.pem')
async with aiohttp.ClientSession(cOnnector=aiohttp.TCPConnector(ssl=sslcontext)) as session:
async with session.get('https://www.example.com') as response:
print(response.url)
print(await response.text())
# 使用 asyncio 运行协程
asyncio.run(fetch_data_with_self_signed_cert())
这段代码中,我们不仅指定了 CA 证书文件,还通过 load_cert_chain
方法加载了客户端证书和私钥,这对于连接到使用自签名证书的服务器非常有用。
全局设置忽略 SSL 证书验证
如果你希望在整个会话中忽略 SSL 证书验证,可以在创建 ClientSession
时全局设置 ssl=False
:
import aiohttp
import asyncio
async def fetch_data_with_global_ssl_ignore():
cOnnector= aiohttp.TCPConnector(ssl=False)
async with aiohttp.ClientSession(cOnnector=connector) as session:
async with session.get('https://www.example.com') as response:
print(response.url)
print(await response.text())
# 使用 asyncio 运行协程
asyncio.run(fetch_data_with_global_ssl_ignore())
这种方式适用于所有通过该会话发起的请求,同样不推荐在生产环境中使用。
注意
早期版本的 aiohttp 中,可以使用 verify_ssl=False
来忽略 SSL 证书验证,但现在已废弃,应使用 ssl=False
代替。例如:
cOnnector= aiohttp.TCPConnector(verify_ssl=False) # 已废弃
cOnnector= aiohttp.TCPConnector(ssl=False) # 推荐使用
使用已废弃的方法会导致 DeprecationWarning 警告信息。