asynchronous aiohttp requests fails, but synchronous requests succeed
I suspect certificate validation chain is broken on your machine. On Ubuntu everything is working, as @dano mentioned.
Anyway, you may disable ssl validation by creating custom Connector
instance:
import asyncio
import aiohttp
urls = [
'http://www.whitehouse.gov/cea/',
'http://www.whitehouse.gov/omb',
'http://www.google.com']
def test_async():
connector = aiohttp.TCPConnector(verify_ssl=False)
for url in urls:
try:
r = yield from aiohttp.request('get', url, connector=connector)
except aiohttp.errors.ClientOSError as e:
print('bad eternal link %s: %s' % (url, e))
else:
print(r.status)
if __name__ == '__main__':
print('async')
asyncio.get_event_loop().run_until_complete(test_async())
BTW, requests
library is shipped with own certificate bundle. Maybe we need to do the same for aiohttp?
UPD. See also https://github.com/aio-libs/aiohttp/issues/341
I had the same problem on an old Linux server with out of date CA root certificates, and loading certifi CA certificate bundle in a SSLContext
fixed the issue.
import aiohttp
import ssl
import certifi
ssl_context = ssl.create_default_context(cafile=certifi.where())
async with aiohttp.ClientSession() as session:
async with session.get('https://some.foo/bar/', ssl=ssl_context) as response:
print(await response.text())