Подтвердить что ты не робот

Python - проблема SSL с Oauth2

Кажется, у меня проблема с SSL при попытке использовать oAuth2 в Python. Я провел большую часть дня, пытаясь отладить его, но, похоже, не понял его.

Здесь мой Python Script (Ницца и прост):

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 Interpreter:

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

Теперь, так оно и было известно, у меня есть мой cacerts.txt, который появился с httplib2 в нужном месте, и он найден, но у меня все еще есть эта проблема. Любая помощь приветствуется, спасибо!

4b9b3361

Ответ 1

cacerts.txt содержит слишком мало СА. Если вы замените его на cacert.pem, то не будет ошибки ssl. Здесь тест script:

#!/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 по умолчанию может быть достаточным для последних версий программного обеспечения.

Ответ 2

Сначала запустите pip install certifi. Затем установите свойство ca_certs клиента, прежде чем делать какие-либо запросы:

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

Это было вдохновлено предложением jterrace использовать httplib2.Http.add_certificate

Ответ 3

В файле cacerts.txt по умолчанию, который поставляется с httplib2, содержатся следующие сертификаты:

  • Verisign/RSA Secure Server CA
  • Thawte Personal Basic CA
  • Thawte Personal Premium CA
  • Thawte Personal Freemail CA
  • Сервер Thawte CA
  • Thawte Premium Server CA
  • Equifax Secure CA
  • Verisign Class 1 Public Primary Certification Authority
  • Verisign Class 2 Public Primary Certification Authority
  • Verisign Class 3 Public Primary Certification Authority
  • Verisign Class 1 Public Primary Certification Authority - G2
  • Verisign Class 2 Public Primary Certification Authority - G2
  • Verisign Class 3 Public Primary Certification Authority - G2
  • Verisign Class 4 Public Primary Certification Authority - G2
  • Verisign Class 1 Public Primary Certification Authority - G3
  • Verisign Class 2 Public Primary Certification Authority - G3
  • Verisign Class 3 Public Primary Certification Authority - G3
  • Verisign Class 4 Public Primary Certification Authority - G3
  • Equifax Secure Global eBusiness CA
  • Equifax Secure eBusiness CA 1
  • Equifax Secure eBusiness CA 2
  • Thawte Time Stamping CA
  • thawte Первичный корень CA
  • VeriSign Class 3 Public Primary Certification Authority - G5
  • Центр сертификации сертифицированных серверов Entrust.net
  • Пакет сертификатов корневого сертификата Go Daddy Certificate

Сертификат HTTPS instagram подписан:

  • GeoTrust Global CA

Вам нужно будет добавить сертификат к вашему cacerts.txt

Ответ 4

Я столкнулся с тем же вопросом, что и Flask-Social OAuth для Facebook. Самое простое решение - установить httplib2.ca_certs_locator плагин.

В httplib2. init.py существует встроенная проверка для загрузки сертификатов из другого источника вместо файла cacerts.txt, поставляемого с библиотекой:

try:
    # Users can optionally provide a module that tells us where the CA_CERTS
    # are located.
    import ca_certs_locater
    CA_CERTS = ca_certs_locater.get()
except ImportError:
    # Default CA certificates file bundled with httplib2.
    CA_CERTS = os.path.join(
        os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")

Установка этого плагина устранила проблему для меня без изменений кода/взлома-раундов.

Ответ 5

У меня была такая же ошибка в моей системе (OSX Yosemite), у которой была установлена ​​старая версия Python 2.7 (2.7.1).

Я обновил Python до версии 2.7.10, который решил проблему.

https://www.python.org/downloads/release/python-2710/

Подсказка была в следующем предупреждающем сообщении, которое я видел, когда я экспериментировал с различными решениями:

"InsecurePlatformWarning: истинный объект SSLContext недоступен. Это не позволяет urllib3 правильно настроить SSL и может привести к сбою определенных SSL-соединений. Дополнительные сведения см. в https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning"

Ответ 6

Еще один способ обновить ваш файл cacerts.txt - сохранить httplib2 в актуальном состоянии. Иногда они обновляют этот файл, поэтому, если вы столкнулись с этой проблемой, проверьте, не используете ли вы последнюю версию библиотеки и обновите ее.