Python证书验证失败:无法获取本地颁发者证书

huwehgph  于 2022-12-15  发布在  Python
关注(0)|答案(2)|浏览(386)

我是一个新手程序员,所以请原谅我的错误。我已经写了下面的代码,以验证一个网站列表仍然活跃,我所有的工作是基于这个问题的声明。
脚本能够检查大多数站点,但遇到以下https://precisionit.net/错误

<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)>

上面的URL在Firefox和Chrome中打开正常,但在Python代码中无法打开。我已经更新了cereri,并按照许多人的建议在我的代码中使用它,但错误不会消失。
我使用的是Conda Python Env,还执行了以下命令

conda install -c conda-forge certifi

有很多帖子建议运行“Install Certificates.command”,但它不适用于Conda Python,所以我下载了Python 3.9安装程序并执行了“Install Certificates.command”,然后用Python 3.9执行了脚本,但没有成功。我觉得问题是,即使使用最新版本的证书,站点证书也没有得到验证。尽管certifi page说该列表是基于Mozilla的。的根证书我猜这不是一个完全的副本,这就是为什么火狐浏览器能够打开该网站。不确定我的理解是否有意义,并会很高兴得到纠正。
粘贴我的脚本下面。我不知道还需要做什么来解决这个问题,请建议。

import urllib.request
import sys
import certifi
import ssl

def checkURL(url):
    try: 
        
        hdr = { 'User-Agent' : 'Mozilla/79.0 (Windows NT 6.1; Win64; x64)' }
        req=urllib.request.Request(url,headers=hdr)
        r = urllib.request.urlopen(req,timeout=100,context=ssl.create_default_context(cafile=certifi.where()))
        
    except Exception as e:
        #print(r.read())
        print('Failed Connecting to Website')
        print(e)
        return(1)

    print(r.status)
    finalurl = r.geturl()
    if r.status==200:
        print(finalurl)
        return(0)
    else:
        print("Website Not Found")
        return(2)

checkURL('https://precisionit.net/')

btqmn9zl

btqmn9zl1#

我也遇到过类似的问题,我就是这样解决的。
首先,检查站点证书的颁发者是谁。您可以通过多种方式进行检查(在浏览器中检查,使用openssl连接...)。
最简单的可能是直接转到https://www.digicert.com/help/并搜索https://precisionit.net

你可能错过了Sectigo RSA Domain Validation Secure Server CA。只要去他们的网站(https://support.sectigo.com/Com_KnowledgeDetailPage?Id=kA01N000000rfBO)下载就行了。
然后使用certifi.where()获取保存证书的cacert.pem文件的位置,只需将下载的证书内容添加到该文件中。
证书应采用表格形式

-----BEGIN CERTIFICATE-----  
... some base64 encoded stuff ...  
-----END CERTIFICATE-----
hc8w905p

hc8w905p2#

第一步:将站点公钥保存为base74第二步:添加代码来验证你保存的文件。
enter image description here

with requests.Session() as s:    
        CC_host = 'https://precisionit.net'    
        first_page = s.get(CC_host,verify='./theSiteCert.cer')    
        html = first_page.text    
        print(html)

相关问题