我试图弄明白,为什么我遇到这样一个问题:Python
代码在一个虚拟主机上为有效的LetsEncrypt证书抛出一个SSLCertVerificationError
,该虚拟主机具有多个域和同一IP上的证书,如果我删除除一个之外的所有证书,就可以了,但是具有多个证书请求的忽略Python向其发送请求的域,并提取最近的LetsEncrypt certificate
,这是不正确的,导致域SSLCertVerificationError
我的理解是,在SNI
(服务器名称指示)下,请求应该只提取请求所在域的证书,而不仅仅是最近的证书。我已经检查过了,我正在运行Python,3.8,请求2.5,该请求是在Nginx
版本下运行的,该版本已使用SNI
支持编译。我可以通过关闭SSL验证来抑制错误,但这似乎是一个糟糕的解决方法
知道发生了什么吗?
为什么当浏览器从Nginx
请求页面时SNI
工作正常,从Nginx
调用正确的证书,但在Python的请求包下执行同样的操作时失败?
我已经阅读了我能找到的所有内容,文档说它应该只在当前的nginx
、requests
、OpenSSL
等版本下工作,但它显然不在这里
要复制,我可以执行请求。获取{'https://kedrosky.org“)本地计算机上没有错误。但在该服务器(托管域)上运行的脚本上,将返回错误域的较新证书,从而导致SSLCertVerificationError
问题是,服务器配置可能只针对IPv4正确完成,即使域也解析为IPv6地址。对于IPv4,它返回正确的证书:
但对于IPv6,它会返回不同的证书(这需要IPv6连接到本地计算机上的internet):
这可能是因为只有
listen 443
而没有listen [::]:443
,后者是IPv6所需要的。在这种情况下,虚拟主机只能在IPv4下正常工作,但在IPv6下,它将只返回默认值,即通常是配置的第一个证书您看到来自不同主机的不同结果的原因是,一个主机只有IPv4连接,而另一个主机也可以连接IPv6
相关问题 更多 >
编程相关推荐