Python - Oauth2 的 SSL 问题

标签 python ssl oauth certificate ssl-certificate

每当尝试在 Python 中使用 oAuth2 时,我似乎遇到了 SSL 问题。我花了整个下午的大部分时间尝试调试它,但似乎无法弄清楚。

这是我的 Python 脚本(简单易用):

import oauth2.oauth2 as oauth
import urlparse
import time

## If you're actually processing requests, you'll want this
# import simplejson


### GET A REQUEST TOKEN ###

consumer = oauth.Consumer(key="***KEYHERE***", secret="***KEYSECRETHERE***")

request_token_url = 'https://api.instagram.com/oauth/access_token'

client = oauth.Client(consumer)
resp, content = client.request(request_token_url, "GET")

request_token = dict(urlparse.parse_qsl(content))


token = oauth.Token(request_token['oauth_token'], request_token['oauth_token_secret'])

还有来自 Python 解释器的这些错误:

Traceback (most recent call last):
  File "E:\Projects\oAuth2Test\test.py", line 16, in <module>
    resp, content = client.request(request_token_url, "GET")
  File "E:\Projects\oAuth2Test\oauth2\oauth2.py", line 682, in request
    connection_type=connection_type)
  File "E:\Projects\oAuth2Test\httplib2\httplib2.py", line 1445, in request
    (response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
  File "E:\Projects\oAuth2Test\httplib2\httplib2.py", line 1197, in _request
    (response, content) = self._conn_request(conn, request_uri, method, body, headers)
  File "E:\Projects\oAuth2Test\httplib2\httplib2.py", line 1133, in _conn_request
    conn.connect()
  File "E:\Projects\oAuth2Test\httplib2\httplib2.py", line 914, in connect
    raise SSLHandshakeError(e)
SSLHandshakeError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

现在,众所周知,我将 httplib2 随附的 cacerts.txt 放在正确的位置并找到了,但我仍然遇到这个问题。感谢任何帮助,谢谢!

最佳答案

cacerts.txt 包含的 CA 太少。如果将其替换为 cacert.pem那么就没有ssl错误。这是一个测试脚本:

#!/usr/bin/env python3
import http.client
import ssl

####context = ssl.create_default_context(cafile='cacerts.txt') # ssl.SSLError
####context = ssl.create_default_context(cafile='cacert.pem')  # works   
context = ssl.create_default_context()  # works as is on the recent versions
#NOTE: ssl.CERT_REQUIRED is set for the default Purpose.SERVER_AUTH

h = http.client.HTTPSConnection('api.instagram.com', 443, context=context)
h.request('POST', '/oauth/access_token')
resp = h.getresponse()
print(resp.status, resp.reason) # produce expected 400 http error
print(resp.headers)
print(resp.read())

如示例所示,默认 CA 列表对于最新的软件版本可能就足够了。

关于Python - Oauth2 的 SSL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270195/

相关文章:

ios - 将 TouchID 与 KeyCloak 等身份提供商结合使用

python - 保护 Django OAuth 工具包 View

javascript - App Engine OAuth 提供商 CORS

python - 获取python文件的doc字符串

python - 动态更改 urwid.MainLoop 小部件的首选方法

python - 为什么python中有日期类

IIS 7 上托管的 WCF 无法验证消息的安全性

java - 将 SSL 证书转换或导入到 Java keystore

python - 将时间增量添加到天空时间

java - Sonatype OSS 索引分析器请求组件错误报告 javax.net.ssl.SSLHandshakeException :