繁体   English   中英

Python 请求获取 TLSV1_ALERT_INTERNAL_ERROR

[英]Python requests gets TLSV1_ALERT_INTERNAL_ERROR

我正在尝试使用需要使用客户端证书的requests连接到网站。

import requests
r = requests.get(url, cert='path to cert')
print(r.status_code)

这适用于使用相同客户端证书的一个站点。 该服务器正在使用TLS_RSA_WITH_AES_128_CBC_SHA, TLS 1.0 但是我的目标站点使用TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS 1.1 所以基本上区别在于 TLS 1 有效而 TLS 1.1 无效。 在浏览器中一切正常,因此它必须与 Python 的 SSL 有关。

我使用requests版本2.7.0,我必须requests[security]装好了。 pip freeze

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_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:600) 这是在带有 Python 3.4.3 的 Windows 7 上。 不幸的是,这是在一台内部机器上,所以我被 Windows 困住了,我们的 PyPi 内部镜像没有所有东西的最新版本。 在我看来,这与ssl失败有关,不一定是requests

谷歌不会回馈有希望的结果。 这个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_ECDHE_RSA_WITH_AES_128_CBC_SHA 服务器确认此消息,然后发送警报数据包。

我通过从requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS删除第一个条目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'

为我解决了这个问题。

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

我通过删除几乎所有第一个条目摆脱了上述 SSLError :

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM