2016-01-28 2 views
0

Я видел довольно много разных проблем с «Сбросом соединения с помощью peer» и Python, однако, я думаю, что эта проблема другая.Python 3.5 - Сброс соединения с помощью peer

Возникла проблема: я пытаюсь получить доступ к веб-сервису через https, который находится в той же сети, что и моя. Каждая попытка, которую я совершил для выполнения вызова через Python, вернулась с «Connection reset by peer». Я запускаю это в Linux.

Тем не менее, я могу оба Curl и получить доступ к веб-сервису через браузер без каких-либо проблем. Кроме того, этот же скрипт работает в Windows и других средах Linux (хотя на них работает Python 2.7).

Я пробовал оба запроса и использовал базовый urllib.request.

# I specify blank proxy since I have CNTLM setup for outbound. 
requests.get(url, proxies={'https': ''}, auth=(user, pass), verify=False) 

Я также попытался:

session = requests.Session() 
session.trust_env=False 

# This still brings up 'Connection reset by peer' with/without http auth 
response = session.get(url) 

И я попробовал длинный путь ...

import urrlib 
proxy_handler = urllib.request.ProxyHandler({}) 
proxy_opener = urllib.request.build_opener(proxy_handler) 
urllib.request.install_opener(proxy_opener) 

# do the same for basic auth.... 

resp = urllib.request.urlopen(url) 

Есть идеи?

ответ

0

Я понял.

Мое предположение заключается в том, что протокол SSL/TLS по умолчанию является неприемлемым протоколом серверов. В основном это означает, что серверы должны обновляться для работы с новейшими версиями TLS.

Однако запросы и Urllib не разрешали эту проблему подключения. Я указал более старую версию SSL (знаю ... я знаю ...) для использования в транспорте.

Мой код кончался будучи похож на ниже, which was derived from the requests documentation

import certifi 
import ssl 
import requests 

from requests.adapters import HTTPAdapter 
from requests.packages.urllib3.poolmanager import PoolManager 

class Ssl3HttpAdapter(HTTPAdapter): 
    def init_poolmanager(self, connections, maxsize, block=False): 
     # specify the version of SSL you want to use below 
     self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, block=block, 
             ssl_version=ssl.PROTOCOL_SSLv3) 

s = requests.Session() 

# May or may not need this. I needed it since I didn't need to route through a proxy to get to local services. 
s.trust_env = False 

s.verify = certifi.where() 
s.auth = (user, password) # Basic-Auth username/password 

s.mount(base_url_of_your_service, Ssl3HttpAdapter()) 

req = s.get(your_service_url) 
print(req.text) 
Смежные вопросы