我正在尝试使用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。所以基本上的区别是TLS1可以工作而TLS1.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的Windows7上。不幸的是,这是在一台内部机器上,所以我被困在Windows上,而我们的PyPi内部镜像没有包含所有内容的最新版本。在我看来,这似乎与ssl失败有关,而不一定与requests有关。
谷歌不会给出有希望的结果。有一篇this StackOverflow帖子描述了同样的问题,但提供的解决方案(使用自定义适配器)对我不起作用。
希望其他人以前遇到过这个问题,并能给我一些如何修复它的技巧。请多谢了。
编辑:我用wireshark捕获了这个交互。返回的SSL警报是"Level: Fatal (2) Description: Internal Error (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。服务器确认此消息,然后发送Alert数据包。
发布于 2016-06-17 19:07:15
我删除了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'为我解决了这个问题。
发布于 2021-02-26 18:43:11
对我来说,request.request('GET'...而不是request.get(...是可行的。
发布于 2016-08-17 21:49:08
我删除了几乎所有的第一个条目,去掉了上面的SSLError:
'RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:!eNULL:!MD5' =
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS
https://stackoverflow.com/questions/32910093
复制相似问题