rauth を使用して twitter で oauth を実行しようとしていますが、次のエラーで失敗しているようです:
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
いくつかのテストの後、api.twitter.com にアクセスして https 接続を確認しようとすると、リクエストが壊れているように見えることがわかりました。以下に例を示します。 https://github.com では動作するように見えますが、https://api.twitter.comでは失敗します:
>>> import requests
>>> requests.get('https://github.com', verify=True)
<Response [200]>
>>> requests.get('https://api.twitter.com/oauth/request_token',verify=True)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "requests/api.py", line 65, in get
return request('get', url, **kwargs)
File "requests/safe_mode.py", line 39, in wrapped
return function(method, url, **kwargs)
File "requests/api.py", line 51, in request
return session.request(method=method, url=url, **kwargs)
File "requests/sessions.py", line 252, in request
r.send(prefetch=prefetch)
File "requests/models.py", line 632, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
>>> requests.get('https://api.twitter.com',verify=True)
[SNIP] Same error as above
これはリクエストのバグですか?これは、rauth が実行しているものと似ているはずなので、私のマシンで動作しない理由がわかりません。
@thomas-orozco からのいくつかの優れた議論により、openssl が G2 VeriSign 証明書を検証できないようです: http://pastebin.com/ZZj3s5uN
certool を使用して VeriSign CA を取得しているようです。
certtool y k=/System/Library/Keychains/SystemCACertificates.keychain | grep -i verisign
コマンドラインのopensslではなく、chrome / safariで使用されています。リクエストが正しい証明書をロードするようにできることはありますか?