2012-02-14 35 views
13

Tôi dường như đang gặp sự cố với SSL bất cứ khi nào cố gắng sử dụng oAuth2 bằng Python. Tôi đã dành hầu hết các buổi chiều cố gắng để gỡ lỗi nó nhưng dường như không thể tìm ra nó.Python - Vấn đề SSL với Oauth2

Dưới đây là Python Script của tôi (Nice và đơn giản):

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']) 

Và những lỗi từ 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 

Bây giờ, chỉ vì vậy nó được biết đến, tôi có cacerts.txt tôi rằng đến với httplib2 ở nơi thích hợp và nó được tìm thấy, nhưng tôi vẫn còn có vấn đề này. Bất kỳ trợ giúp được đánh giá cao, cảm ơn!

Trả lời

8

cacerts.txt chứa quá ít CA. Nếu bạn thay thế nó bằng cacert.pem thì không có lỗi ssl. Dưới đây là một tập lệnh thử nghiệm:

#!/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()) 

Ví dụ minh họa, danh sách CA mặc định có thể đủ trên các phiên bản phần mềm gần đây.

+0

'cacerts.pem' này có vẻ hoàn chỉnh hơn nhiều. Liên kết tiện dụng. –

+1

Là một hack nhanh, bạn cũng có thể ghi đè lên cacerts.txt bằng cacerts.pem ở trên - nhược điểm là bạn cần phải chắc chắn rằng điều này được thực hiện trong tất cả các virtualenv của bạn - vì vậy nó không thực sự lý tưởng. – Damian

2

Các cacerts.txt mặc định mà đi kèm với httplib2 chứa các chứng chỉ:

  • Verisign/RSA an toàn máy chủ CA
  • Thawte cá nhân cơ bản CA
  • Thawte cao cấp cá nhân CA
  • Thawte Freemail cá nhân CA
  • Máy chủ Thawte CA
  • Máy chủ cao cấp Thawte CA
  • Equifax an toàn CA
  • Verisign Class 1 Công chứng tiểu Authority
  • Verisign Class 2 Công chứng tiểu Authority
  • Verisign Class 3 Công chứng tiểu Authority
  • Verisign Class 1 Công Primary Certification Authority - G2
  • Cơ quan cấp chứng nhận chính công khai cấp 2 của Verisign Lớp 2 - G2
  • Cơ quan cấp chứng chỉ chính cấp 2 của Verisign Lớp 3 - G2
  • Veri dấu hiệu Class 4 Công Primary Certification Authority - G2
  • Verisign Class 1 Công Primary Certification Authority - G3
  • Verisign Class 2 Công Primary Certification Authority - G3
  • Verisign Class 3 Public Primary Certification Authority - G3
  • Verisign Class 4 Công Primary Certification Authority - G3
  • Equifax an toàn toàn cầu eBusiness CA
  • Equifax an toàn eBusiness CA 1
  • Equifax an toàn eBusiness CA 2
  • Thawte Thời gian dập CA
  • Thawte Tiểu Root CA
  • VeriSign Class 3 Public Primary Certification Authority - G5
  • Entrust.net Máy Chủ Bảo Mật Certification Authority
  • Go Daddy Certification Authority chứng chỉ gốc Bundle

Các instagram chứng chỉ HTTPS được ký bởi:

  • GeoTrust toàn cầu CA

Bạn sẽ cần phải thêm chứng chỉ cho cacerts.txt của bạn

+0

Tôi đã tìm thấy chi tiết chứng chỉ, nhưng làm thế nào để tôi nhận được oauth2 để đọc một cacerts.txt khác? – Steve

+0

Đối tượng oauth2 '' Client'' kế thừa từ '' httplib2.Http'', vì vậy bạn nên gọi [add_certificate] của nó (http://httplib2.googlecode.com/hg/doc/html/libhttplib2.html#httplib2. Http.add_certificate) phương pháp. – jterrace

7

Trước tiên, chạy pip install certifi. Sau đó, thiết lập thuộc tính ca_certs của khách hàng, trước khi đưa ra bất kỳ yêu cầu:

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

này được lấy cảm hứng từ đề nghị jterrace để sử dụng httplib2.Http.add_certificate

2

tôi đã chạy vào cùng một vấn đề với cuộc gọi OAuth Flask-xã hội của Facebook. Giải pháp đơn giản nhất là cài đặt plugin httplib2.ca_certs_locator.

Trong httplib2. init py, có một tấm séc được xây dựng-in cho giấy chứng nhận tải từ nguồn khác thay vì tập tin cacerts.txt cung cấp cùng với thư viện:

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") 

Cài đặt plug-in này khắc phục được vấn đề đối với tôi không có thay đổi mã/hack-a-round.

+0

Lưu ý rằng các phiên bản trước của httplib2 không cố tải từ 'ca_certs_locator' –

0

Tôi đã gặp lỗi tương tự trên hệ thống của mình (OSX Yosemite) đã cài đặt phiên bản Python 2.7 cũ (2.7.1).

Tôi đã nâng cấp Python lên 2.7.10 đã giải quyết được sự cố.

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

Các đầu mối là trong thông điệp cảnh báo sau đây mà tôi chứng kiến ​​trong khi tôi đang thử nghiệm với các giải pháp khác nhau:

"InsecurePlatformWarning: Một đối tượng SSLContext đúng là không có sẵn Điều này ngăn cản urllib3 từ cấu hình SSL một cách thích hợp. và có thể khiến các kết nối SSL nhất định thất bại. Để biết thêm thông tin, hãy xem https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning "

0

Một cách khác để cập nhật tệp cacerts.txt của bạn là giữ cho được cập nhật. Họ thỉnh thoảng cập nhật tệp này, vì vậy nếu bạn gặp sự cố này, hãy kiểm tra xem bạn có đang sử dụng phiên bản thư viện mới nhất hay không và cập nhật nó.

Các vấn đề liên quan