Windows:Python SSL证书验证失败

hmtdttj4  于 2023-04-21  发布在  Windows
关注(0)|答案(6)|浏览(232)

我已经安装了Anaconda,在尝试通过Jupyter Notebooks进行API调用时遇到了SSL问题:

import requests
import certifi

r = requests.get('https://github.com/')
print(r)

这首先产生了一个SSL连接错误。经过广泛的搜索和我们IT部门的帮助,我可以解决这个问题。这里的解决方案是将公司根证书添加到证书存储中。
现在对于其他请求,不幸的是我仍然有同样的问题。示例代码调用谷歌分析API与google 2 pandas包:

from google2pandas import *

query = {
    'reportRequests': [{
        'viewId' : 37616054,

        'dateRanges': [{
            'startDate' : '8daysAgo',
            'endDate'   : 'today'}],

        'dimensions' : [
            {'name' : 'ga:date'}, 
            {'name' : 'ga:pagePath'},
            {'name' : 'ga:browser'}],

        'metrics'   : [
            {'expression' : 'ga:pageviews'}],

        'dimensionFilterClauses' : [{
            'operator' : 'AND',
            'filters'  : [
                {'dimensionName' : 'ga:browser',
                 'operator' : 'REGEXP',
                 'expressions' : ['Firefox']},

                {'dimensionName' : 'ga:pagePath',
                 'operator' : 'REGEXP',
                 'expressions' : ['iPhone']}]
        }]
    }]
}

# Assume we have placed our client_secrets_v4.json file in the current
# working directory.

conn = GoogleAnalyticsQueryV4(secrets='Analytics.json')
df = conn.execute_query(query)

在这里,我仍然得到了我在之前的简单调用中遇到的SSL错误:
C:\ProgramData\Anaconda3\lib\ssl.py in _create(cls,sock,server_side,do_handshake_on_connect,suppress_ragged_eofs,server_hostname,context,session)848 # non-blocking 849 raise ValueError(“do_handshake_on_connect should not be specified for non-blocking sockets”)--〉850self.do_handshake()851 except(OSError,ValueError):852 self.close()
C:\ProgramData\Anaconda3\lib\ssl.py in do_handshake(self,block)
1106,如果超时== 0.0,则阻塞:1107
self.settimeout(None)-〉1108 self._sslobj.do_handshake()1109 finally:1110 self.settimeout(timeout)
SSLCertVerificationError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_ssl.c:1045)
我相信有另一个库正在使用,它不依赖于证书,但我不知道在哪里以及如何添加我的根证书,所以所有的iPython请求都可以工作。
任何想法都赞赏。

vltsax25

vltsax251#

我花了几天的时间来解决这个问题。最后我在请求库使用的配置文件中添加了我公司的CA证书。您可以通过以下方式检查此文件的路径:

import requests as r
print(r.certs.where())

打印python使用的cacert.pem的路径,编辑它并将CA证书附加到它的底部。

3lxsmp7m

3lxsmp7m2#

一个可能的解决方案是指示Python使用您的Windows证书存储,而不是certifici包中的内置存储。您可以通过安装python-certifici-win32来做到这一点:

pip install python-certifi-win32

然后Python使用与浏览器相同的证书。

jgovgodb

jgovgodb3#

由于安全性的原因,上述解决方案并不是很适合。针对此问题的较好解决方案是:

vdgimpew

vdgimpew4#

您可以对ssl.SSLSocket__init__方法进行monkey-patch,通过强制使用cert_reqs=CERT_NONE参数,使其始终忽略SSL证书验证。
在脚本的开头添加以下内容:

import ssl
orig_sslsocket_init = ssl.SSLSocket.__init__
ssl.SSLSocket.__init__ = lambda *args, cert_reqs=ssl.CERT_NONE, **kwargs: orig_sslsocket_init(*args, cert_reqs=ssl.CERT_NONE, **kwargs)
vx6bjr1n

vx6bjr1n5#

我已经取得了进展. httplib2是包,导致的问题.它有它自己的cacerts.txt,在那里我添加了根证书以及现在.
干杯
安德烈亚斯

dvtswwa3

dvtswwa36#

在每一个“请求.某事”上,加上:

verify=False

作为论据
例如

re=requests.get(str(url)+"/"+str(f), headers=headers)

成为

re=requests.get(str(url)+"/"+str(f), headers=headers, verify=False)

相关问题