如何获得公共网站的“ / path / to / certfile”以进行请求?

时间:2019-05-31 04:29:52

标签: python python-3.x python-requests

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

  

SSL:CERTIFICATE_VERIFY_FAILED

通过其他问题,我找到了两种解决方案。一种有效的方法是通过函数调用中的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):最多重试   网址超出了:/rsnew/member_site/MemlistElDate.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的路径?

1 个答案:

答案 0 :(得分:0)

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

openssl s_client -connect rajyasabha.nic.in:443

如果向下滚动,您将看到服务器仅发送深度0(叶证书)。对于Web浏览器来说,这通常不是问题,因为它们缓存了中间证书,但是对于requests来说却是一个问题,因为它对此一无所知。

根证书(在这种情况下为DST Root CA X3)几乎始终存在于操作系统的CA存储库中。所以我们需要的证书就是这个:

depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

所以最好的选择是从以下URL下载Let's Encrypt Authority X3中间证书并将其设置为verify路径:

https://letsencrypt.org/certificates/

澄清:您应该在.pem文件中同时包含中间证书和根证书,因此其外观应为:

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