1

Google Plus APIのコマンドライン Python スターターを動作させようとしていますが、認証が完了した後、次のエラーが発生します。

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. cacerts.txt を からhttp://httplib2.googlecode.com/hg-history/6525cadfde53279479533c1235e2661f5c147afc/python2/httplib2/cacerts.txtに手動でコピーしました/usr/lib/python2.7/dist-packages/httplib2
  2. httplib2最新バージョン 0.7.1 にアップデート
  3. スターター キット (plus_cli.py) のファイルから行われたすべての httplib2 呼び出しで SSL を無効にしました。httplib2.Http(disable_ssl_certificate_validation=True)

私はアイデアがありません。これを解決するにはあなたの助けが必要です。

4

6 に答える 6

1

別のスクリプトで同じ問題が発生しましたが、問題は次のとおりだと思います。

  1. Python用のGoogle APIをインストールすると(多かれ少なかれ)、httplib2のバージョンも自動的にインストールされます
  2. このバージョンはバグがあります。1つには、cacerts.txtファイル(私のシステムでは以下にあります

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

ルートでのみ読み取り可能です。しかし、実際の問題は、パッケージが存在しない「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" (そのようなファイルやディレクトリはありません) を含む行を探します。

于 2013-08-11T20:08:02.833 に答える
1

同様のエラーが発生した場合 (エラー コード 185090050):

Dropbox API を使用して同じことがありました。問題は、証明書情報を含むファイルをロードできないことでした。私の場合は、Dropbox SKD で使用される pkg_resources と互換性のない pyInstaller が原因でした。Dropbox の証明書をrest.py次のように割り当てる行を編集するだけです。

TRUSTED_CERT_FILE =  'trusted-certs.crt'

pkg_resources を使用する代わりに、信頼できる証明書のリストをアプリケーションと共に配布します。Python SSL ライブラリは非常に不透明なエラー メッセージを表示しますが、実際には、ファイルが見つからないだけです...

于 2012-05-10T06:16:19.040 に答える
0

これは次のバグのようです: http://code.google.com/p/google-api-python-client/issues/detail?id=58

于 2011-09-20T00:08:15.363 に答える
0

私は (Pyinstaller と共に) gdata クライアントを使用して同様の問題に直面していました。

def get():
    return "cacerts.txt"

これは、Pyinstaller がファイルを見つけられないという単純なケースであり、httplib2 の設計者は、上記で強調した方法で独自のパスを cacerts に追加するケースを許可しています。

于 2016-03-12T14:53:13.863 に答える
0

どの python-httplib2 バージョンを使用していますか?

google-api-python-client 内のものの代わりに python-httplib2 0.7.1-2 (Debian Sid) を使用してこれを解決しました。

于 2011-09-19T09:04:09.727 に答える
0

PyInstaller と Dropbox API で同じエラーが発生します(error code 185090050)

この場合、PyInstaller に Dropobox API から rest.py をロードするよう「指示」する必要があります -> PyInstaller フックに hooks-rest.py という名前のファイルを作成し、 そこに 1 を配置します。次に、信頼できる証明書の場所を rest.py に「伝える」必要があります -> TRUSTED_CERT_FILE = os.path.join('location of trusted-certs.crt', 'trusted-certs.crt')

于 2014-11-01T06:36:01.447 に答える