我正在尝试连接到需要使用客户端证书的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)
。这是在Windows 7上使用Python 3.4.3。不幸的是,这是在内部机器上,所以我坚持使用Windows,而我们的PyPi内部镜像没有最新版本的所有东西。在我看来,这与ssl
失败有关,而不一定是requests
。
希望其他人之前遇到过这个问题并且可以给我一些关于如何修复它的提示。拜托,谢谢。
编辑:我做了一个wirehark捕获的交互。发回的SSL警报为"级别:致命(2)说明:内部错误(80)"。 TCP连接启动后,我的机器发送客户端问候。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数据包。
答案 0 :(得分:1)
我从SSLError
移除第一个条目ECDH+AESGCM
,删除了相同的requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS
,服务器似乎遇到了问题。这条线
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'
为我解决了这个问题。
答案 1 :(得分:0)
对我来说,request.get(...
代替 df$largerthan <- zoo::rollsum(df$value >= 2, 5, na.pad = T, align = "left") >=5
value largerthan
1 1 FALSE
2 2 FALSE
3 1 FALSE
4 1 FALSE
5 2 TRUE
6 4 NA
7 5 NA
8 3 NA
9 2 NA
有效。
答案 2 :(得分:-1)
我通过删除几乎所有的第一个条目来摆脱上面的SSLError:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS ='RSA + AESGCM:RSA + AES:RSA + HIGH:RSA + 3DES:!aNULL:!eNULL:!MD5'