Windows:Python SSL 证书验证失败

问题描述 投票:0回答:6

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

import requests
import certifi

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

这首先产生了 SSL 连接错误。经过广泛的搜索和我们 IT 部门的帮助,我可以解决这个问题。这里的解决方案是将公司根证书添加到 certifi 证书存储中。

现在对于其他请求,不幸的是我仍然遇到同样的问题。使用 google2pandas 包调用 Google Analytics API 的示例代码:

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 错误:

_create 中的 C:\ProgramData\Anaconda3\lib\ssl.py(cls, sock, server_side, do_handshake_on_connect、suppress_ragged_eofs、server_hostname、 上下文、会话) 第848章 第849章 非阻塞套接字”) --> 850 self.do_handshake() 第851章 第852章

do_handshake(self, block)中的C:\ProgramData\Anaconda3\lib\ssl.py

第1106章 1107 第1107章 self.settimeout(无) -> 1108 self._sslobj.do_handshake() 1109 最后:1110 self.settimeout(timeout)

SSLCertVerificationError:[SSL:CERTIFICATE_VERIFY_FAILED]证书 验证失败:无法获取本地颁发者证书(_ssl.c:1045)

我相信还有另一个库正在使用,它不依赖于证书?但我不知道在哪里以及如何添加我的根证书,所以所有 iPython 请求都可以工作。

任何想法都值得赞赏。

python ssl get
6个回答
27
投票

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

打印python使用的
cacert.pem

的路径,编辑它并将CA证书附加到它的底部。

    


22
投票
根据评论已过时:

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

pip install python-certifi-win32

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


5
投票

前往
    https://letsencrypt.org/certificates/
  • 并下载“ISRG Root X1”、“ISRG Root X2”、“Let’s Encrypt R3”(.der 文件) 导入本地受信任的根证书颁发机构中的 3 个证书,请按照本指南进行操作
  • https://www.sonicwall.com/support/knowledge-base/how-can-i-import-certificates-into-the-ms -windows-local-machine-certificate-store/170504615105398/
  • 您可能需要重新启动系统

2
投票
__init__

ssl.SSLSocket
方法进行猴子修补,以便它始终通过强制
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)



0
投票

干杯,

安德烈亚斯


0
投票

verify=False

作为论据

例如

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

成为

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

© www.soinside.com 2019 - 2024. All rights reserved.