天天看點

aiohttp 異步http請求-7.https請求報SSL問題

前言

預設情況下, 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)