Windows:Python SSL证书验证失败

时间:2018-10-18 09:17:33

标签: python api ssl get

我已经安装了Anaconda并尝试通过Jupyter笔记本进行API调用时遇到SSL问题:

import requests
import certifi

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

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

不幸的是,现在对于其他请求,我仍然遇到相同的问题。使用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错误:

  

C:\ ProgramData \ Anaconda3 \ lib \ ssl.py in _create(cls,sock,server_side,   do_handshake_on_connect,suppress_ragged_eofs,server_hostname,   上下文,会话)       848#无阻塞       849提高ValueError(“ do_handshake_on_connect不应该为   非阻塞插座”)   -> 850 self.do_handshake()       851除了(OSError,ValueError):       852 self.close()

     

do_handshake中的C:\ ProgramData \ Anaconda3 \ lib \ ssl.py(self,block)
  1106如果超时== 0.0并阻止:1107
  self.settimeout(无)   -> 1108 self._sslobj.do_handshake()1109最后:1110 self.settimeout(timeout)

     

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

我相信还有一个不依赖证书的图书馆在使用中?但是我对在哪里以及如何添加根证书一无所知,因此所有iPython请求都可以使用。

任何想法都值得赞赏。

3 个答案:

答案 0 :(得分:0)

您可以猴子修补__init__的{​​{1}}方法,以便它始终通过强制使用ssl.SSLSocket参数来忽略SSL证书验证。

将此添加到脚本的开头:

cert_reqs=CERT_NONE

答案 1 :(得分:0)

我已经取得了进步。 httplib2是导致问题的软件包。它有自己的cacerts.txt,我现在也在其中添加了根证书。

干杯

安德烈亚斯

答案 2 :(得分:0)

我花了几天的时间弄清楚如何解决这个问题。最后,我将我公司的CA证书添加到请求库使用的配置文件中。您可以通过以下方式检查该文件的路径:

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

只需在证书底部添加证书!