Python请求SSLCertVerificationError存在问题

2024-04-19 03:31:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图弄明白,为什么我遇到这样一个问题:Python代码在一个虚拟主机上为有效的LetsEncrypt证书抛出一个SSLCertVerificationError,该虚拟主机具有多个域和同一IP上的证书,如果我删除除一个之外的所有证书,就可以了,但是具有多个证书请求的忽略Python向其发送请求的域,并提取最近的LetsEncrypt certificate,这是不正确的,导致域SSLCertVerificationError

我的理解是,在SNI(服务器名称指示)下,请求应该只提取请求所在域的证书,而不仅仅是最近的证书。我已经检查过了,我正在运行Python,3.8,请求2.5,该请求是在Nginx版本下运行的,该版本已使用SNI支持编译。我可以通过关闭SSL验证来抑制错误,但这似乎是一个糟糕的解决方法

知道发生了什么吗? 为什么当浏览器从Nginx请求页面时SNI工作正常,从Nginx调用正确的证书,但在Python的请求包下执行同样的操作时失败? 我已经阅读了我能找到的所有内容,文档说它应该只在当前的nginxrequestsOpenSSL等版本下工作,但它显然不在这里


要复制,我可以执行请求。获取{'https://kedrosky.org“)本地计算机上没有错误。但在该服务器(托管域)上运行的脚本上,将返回错误域的较新证书,从而导致SSLCertVerificationError


Tags: 方法代码版本ip服务器名称ssl错误
1条回答
网友
1楼 · 发布于 2024-04-19 03:31:27

问题是,服务器配置可能只针对IPv4正确完成,即使域也解析为IPv6地址。对于IPv4,它返回正确的证书:

 $ openssl s_client -connect kedrosky.org:443 -4
 ...
 subject=CN = kedrosky.com

但对于IPv6,它会返回不同的证书(这需要IPv6连接到本地计算机上的internet):

 $ openssl s_client -connect kedrosky.org:443 -6
 ...
 subject=CN = paulandhoward.com

这可能是因为只有listen 443而没有listen [::]:443,后者是IPv6所需要的。在这种情况下,虚拟主机只能在IPv4下正常工作,但在IPv6下,它将只返回默认值,即通常是配置的第一个证书

您看到来自不同主机的不同结果的原因是,一个主机只有IPv4连接,而另一个主机也可以连接IPv6

相关问题 更多 >