2015-01-11 3 views
4

У меня есть проблемы со следующим кодом, я получаю отказ SSLv3 рукопожатия:отказ Python3.4 SSLv3 Рукопожатие с asyncio, aiohttp

import aiohttp 
import asyncio 
import ssl 

def main(): 
    conn = set_conn() 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(get_thing('https://example.com', conn)) 

@asyncio.coroutine 
def get_thing(url, conn): 
    response = yield from aiohttp.request('get', url, connector=conn) 
    print(response.text) 

def set_conn(): 
    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
    context.verify_mode = ssl.CERT_REQUIRED 
    context.check_hostname = True 
    context.load_verify_locations('/path/to/cert.pem') 
    conn = aiohttp.TCPConnector(ssl_context=context) 
    return conn 

if __name__ == "__main__": 
    main() 

StackTrace:

Traceback (most recent call last): 
    File "/Users/grahat03/workspace/ent/env/lib/python3.4/site-packages/aiohttp/connector.py", line 344, in _create_connection 
    **kwargs)) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/base_events.py", line 437, in create_connection 
    sock, protocol_factory, ssl, server_hostname) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/base_events.py", line 453, in _create_connection_transport 
    yield from waiter 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/futures.py", line 348, in __iter__ 
    yield self # This tells Task to wait for completion. 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/tasks.py", line 370, in _wakeup 
    value = future.result() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/futures.py", line 243, in result 
    raise self._exception 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/selector_events.py", line 605, in _on_handshake 
    self._sock.do_handshake() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 805, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:598) 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "/Users/grahat03/workspace/ent/env/lib/python3.4/site-packages/aiohttp/connector.py", line 164, in connect 
    transport, proto = yield from self._create_connection(req) 
    File "/Users/grahat03/workspace/ent/env/lib/python3.4/site-packages/aiohttp/connector.py", line 348, in _create_connection 
    (req.host, req.port)) from exc 
aiohttp.errors.ClientOSError: Can not connect to example.com:443 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "stackoverflow.py", line 26, in <module> 
    main() 
    File "stackoverflow.py", line 10, in main 
    loop.run_until_complete(get_thing(urls[0], conn)) 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/base_events.py", line 208, in run_until_complete 
    return future.result() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/futures.py", line 243, in result 
    raise self._exception 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/asyncio/tasks.py", line 317, in _step 
    result = coro.throw(exc) 
    File "stackoverflow.py", line 14, in get_thing 
    response = yield from aiohttp.request('get', url, connector=conn) 
    File "/Users/grahat03/workspace/ent/env/lib/python3.4/site-packages/aiohttp/client.py", line 104, in request 
    conn = yield from connector.connect(req) 
    File "/Users/grahat03/workspace/ent/env/lib/python3.4/site-packages/aiohttp/connector.py", line 168, in connect 
    raise ClientOSError() from exc 
aiohttp.errors.ClientOSError 

Я на Mac OSX 10.9.5, версия Python:

python3 -c "import sys; print(sys.version)" 
3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 00:54:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] 

OpenSSL, кажется, хорошо, я могу сделать соединение следующим образом:

openssl s_client -connect example.com:443 -cert /path/to/cert.pem 

Я подозреваю, что я создаю что-то, что я не делаю правильно при создании контекста ssl. Любые идеи, пожалуйста?

+0

Вы пытались получить тот же ресурс через 'urllib' или' запросы'? –

+0

Я могу получить ресурс с 'запросами' без проблем. – tfgrahame

+0

Кстати, вы уверены в 'SSLV3'? В вашем примере вы используете 'SSLV23', который является другим протоколом. –

ответ

0

Ответ был использовать другой метод SSLContext:

context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
context.load_cert_chain('/path/to/cert.pem') 

И это не имеет ничего общего с aiohttp.

Смежные вопросы