希望解决在localhost上运行的Google Plus API命令行Python入门套件中的SSL错误

时间:2011-09-17 01:26:37

标签: python ssl localhost google-plus httplib2

我正在尝试让command-line Python starter for Google Plus API正常工作,但在身份验证完成后,我遇到了这个错误:

ssl.SSLError: [Errno 185090050] _ssl.c:336: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib

我正在运行Python 2.7 on Ubuntu 11.04。 API使用httplib2发送请求。我从localhost开始运行入门套件。


这是终端转储:

Traceback (most recent call last):
File "/home/vijay/Downloads/google-plus-python-starter/cli/plus_cli.py", line 114, in <module>
main()
File "/home/vijay/Downloads/google-plus-python-starter/cli/plus_cli.py", line 62, in main
credentials = authorize_self(settings.CLIENT_ID,settings.CLIENT_SECRET)
File "/home/vijay/Downloads/google-plus-python-starter/cli/plus_cli.py", line 48, in authorize_self
credentials = run(flow, storage)
File "/home/vijay/Downloads/googleapi/oauth2client/tools.py", line 146, in run
credential = flow.step2_exchange(code)
File "/home/vijay/Downloads/googleapi/oauth2client/client.py", line 698, in step2_exchange
headers=headers)
File "/home/vijay/Downloads/googleapi/httplib2/__init__.py", line 1436, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/vijay/Downloads/googleapi/httplib2/__init__.py", line 1188, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/vijay/Downloads/googleapi/httplib2/__init__.py", line 1123, in _conn_request
conn.connect()
File "/home/vijay/Downloads/googleapi/httplib2/__init__.py", line 890, in connect
self.disable_ssl_certificate_validation, self.ca_certs)
File "/home/vijay/Downloads/googleapi/httplib2/__init__.py", line 76, in _ssl_wrap_socket
cert_reqs=cert_reqs, ca_certs=ca_certs)
File "/usr/lib/python2.7/ssl.py", line 344, in wrap_socket
ciphers=ciphers)
File "/usr/lib/python2.7/ssl.py", line 119, in __init__
ciphers)
ssl.SSLError: [Errno 185090050] _ssl.c:336: error:0B084002:x509 certificate routines:X509_load_cert_crl_file:system lib`

我试图让这项工作成功的事情:

  1. http://httplib2.googlecode.com/hg-history/6525cadfde53279479533c1235e2661f5c147afc/python2/httplib2/cacerts.txt的cacerts.txt手动复制到/usr/lib/python2.7/dist-packages/httplib2
  2. httplib2更新为最新版本0.7.1
  3. 使用httplib2.Http(disable_ssl_certificate_validation=True)
  4. 在使用入门套件(plus_cli.py)中的文件进行的所有httplib2调用中禁用SSL

    我没有想法,需要你的帮助来解决这个问题。

6 个答案:

答案 0 :(得分:1)

如果有人有类似的错误(错误代码185090050):

我使用Dropbox API做了同样的事情。问题是无法加载包含证书信息的文件;在我的情况下,这是因为pyInstaller,它与Dropbox SKD使用的pkg_resources不兼容。只需编辑将Dropbox的rest.py中的证书分配给以下内容的行:

TRUSTED_CERT_FILE =  'trusted-certs.crt'

而不是使用pkg_resources,并将受信任的证书列表与应用程序一起分发。 Python SSL库显示非常不透明的错误消息,但实际上,它只是一个丢失的文件...

答案 1 :(得分:1)

我对不同的脚本有同样的问题,并认为问题如下:

  1. 安装google api for python one(或多或少)时自动安装httplib2版本
  2. 这个版本是错误的。一方面是cacerts.txt文件(我的系统位于
  3. 下面)

    /usr/local/lib/python2.7/dist-packages/httplib2-0.8-py2.7.egg/httplib2)

    只是root可读。但实际问题似乎是包找到了一个不存在的“ca_certs_locatermodule”。

    由于我的系统已经安装了httplib2作为一个自己的包(你的看起来似乎)(重新)移动这个错误版本的httplib2(即文件夹

    /usr/local/lib/python2.7/dist-packages/httplib2-0.8-py2.7.egg)

    解决了这个问题。要追查这类问题,您可以运行

    strace -o io.txt python your_script.py

    并在文件io.txt中查找包含“ENOENT”的行(没有这样的文件或目录)。

答案 2 :(得分:0)

您使用的是哪个python-httplib2版本?

我通过使用python-httplib2 0.7.1-2(Debian Sid)而不是google-api-python-client中的那个来解决这个问题。

答案 3 :(得分:0)

答案 4 :(得分:0)

PyInstaller和Dropbox API提供相同的错误(error code 185090050)

在这种情况下,我们必须“告诉”PyInstaller从Dropobox API加载rest.py - &gt;在PyInstaller钩子中创建一个名为的文件: hooks-rest.py 并将1放在那里!然后我们必须“告诉”rest.py,其中可信证书是 - &gt; TRUSTED_CERT_FILE = os.path.join('location of trusted-certs.crt', 'trusted-certs.crt')

答案 5 :(得分:0)

我在使用gdata客户端(以及Pyinstaller)时遇到了类似的问题,最简单的解决方法是在httplib2模块中添加名为“ca_certs_locater.py”的文件,并在文件中添加以下代码:

def get():
    return "cacerts.txt"

这是Pyinstaller找不到文件的一个简单例子,httplib2的设计者允许通过我在上面突出显示的方法添加你自己的cacerts路径。