【发布时间】:2015-10-02 14:58:52
【问题描述】:
我正在尝试使用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。
Google 不会回馈有希望的结果。 this 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。服务器确认此消息,然后发送警报数据包。
【问题讨论】:
-
你能用 Wireshark 捕获网络流量的踪迹吗?在发送警报之前的握手过程中 SSL 协商的所有参数是什么?
-
我现在将编辑结果
-
@AdamRosenfield 发布
标签: python python-3.x ssl python-requests