2012-11-10 40 views
9

Tôi đang cố gắng để thực hiện một yêu cầu userless API Foursquare sử dụng Mike Lewis Python wrapper - https://github.com/mLewisLogic/foursquare:python Foursquare - Giấy chứng nhận SSL3 Kiểm định thất bại

client = foursquare.Foursquare(client_id=Client_ID, client_secret=Client_Secret) 
categs = client.venues.categories() 

tục, tôi nhận được một "Lỗi kết nối với Foursquare API "msg. Chạy một logger để đón nhắn chi tiết hơn sản xuất:

"thói quen SSL: SSL3_GET_SERVER_CERTIFICATE: Giấy chứng nhận Kiểm định thất bại"

này không sử dụng để xảy ra và xảy ra cả trên máy tính Windows phát triển địa phương của tôi và trên một máy chủ đang chạy ubuntu. Tôi có thiếu cái gì cơ bản ở đây về chứng chỉ bảo mật không? Vấn đề là liên tục và đôi khi chỉ để lại một phút và thử lại khắc phục sự cố tạm thời.

Tôi đã tải xuống phiên bản mới nhất 20120716 của trình bao bọc mặc dù trong mã cho init.py nó vẫn nói API_VERSION = '20120608'. Tôi đang sử dụng Python 2.73 và cũng đã đăng ký cho khóa Foursquare API, sử dụng id và bí mật trong mã trên. Tôi liệt kê các url, sử dụng IP cục bộ của tôi: 8000 và đã thử sử dụng các khóa riêng cho các máy cục bộ và máy dev nhưng điều này dường như không tạo ra sự khác biệt nào.

Giúp đánh giá cao. Cảm ơn.

Trả lời

23

Tôi đã gặp phải sự cố tương tự chính xác ngày hôm qua. Tôi đã tìm kiếm rất nhiều và đã thử rất nhiều, và dường như các chiến lược sau đây hoạt động cho trường hợp của tôi (tôi không chắc chắn 100% nhưng nó không báo cáo lỗi nữa).

1) Tải http://curl.haxx.se/ca/cacert.pem

wget http://curl.haxx.se/ca/cacert.pem 

2) Tới Python của bạn httplib2 dir. Mine là /usr/local/lib/python2.7/dist-packages/httplib2

cd /usr/local/lib/python2.7/dist-packages/httplib2 

3) Sao lưu Giấy chứng nhận hiện

cp cacerts.txt backup_cacerts.txt 

4) Và sau đó sao chép các tập tin tải về ở đó và đổi tên nó như cacerts.txt

mv cacert.pem cacerts.txt 

Vậy là xong.

Hy vọng điều đó sẽ hữu ích. Nếu không phục hồi từ tập tin sao lưu và thử các phương pháp khác.

kịch bản Foursquare tôi làm việc tất cả ngay sau khi tôi thay đổi điều này:)

+0

Hoạt động như một sự quyến rũ! Cảm ơn – user1814277

+1

Giải pháp này cũng hoạt động cho gói 'requests' bằng cách thay thế tệp site-packages/requests/cacert.pem. – ShinNoNoir

+1

Và cũng hoạt động với boto trong 'site-packages/boto/cacerts/cacerts.txt' – ogrisel

0

Cài đặt hoặc nâng cấp certifi gói:

pip install --upgrade certifi 

Đây là giải pháp được đề nghị bởi urllib3 (được sử dụng bởi nhiều dự án bao gồm requests , lần lượt được sử dụng bởi thư viện mẫu được liên kết ở trên và nhiều thư viện khác): http://urllib3.readthedocs.io/en/latest/user-guide.html#certificate-verification

Nếu bạn cần sử dụng nó cho một gói không sử dụng urllib3, nhưng ví dụ httplib2, bạn sao chép tệp certifi/cacerts.pem vào httplib2/cacerts.txt.Các thư mục để sao chép từ/đến có thể được tìm thấy bằng cách thực hiện:

python -c 'import httplib2; import os.path; print(os.path.dirname(httplib2.__file__))' 

python -c 'import certifi; import os.path; print(os.path.dirname(certifi.__file__))' 

Nếu bạn chỉ sử dụng urllib2, sau đó vào thư mục httplib2/ không được sử dụng, nhưng một vị trí hệ thống. Bạn có thể kiểm tra các tệp đang được ẩn với một cái gì đó như sau:

strace python -c "import urllib2; urllib2.urlopen(urllib2.Request('https://google.com/'))" 2>&1 | grep 'open' | grep 'cert' 
Các vấn đề liên quan