前言
預設情況下, aiohttp對 HTTPS 協定使用嚴格檢查。有些同學電腦上請求https請求可能會報ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
SLL 證書校驗
當我們通路一個https請求
import aiohttp
import asyncio
async def main():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.***.com/yoyoketang/') as resp:
print(resp.url)
print(await resp.read())
# asyncio.run(main()) # 會報錯,改成下面2句
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
如果出現SSL證書校驗問題:ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
隻需加一個将 ssl 參數設定為來忽略認證檢查
ssl=False
async with aiohttp.ClientSession() as session:
async with session.get('https://www.***.com/yoyoketang/', ssl=False) as resp:
傳本地證書
如果你本地有ssl證書,證書位址為
/path/to/ca-bundle.crt
, 可以傳本地證書
sslcontext = ssl.create_default_context(
cafile='/path/to/ca-bundle.crt')
r = await session.get('https://example.com', ssl=sslcontext)
如果您需要驗證自簽名ssl.SSLContext.load_cert_chain()證書,您可以執行與上一個示例相同的操作,但使用密鑰對添加另一個調用 :
sslcontext = ssl.create_default_context(
cafile='/path/to/ca-bundle.crt')
sslcontext.load_cert_chain('/path/to/client/public/device.pem',
'/path/to/client/private/device.key')
r = await session.get('https://example.com', ssl=sslcontext)
在 ClientSession 設定忽略證書
我們也可以在建立ClientSession 會話的時候設定
ssl=False
全局參數
conn = aiohttp.TCPConnector(ssl=False)
async with aiohttp.ClientSession(connector=conn) as session:
async with session.get('https://www.cnblogs.com/yoyoketang/') as resp:
print(resp.url)
print(await resp.read())
verify_ssl=False
早期的版本會看到
verify_ssl=False
conn = aiohttp.TCPConnector(verify_ssl=False)
async with aiohttp.ClientSession(connector=conn) as session:
async with session.get('https://www.cnblogs.com/yoyoketang/') as resp:
print(resp.url)
print(await resp.read())
此時會有警告,提示我們用最新的文法
ssl=False
代替原來的'verify_ssl=False`
DeprecationWarning: verify_ssl is deprecated, use ssl=False instead
conn = aiohttp.TCPConnector(verify_ssl=False)