Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何获得'/路径/to/certfile';一个公共网站的请求?_Python_Python 3.x_Python Requests - Fatal编程技术网

Python 我如何获得'/路径/to/certfile';一个公共网站的请求?

Python 我如何获得'/路径/to/certfile';一个公共网站的请求?,python,python-3.x,python-requests,Python,Python 3.x,Python Requests,我使用请求获取网页的HTML。但是,我遇到了证书验证问题。运行代码时,我遇到以下错误: SSL:证书\u验证\u失败 通过其他问题,我找到了两个解决方案。有效的方法是通过函数调用中的verify=False禁用验证。然而,这不是一个安全的选择 另一个是使用verify='/path/to/certfile' 我不知道如何获取certfile的路径。通过Chromer浏览器中的设置,我被带到mac上的一个“钥匙链访问”应用程序中,该应用程序具有各种证书。我将证书“DST Root CA X3”导出

我使用请求获取网页的HTML。但是,我遇到了证书验证问题。运行代码时,我遇到以下错误:

SSL:证书\u验证\u失败

通过其他问题,我找到了两个解决方案。有效的方法是通过函数调用中的
verify=False
禁用验证。然而,这不是一个安全的选择

另一个是使用
verify='/path/to/certfile'

我不知道如何获取certfile的路径。通过Chromer浏览器中的设置,我被带到mac上的一个“钥匙链访问”应用程序中,该应用程序具有各种证书。我将证书“DST Root CA X3”导出到我的工作目录,并提供该文件的路径为
'/path/to/certfile'
值。但这给了我以下错误:

requests.exceptions.SSLError: HTTPSConnectionPool(host='rajyasabha.nic.in',port=443):最大重试次数 超过url:/rsnew/member\u site/memlistedate.aspx(由 SSLError(SSLError(0,“未知错误(_ssl.c:3622)”))

python:

import requests
url='https://rajyasabha.nic.in/rsnew/member_site/MemlistElDate.aspx'
page=requests.get(url)

是否有其他方法获取certfile的路径?

该站点的问题是,服务器未正确配置,无法在TLS握手期间返回证书链中的中间证书。您可以使用以下命令进行检查:

openssl s_client -connect rajyasabha.nic.in:443
如果向下滚动,您将看到服务器只发送深度0(叶证书)。这对于web浏览器来说通常不是问题,因为它们缓存中间证书,但是对于
请求来说是问题,因为它不知道这一点

根证书(在本例中为DST root CA X3)几乎总是存在于操作系统的CA存储库中。所以我们需要的证书是:

depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
因此,您最好从以下URL下载
让我们加密Authority X3
中间证书,并将其设置为
验证路径:

澄清:您应该在
.pem
文件中同时包含中间证书和根证书,因此它应该如下所示:

-----BEGIN CERTIFICATE-----
MIIFjTCCA3WgAwIBAgIRANOxciY0IzLc9AUoUSrsnGowDQYJKoZIhvcNAQELBQAw
...
rUCGwbCUDI0mxadJ3Bz4WxR6fyNpBK2yAinWEsikxqEt
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
...
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----

我尝试了:page=requests.get(url,verify='/Users/Path/lets-encrypt-x3-cross-signed.pem'),但返回了相同的错误:[SSL:CERTIFICATE\u verify\u FAILED]CERTIFICATE verify FAILED(\u SSL.c:833)非常感谢。它现在工作得很好。所以,我假设这是将来每当我遇到这种问题时的解决办法。我很高兴它起了作用。这种情况不应该经常发生,因为通常web服务器配置为提供中间证书和叶证书。如果它们看起来像垃圾,则可能是二进制(DER,PKCS#12)格式。使用openssl命令行或在线转换器(如)将其转换为PEM格式。它再次发挥了魅力。我对这一切都不熟悉,我真的很感谢你的帮助。