python httplib2 证书验证失败

2024-01-01

我已经尝试了一切我能找到的方法来让它发挥作用......

我正在为基于 python 的任务程序(称为 GTG)开发一个插件。我在 Opensuse Linux 上运行 Gnome。

代码(Python 2.7):

def initialize(self):
    """
    Intialize backend: try to authenticate. If it fails, request an authorization.
    """
    super(Backend, self).initialize()
    path = os.path.join(CoreConfig().get_data_dir(), 'backends/gtask', 'storage_file-%s' % self.get_id())
    # Try to create leading directories that path
    path_dir = os.path.dirname(path)
    if not os.path.isdir(path_dir):
        os.makedirs(path_dir)

    self.storage = Storage(path)
    self.authenticate()

def authenticate(self):
    """ Try to authenticate by already existing credences or request an authorization """
    self.authenticated = False

    credentials = self.storage.get()
    if credentials is None or credentials.invalid == True:
        self.request_authorization()
    else:
        self.apply_credentials(credentials)
        # Request periodic import, avoid waiting a long time
        # self.start_get_tasks()

def apply_credentials(self, credentials):
    """ Finish authentication or request for an authorization by applying the credentials """


    http = httplib2.Http(ca_certs = '/etc/ssl/certs/ca_certs.pem', disable_ssl_certificate_validation=True)

    http = credentials.authorize(http)

    # Build a service object for interacting with the API.
    self.service = build_service(serviceName='tasks', version='v1', http=http, developerKey='AIzaSyAmUlk8_iv-rYDEcJ2NyeC_KVPNkrsGcqU')
    # self.service = build_service(serviceName='tasks', version='v1')
    self.authenticated = True

def _authorization_step2(self, code):
    credentials = self.flow.step2_exchange(code)
    # credential = self.flow.step2_exchange(code)

    self.storage.put(credentials)
    credentials.set_store(self.storage)

    return credentials

def request_authorization(self):
    """ Make the first step of authorization and open URL for allowing the access """

    self.flow = OAuth2WebServerFlow(client_id=self.CLIENT_ID,
        client_secret=self.CLIENT_SECRET,
        scope='https://www.googleapis.com/auth/tasks',
        redirect_uri='http://localhost:8080',
        user_agent='GTG')


    oauth_callback = 'oob'
    auth_uri = self.flow.step1_get_authorize_url(oauth_callback)
    # credentials = self.flow.step2_exchange(code)



    # url = self.flow.step1_get_authorize_url(oauth_callback)
    browser_thread = threading.Thread(target=lambda: webbrowser.open_new(auth_uri))
    browser_thread.daemon = True
    browser_thread.start()

    # Request the code from user
    BackendSignals().interaction_requested(self.get_id(), _(
        "You need to <b>authorize GTG</b> to access your tasks on <b>Google</b>.\n"
        "<b>Check your browser</b>, and follow the steps there.\n"
        "When you are done, press 'Continue'."),
        BackendSignals().INTERACTION_TEXT,
        "on_authentication_step")


def on_authentication_step(self, step_type="", code=""):

    if step_type == "get_ui_dialog_text":
        return _("Code request"), _("Paste the code Google has given you"
                "here")
    elif step_type == "set_text":
        try:

            credentials = self._authorization_step2(code)
        except FlowExchangeError, e:
            # Show an error to user and end
            self.quit(disable = True)
            BackendSignals().backend_failed(self.get_id(), 
                        BackendSignals.ERRNO_AUTHENTICATION)
            return

        self.apply_credentials(credentials)
        # Request periodic import, avoid waiting a long time
        self.start_get_tasks()

浏览器窗口打开,我看到来自 Google 的代码。该程序会打开一个小窗口,我可以在其中输入来自 Google 的代码。当发生这种情况时,我会在控制台中看到以下内容:

 No handlers could be found for logger "oauth2client.util"
Created new window in existing browser session.
[522:549:0108/063825:ERROR:nss_util.cc(821)] After loading Root Certs, loaded==false: NSS error code: -8018

但 Chrome 中的 SSL 图标是绿色的...

