Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求获取TLSV1\u警报\u内部错误_Python_Python 3.x_Ssl_Python Requests - Fatal编程技术网

Python请求获取TLSV1\u警报\u内部错误

Python请求获取TLSV1\u警报\u内部错误,python,python-3.x,ssl,python-requests,Python,Python 3.x,Ssl,Python Requests,我正在尝试连接到具有请求的网站,该请求要求使用客户端证书 import requests r = requests.get(url, cert='path to cert') print(r.status_code) 这适用于使用相同客户端证书的站点。该服务器正在使用TLS\U RSA\U WITH\U AES\U 128\U CBC\U SHA,TLS 1.0。但是,我的目标站点使用TLS\u ECDHE\u RSA\u和\u AES\u 128\u CBC\u SHA,TLS 1.1。所以

我正在尝试连接到具有
请求的网站,该请求要求使用客户端证书

import requests
r = requests.get(url, cert='path to cert')
print(r.status_code)
这适用于使用相同客户端证书的站点。该服务器正在使用TLS\U RSA\U WITH\U AES\U 128\U CBC\U SHA,TLS 1.0
。但是,我的目标站点使用TLS\u ECDHE\u RSA\u和\u AES\u 128\u CBC\u SHA,TLS 1.1。所以基本上区别在于TLS1工作,而TLS1.1不工作。在浏览器中一切正常,所以它一定与Python的SSL有关

我使用的是
requests
version 2.7.0,我还安装了
requests[security]
<代码>pip冻结:

cffi==0.9.2
cryptography==0.8.1
ndg-httpsclient==0.3.3
pyasn1==0.1.7
pycparser==2.10
pyOpenSSL==0.15.1
requests==2.7.0
six==1.9.0
我收到的具体错误是
requests.exceptions.SSLError:[SSL:TLSV1\u ALERT\u INTERNAL\u error]TLSV1 ALERT INTERNAL error(\u SSL.c:600)
。这是在使用Python 3.4.3的Windows 7上实现的。不幸的是,这是在一台内部机器上,所以我只能使用Windows,而我们的PyPi内部镜像并没有所有东西的最新版本。在我看来,这似乎与
ssl
失败有关,而不一定与
请求有关

谷歌不会给出有希望的结果。有一篇StackOverflow文章描述了相同的问题,但是提供的解决方案(使用自定义适配器)对我来说不起作用

希望以前有人碰到过这个问题,可以给我一些关于如何修复它的建议。谢谢你

编辑:我做了一个互动的wireshark捕捉。发送回的SSL警报为“级别:致命(2)说明:内部错误(80)”。TCP连接启动后,我的机器发送一个客户机hello

Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 512
然后,该数据包的握手协议段是

Handshake Type: Client Hello (1)
Length: 508
Version: TLS 1.2 (0x0301)

然后是支持的密码套件列表等。我查看了客户发送的密码套件列表,并列出了
TLS\u ECDHE\u RSA\u WITH_AES\u 128\u CBC\u SHA
。服务器确认此消息,然后发送警报数据包。

我通过从
requests.packages.urllib3.util.ssl\uu默认密码
中删除第一个条目
ECDH+AESGCM
,消除了相同的
SSLError
,服务器似乎遇到了问题。线路

requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:!eNULL:!MD5'

为我解决了这个问题。

我删除了几乎所有的第一个条目,从而消除了上述错误:

requests.packages.urllib3.util.ssl\u.DEFAULT\u CIPHERS='RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!阿努尔:!埃努尔:!MD5'


对我来说,
request.request('GET')…
而不是
request.GET(…
有效。

你能用Wireshark捕获网络流量的跟踪吗?在发送警报之前的握手过程中,SSL协商的所有参数是什么?我将根据结果进行编辑now@AdamRosenfield张贴