Python:使用 surveymonkey.com 请求的 SSLError
Python: SSLError using requests for surveymonkey.com
Python版本:Python2.7.6
OS: OSX 10.10.3
我正在尝试 requests "https://www.surveymonkey.com/"
>>> import requests
>>> requests.get('https://www.surveymonkey.com/')
但我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno bad handshake] [('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')]
我没有得到与“https://www.google.com”相同的错误“
>>> import requests
>>> requests.get('https://www.google.com')
<Response [200]>
这是否意味着 surveymonkey 的 ssl 有问题?
Python版本:2.7.10
>>> requests.get('https://www.surveymonkey.com/mp/legal/which-terms-apply')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)
更新:
我试过 Python 2.7.6、Python 2.7.9、Python 2.7.10
with OS:OSX 10.10.3 with OpenSSL 1.0.2d 2015 年 7 月 9 日。请求版本 2.4.3、2.5.3、2.7.0。
我试过了 configure the ssl protocol. Python 2.7.10 / Requests 2.7.0 下面是代码:
import ssl
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class Ssl3HttpAdapter(HTTPAdapter):
""""Transport adapter" that allows us to use SSLv3."""
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_SSLv3)
s = requests.Session()
s.mount('https://', Ssl3HttpAdapter())
url = 'https://www.surveymonkey.com/'
print s.get(url)
我仍然遇到错误:
Traceback (most recent call last):
File "redirect.py", line 29, in <module>
print s.get(url)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 469, in get
return self.request('GET', url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 420, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)
我无法在我的机器上重现此内容(Py 3.4.2/2.7.9、请求 2.4.3、请求 2.7.0、OpenSSL 1.0.1k、Debian Jessie)。我在某些使用旧 OpenSSL 版本的机器上看到了类似的消息。
您可以尝试升级您的 Python/OpenSSL(旧版本的 Python 附带旧的 OpenSSL 版本)或通过使用 OpenSSL 命令行工具进行测试并改变选项来深入挖掘。告诉我们您使用的 OS 和 Python 版本可能会有所帮助。
openssl s_client -connect www.surveymonkey.com:443
查看 SSL 实验室以获取受支持的 TLS 版本和服务器的密码,采用人性化的格式。
https://www.ssllabs.com/ssltest/analyze.html?d=www.surveymonkey.com
按照建议,您可以尝试强制使用某个 TLS 版本或更改支持的密码列表。据我所知,似乎没有什么好的方法可以通过 API 来影响密码。
由于它对某些人有效而对其他人无效,我们可能想比较不同版本中使用的默认密码。将其更改为 ALL should 可能会使它工作,但不是很安全,因此应该找出哪个限制是罪魁祸首。 SSL Labs 网站可以帮助您。
请参阅下面的代码,了解如何更改默认的 chiphers 列表:
import requests.packages.urllib3.util.ssl_
print(requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS)
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
两种方法:
import requests.packages.urllib3.util.ssl_
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
$ pip install requests[security]
Python版本:Python2.7.6
OS: OSX 10.10.3
我正在尝试 requests "https://www.surveymonkey.com/"
>>> import requests
>>> requests.get('https://www.surveymonkey.com/')
但我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno bad handshake] [('SSL routines', 'SSL23_GET_SERVER_HELLO', 'sslv3 alert handshake failure')]
我没有得到与“https://www.google.com”相同的错误“
>>> import requests
>>> requests.get('https://www.google.com')
<Response [200]>
这是否意味着 surveymonkey 的 ssl 有问题?
Python版本:2.7.10
>>> requests.get('https://www.surveymonkey.com/mp/legal/which-terms-apply')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)
更新: 我试过 Python 2.7.6、Python 2.7.9、Python 2.7.10
with OS:OSX 10.10.3 with OpenSSL 1.0.2d 2015 年 7 月 9 日。请求版本 2.4.3、2.5.3、2.7.0。
我试过了 configure the ssl protocol. Python 2.7.10 / Requests 2.7.0 下面是代码:
import ssl
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class Ssl3HttpAdapter(HTTPAdapter):
""""Transport adapter" that allows us to use SSLv3."""
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_SSLv3)
s = requests.Session()
s.mount('https://', Ssl3HttpAdapter())
url = 'https://www.surveymonkey.com/'
print s.get(url)
我仍然遇到错误:
Traceback (most recent call last):
File "redirect.py", line 29, in <module>
print s.get(url)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 469, in get
return self.request('GET', url, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "/Users/jasony/Documents/python/scripts2/env/lib/python2.7/site-packages/requests/adapters.py", line 420, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)
我无法在我的机器上重现此内容(Py 3.4.2/2.7.9、请求 2.4.3、请求 2.7.0、OpenSSL 1.0.1k、Debian Jessie)。我在某些使用旧 OpenSSL 版本的机器上看到了类似的消息。
您可以尝试升级您的 Python/OpenSSL(旧版本的 Python 附带旧的 OpenSSL 版本)或通过使用 OpenSSL 命令行工具进行测试并改变选项来深入挖掘。告诉我们您使用的 OS 和 Python 版本可能会有所帮助。
openssl s_client -connect www.surveymonkey.com:443
查看 SSL 实验室以获取受支持的 TLS 版本和服务器的密码,采用人性化的格式。 https://www.ssllabs.com/ssltest/analyze.html?d=www.surveymonkey.com
按照建议,您可以尝试强制使用某个 TLS 版本或更改支持的密码列表。据我所知,似乎没有什么好的方法可以通过 API 来影响密码。
由于它对某些人有效而对其他人无效,我们可能想比较不同版本中使用的默认密码。将其更改为 ALL should 可能会使它工作,但不是很安全,因此应该找出哪个限制是罪魁祸首。 SSL Labs 网站可以帮助您。
请参阅下面的代码,了解如何更改默认的 chiphers 列表:
import requests.packages.urllib3.util.ssl_
print(requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS)
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
两种方法:
import requests.packages.urllib3.util.ssl_
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL'
$ pip install requests[security]