然后当我提交代码时,我得到:

    Exception in thread Thread-10:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.7/site-packages/GTG/backends/backend_gtask.py", line 204, in on_authentication_step
    credentials = self._authorization_step2(code)
  File "/usr/lib/python2.7/site-packages/GTG/backends/backend_gtask.py", line 151, in _authorization_step2
    credentials = self.flow.step2_exchange(code)
  File "/usr/lib/python2.7/site-packages/oauth2client/util.py", line 132, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/oauth2client/client.py", line 1283, in step2_exchange
    headers=headers)
  File "/usr/lib/python2.7/site-packages/httplib2/__init__.py", line 1586, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "/usr/lib/python2.7/site-packages/httplib2/__init__.py", line 1328, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "/usr/lib/python2.7/site-packages/httplib2/__init__.py", line 1250, in _conn_request
    conn.connect()
  File "/usr/lib/python2.7/site-packages/httplib2/__init__.py", line 1037, in connect
    raise SSLHandshakeError(e)
SSLHandshakeError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

该文件名为 backend_gtask.py...

我已尝试按照此处所述导入证书:如何更新Github的httplib2的cacerts.txt? https://stackoverflow.com/questions/18557744/how-to-update-cacerts-txt-of-httplib2-for-github

我曾尝试禁用验证(httplib2.Http(disable_ssl_certificate_validation=True)),如网络上所述,

我已经更新了 python 包(这似乎让事情变得更糟)

我已在 /etc/ssl... 和 /usr/lib/python2.7/... 之间来回复制 ca_certs.pem

当我在浏览器中访问身份验证页面时,它说证书已验证...

我还可以检查什么?

简短的测试代码:

from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run
from oauth2client.file import Storage

CLIENT_ID = 'id'
CLIENT_SECRET = 'secret'

flow = OAuth2WebServerFlow(client_id=CLIENT_ID,
                           client_secret=CLIENT_SECRET,
                           scope='https://www.googleapis.com/auth/tasks',
                           redirect_uri='http://localhost:8080')

storage = Storage('creds.data')

credentials = run(flow, storage)

print "access_token: %s" % credentials.access_token

发现这里:https://github.com/burnash/gspread/wiki/How-to-get-OAuth-access-token-in-console%3F https://github.com/burnash/gspread/wiki/How-to-get-OAuth-access-token-in-console%3F


好的... 非常感谢史蒂芬·乌尔里希。

httplib2 版本 0.9 尝试使用系统证书,而不是以前附带的 certs.txt 文件。它还强制执行验证。

httplib2 可以采用一些有用的参数 - 特别是 ca_certs。使用它指向 ssl 安装中实际的 *.pem 文件。我不能是一个文件夹,必须是一个真实的文件。

我在插件的初始化中使用以下内容:

self.http = httplib2.Http(ca_certs = '/etc/ssl/ca-bundle.pem')

然后,对于对 httplib 或 google 客户端库的所有后续调用,我将预构建的 http 对象作为参数传递,如下所示:

credentials = self.flow.step2_exchange(code, self.http)

self.http = credentials.authorize(self.http)

现在 ssl 连接可以与新的 httplib2 一起使用...

我最终必须确保插件可以在任何系统上找到证书,但至少我知道问题是什么。

再次感谢史蒂芬·乌尔里希 https://stackoverflow.com/users/3081018/steffen-ullrich让我经历了这一切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python httplib2 证书验证失败 的相关文章

