首页 > 解决方案 > Python 请求模块中的 SSL 证书错误,但 VBA 中没有

问题描述

我正在尝试向公司的 Intranet 页面发送请求,如下所示:

import requests

http_proxy  = 'some_proxy1'
https_proxy = 'some_proxy2'
URL = 'some_url'


proxyDict = { 
              "http"  : some_proxy1, 
              "https" : some_proxy2
            }

response = requests.get(some_url, proxies=proxyDict, verify=False)

即使verify设置为False,我得到

SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'sslv3 alert bad certificate')],)",)

该代码适用于外部页面。

奇怪的是,我通过 VBA 尝试了相同的请求(但没有代理),它可以工作:

Sub request()

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "some_url"
objHTTP.Open "GET", URL, False
objHTTP.send
Debug.Print objHTTP.responseText

end sub

我可以做些什么来使 Python 代码正常工作吗?

为什么 VBA 对 SSL 证书没有问题?是因为它以某种方式事先知道它 - 因为它是 Windows 原生的 - 并且不需要验证?

标签: pythonvbahttpsslpython-requests

解决方案


SSLError: ("糟糕的握手: 错误([('SSL 例程', 'ssl3_read_bytes', 'sslv3 alert bad certificate')],)",)

这可能意味着服务器希望您使用客户端证书进行身份验证。我的猜测是特定证书在 Windows 证书存储中,并且将由您的 VB 脚本自动使用,就像浏览器自动使用它一样。只是,Python 不使用 Windows 证书存储。这意味着您需要以某种方式从存储中提取特定证书,并将它们明确用作 Python 程序中记录的客户端证书。


推荐阅读