オープンデータとプログラミング

PythonのOAuth2でハマったことあれこれ(メモ)

python

ここのところOAuth関連でハマってしまっています。
まず、最初に登場したエラーはこれです。

[Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

このエラーは、certifiをインストールして証明書をごにょごにょすれば良さげ。
まずはいつものようにpip installします。

pip install certifi

そして、OAuthの自分のソースコードに以下のコードを追加。

import certifi

client = oauth.Client(consumer)
client.ca_certs = certifi.where()

ちなみにcertifi.where()は認証局の証明書のファイルを返します。

C:\>python
>>> import certifi
>>> certifi.where()
'C:\\Python27x86\\lib\\site-packages\\certifi\\cacert.pem'
>>>

自分が書いたOAuthのソースコードを実行すると、エラーの内容が変わりました。

[Errno 1] _ssl.c:1354: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

おそらくですが、OpenSSLが古いからかも…。MACでは問題なかったし。
そろそろPython 2.7.9(現在、2.7.2)にアップデートする必要がありそうです。

OpenSSL のバージョンを確認。

C:\>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> print ssl.OPENSSL_VERSION
OpenSSL 0.9.8l 5 Nov 2009
>>>

当然古いです。
そこで思い切って、Python 2.7.9にアップデート。

C:\>python
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 1.0.1j 15 Oct 2014'

OpenSSLのバージョンも新しくなっています。

そして冒頭のエラーが出ていたプログラムを実行すると・・・・

見事にエラーが出なくなりました。

恐らくですが、接続しようとしていたウェブサイトがSSL3.0を切っていたのでしょう。脆弱性の問題もあったし。

以上でめでたく解決です。

Comments are closed.