随机推荐

  • 如何在 Vim 中折叠 C++ 风格的注释?

    Vim 中的语法折叠可以轻松地为区域创建折叠 可以使用正则表达式定义折叠的开始和结束 syn 区域 myRegion start region end endregion 透明 keepend 扩展折叠 但是 我不确定如何使用语法折叠来定义
  • 捕获一个字符串,然后匹配以该字符串开头的所有其他单词

    我有一个包含 80 000 多个单词的列表 每个单词都用换行符分隔 我需要匹配每个包含较小单词作为前缀的单词 例如 bald lt captures bald balder lt matches because it starts with
  • 如何在 Docker 容器上安装 Access Runtime?

    我想在 Docker 容器上安装 Access Runtime 但这样做时遇到了失败 以下是重现错误的基本命令 首先使用新的 Windows 容器启动交互式 shell docker container run it mcr microso
  • C# 更新 DLL,无需重新编译项目

    我编写了一个小程序 其中引用了将包含在安装文件中的 dll 文件 我还需要一种更新dll的方法 以防我更改某些功能 而不需要再次重新下载整个程序 只需替换dll文件 这可能吗 我刚刚在某处读到我必须使用新的 dll 版本更新 xml 文件
  • 当一个变量=另外两个而不是一个时如何使用替换

    好吧 这个可能有点难 我使用的 VB 看起来像这样 string Replace string ToLower chr 63 A 但我也想要 chr 63 B 如下所示 string Replace string ToLower chr 6
  • Session.SaveOrUpdate Copy() 和 Session.Merge() 有什么区别?

    在 NHibernate 3 1 中 ISession SaveOrUpdateCopy 已被标记为已弃用 该文档建议使用Merge 反而 每个的文档如下 SaveOrUpdateCopy object obj 将给定对象的状态复制到具有相
  • 如何在 Vim 上保存选项卡中的所有文件?

    如果我在 VIM 的选项卡中有多个文件 而我只编辑其中的几个文件 如何用一个命令保存它们 命令wa 短缺wall 将写入所有更改的缓冲区 您还可以使用 tabdo w 这绝对正是您想要的 并且概括得很好
  • .csproj 文件中自动生成的 IntermediateOutputPath

    从 Git 更新代码后 出现错误csproj 因为file路径不存在 这是引发错误的代码
  • 如何强制在抽象类的所有子类中定义构造函数

    我有一个定义抽象方法的抽象类 A 这意味着 要使类可实例化 必须实现所有抽象方法 我希望我的所有子类都实现一个以 2 个整数作为参数的构造函数 声明构造函数违背了我的目的 因为我希望在子类中定义构造函数 并且我对实现一无所知 此外 我不能将
  • MRC命令的附加协处理器寄存器的作用是什么?

    引用自 ARMMRC文档 MRC 2
  • UIView 中的黑色背景?

    我按照在线教程在子类 UIView 中进行绘制 本教程显示了一个具有白色背景的 UIView 我通过简单地更改超级的背景颜色来修复此问题 问题是 当触摸结束时 背景不会保持清晰 我不知道 我只是尝试将填充颜色设置为 uicolorclear
  • 链式哈希表与开放寻址哈希表

    有人可以解释这两种实现之间的主要区别 优点 缺点 吗 对于图书馆 建议采用什么实施方式 维基百科关于哈希表的文章 http en wikipedia org wiki Hash table对人们使用的不同哈希表方案提供了明显更好的解释和概述
  • 我可以将 Subversion 用于多 GB 数据集吗?

    该数据集包含 6766 个文件夹中的 97984 个文件 大小为 2 57 GB 其中很多是二进制文件 对我来说 这听起来并不那么重要 大约 50 个文件的每日数据更改率为数百 KB 但我担心颠覆会变得极其缓慢 无论如何 它从来都不是很快
  • 尝试在 Google App Engine 项目中创建备份时出现 404

    Setup 我按照以下步骤后遇到了404问题不被接受问题的答案App Engine 数据存储区 以编程方式备份 https stackoverflow com questions 15811982 appengine datastore b
  • 艰苦学习 Python 练习 48 帮助

    我正在学习 Python The Hard Way 并在练习 48 中遇到了挑战 您将获得大量代码作为单元测试 并要求我们创建一个函数以使单元测试通过 我不确定这段代码到底应该是什么样子 我已粘贴其中一个函数作为参考 它们看起来都与这个相似
  • 指定条形图中条形之间的空格

    我正在尝试用 R 生成一个条形图 条形的宽度不同 条形之间的间距也不同 例如我有一个矩阵 data lt matrix c 1 2 2 4 7 1 11 12 3 ncol 3 byrow T colnames data lt c Star
  • MongoDB (Java) - 如何运行保存在 javascript 文件中的查询?

    所以我有很多 js 文件 我之前用它们从命令行界面查询 MongoDB 但现在我希望能够通过 Java 运行这些相同的查询 我使用 Java 来支持依赖于查询中的信息 我如何使用来自 Java 驱动程序的 JavaScript 查询并返回一
  • Python下间歇性“sslv3警报握手失败”

    我有一个用 Java 编写的 REST API 在 JBoss 下运行 最近我们将 JVM 从 1 6 更新到了 1 7 这开始导致仅我们正在连接的 Python 客户端出现问题 Python 客户端间歇性地出现握手失败 我们编写了一个非常
  • 如何禁用 Maven Javadoc 插件中的 Javadoc 警告?

    我正在使用 Maven Javadoc 插件 它输出警告如下 ERROR home monperrus spoon src main java spoon visitor CtVisitor java 144 warning no para
  • python httplib2 证书验证失败

    我已经尝试了一切我能找到的方法来让它发挥作用 我正在为基于 python 的任务程序 称为 GTG 开发一个插件 我在 Opensuse Linux 上运行 Gnome 代码 Python 2 7 def initialize self I