urllib và SSL SSL: CERTIFICATE_VERIFY_FAILED Lỗi lỗi


279

Tôi nhận được lỗi sau:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in        __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in  run
self.__target(*self.__args, **self.__kwargs)
File "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", line 271, in process
info = urllib2.urlopen(req).read()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1240, in https_open
context=self._context)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)>

Đây là mã gây ra lỗi này:

if input.startswith("!web"):
    input = input.replace("!web ", "")      
    url = "https://domainsearch.p.mashape.com/index.php?name=" + input
    req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
    info = urllib2.urlopen(req).read()
    Message.Chat.SendMessage ("" + info)

API tôi đang sử dụng yêu cầu tôi sử dụng HTTPS. Làm thế nào tôi có thể làm cho nó bỏ qua xác minh?


2
Không có gì sai với URL và nó có thể được xác minh thành công với các chứng chỉ tin cậy phổ biến. Vì vậy, tốt nhất bạn không nên cố gắng bỏ qua xác nhận chứng chỉ, nhưng để sửa nó. Phiên bản nào của python bạn đang sử dụng?
Steffen Ullrich

Điều này có thể liên quan đến stackoverflow.com/a/27826829/3081018 . Máy chủ sử dụng cùng loại chuỗi chứng chỉ với nhiều đường dẫn tin cậy. Xem ở đó quán cà phê bạn có thể cần sử dụng để xác minh.
Steffen Ullrich

7
Lỗi này cũng xảy ra trên Python 3.5 sau khi nâng cấp lên yosemite
pyCthon 3/03/2015

2
Điều này giải thích tình hình. access.redhat.com/articles/2039753
Charlie Burns

4
"Làm thế nào tôi có thể làm cho nó bỏ qua xác minh?" là câu hỏi sai Bạn có thể nên hỏi làm thế nào để xác nhận chứng chỉ được cung cấp bởi tên miền.
jww

Câu trả lời:


296

Nếu bạn chỉ muốn bỏ qua xác minh, bạn có thể tạo SSLContext mới . Theo mặc định, các bối cảnh mới được tạo sử dụng CERT_NONE .

Hãy cẩn thận với điều này như đã nêu trong phần 17.3.7.2.1

Khi gọi trực tiếp hàm tạo SSLContext, CERT_NONE là mặc định. Vì nó không xác thực các máy ngang hàng khác, nên nó có thể không an toàn, đặc biệt là trong chế độ máy khách, nơi bạn muốn đảm bảo tính xác thực của máy chủ mà bạn đang nói chuyện. Do đó, khi ở chế độ máy khách, rất khuyến khích sử dụng CERT_REQUIRED.

Nhưng nếu bạn chỉ muốn nó hoạt động ngay bây giờ vì một số lý do khác bạn có thể làm như sau, bạn cũng sẽ phải import ssl:

input = input.replace("!web ", "")      
url = "https://domainsearch.p.mashape.com/index.php?name=" + input
req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' })
gcontext = ssl.SSLContext()  # Only for gangstars
info = urllib2.urlopen(req, context=gcontext).read()
Message.Chat.SendMessage ("" + info)

Điều này sẽ giải quyết vấn đề của bạn nhưng bạn không thực sự giải quyết bất kỳ vấn đề nào, nhưng bạn sẽ không thấy [SSL: CERTIFICATE_VERIFY_FAILED]vì bạn hiện không xác minh chứng chỉ!

Để thêm vào những điều trên, nếu bạn muốn biết thêm về lý do tại sao bạn thấy những vấn đề này, bạn sẽ muốn xem qua PEP 476 .

PEP này đề xuất cho phép xác minh chữ ký chứng chỉ X509, cũng như xác minh tên máy chủ cho các máy khách HTTP của Python theo mặc định, tùy thuộc vào việc từ chối trên cơ sở mỗi cuộc gọi. Thay đổi này sẽ được áp dụng cho Python 2.7, Python 3.4 và Python 3.5.

Có một lời khuyên từ chối không giống với lời khuyên của tôi ở trên:

import ssl

# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)

Nó cũng có một tùy chọn không được khuyến khích thông qua trò chơi ghép hình mà bạn không thường thấy ở python:

import ssl

ssl._create_default_https_context = ssl._create_unverified_context

Mà ghi đè chức năng mặc định để tạo bối cảnh với chức năng để tạo một bối cảnh chưa được xác minh.

Xin lưu ý với điều này như được nêu trong PEP:

Hướng dẫn này chủ yếu nhằm vào các quản trị viên hệ thống muốn áp dụng các phiên bản Python mới hơn triển khai PEP này trong các môi trường kế thừa chưa hỗ trợ xác minh chứng chỉ trên các kết nối HTTPS. Ví dụ: quản trị viên có thể từ chối bằng cách thêm khỉp ở trên vào sitecustomize.py trong Môi trường hoạt động tiêu chuẩn cho Python. Các ứng dụng và thư viện KHÔNG NÊN làm cho quá trình thay đổi này trở nên rộng rãi (ngoại trừ có lẽ để đáp ứng với cài đặt cấu hình do quản trị viên hệ thống kiểm soát).

Nếu bạn muốn đọc một bài báo về lý do tại sao không xác nhận certs là xấu trong phần mềm, bạn có thể tìm thấy nó ở đây !


1
Vì vậy, nếu lỗi này khiến tôi không sử dụng, setup.py uploadlàm thế nào tôi có thể sửa nó?
pyCthon 3/03/2015

5
ssl._create_default_https_context = ssl._create_unverified_context điều này làm việc cho tôi như được đề cập bởi Noelkd gần cuối. Vì chúng tôi là một trang web mạng nội bộ dành cho máy in HP ... hoàn toàn được sử dụng để cạo ... chúng tôi không gặp vấn đề gì khi sử dụng phương pháp này.
ihightower

Phương pháp đầu tiên của bạn là phương pháp ít mong muốn nhất - bỏ qua xác nhận. Tại sao một trong những thực sự xác nhận chứng chỉ không được liệt kê đầu tiên?
jww

1
điều này cũng có thể xảy ra nếu bạn có phiên bản openSSL lỗi thời. Vì vậy, đối với tôi những gì đã làm việc là cập nhật lên phiên bản mới nhất certifi và cập nhật openssl trên các hộp.
myusuf3

1
context là những gì tôi cần
nguyện

382

Đây không phải là giải pháp cho vấn đề cụ thể của bạn, nhưng tôi đang đặt nó ở đây vì chủ đề này là kết quả hàng đầu của Google cho "SSL: CERTIFICATE_VERIFY_FAILED" và nó dẫn tôi đến một cuộc rượt đuổi ngông cuồng.

Nếu bạn đã cài đặt Python 3.6 trên OSX và gặp lỗi "SSL: CERTIFICATE_VERIFY_FAILED" khi cố gắng kết nối với một trang web https: //, thì có lẽ vì Python 3.6 trên OSX hoàn toàn không có chứng chỉ và không thể xác thực bất kỳ SSL nào kết nối. Đây là một thay đổi cho 3.6 trên OSX và yêu cầu bước cài đặt sau, cài đặt certifigói chứng chỉ. Điều này được ghi lại trong ReadMe, mà bạn nên tìm thấy tại/Applications/Python\ 3.6/ReadMe.rtf

ReadMe sẽ cho bạn chạy đoạn script cài đặt sau này, nó chỉ cài đặt certifi:/Applications/Python\ 3.6/Install\ Certificates.command

Ghi chú phát hành có thêm một số thông tin: https://www.python.org/doads/release/python-360/


105
Chạy trực tiếp / Ứng dụng / Python \ 3.6 / Cài đặt \ Chứng chỉ. Hãy giải quyết vấn đề của tôi trên OSX. Cảm ơn.
muyong

2
Tôi đang sử dụng OS X El Capitan 10.11.6, Python 3.6.0 và giải pháp này hoạt động hoàn hảo.
y2knopropet

2
Tôi đang sử dụng macOS Sierra 10.12.5, Python 3.6.1 và giải pháp này hoạt động hoàn hảo.
James

4
Điều này đã sửa nó cho tôi /Applications/Python\ 3.7/Install\ Certificates.command chạy trực tiếp trong terminal! Cảm ơn bạn @CraigGlennie & @muyong Tôi đánh giá cao việc out-of-the-box-thinkingđặt nó ở đây!
JayRizzo

6
Python 3.7 trên macOS Mojave: nó không hoạt động ở đây. Tôi đã gỡ cài đặt / cài đặt lại / chạy chứng chỉ cài đặt, khởi động lại, v.v. không hoạt động với tôi
Thomas

71

Để mở rộng câu trả lời của Craig Glennie:

trong Python 3.6.1 trên MacOs Sierra

Nhập cái này vào bash terminal đã giải quyết vấn đề:

pip install certifi
/Applications/Python\ 3.6/Install\ Certificates.command

3
thử sudo /Applications/Python\ 3.6/Install\ Certificates.commandnếu quyền bị từ chối.
KingKongCoder

Điều này thực tế không khắc phục được sự cố trên Python 3.6. -1
hyperum

1
Nếu sử dụng dòng lệnh khiến bạn hoảng sợ (có thể không phải nếu bạn ở đây, nhưng hey), bạn cũng có thể tìm thấy thư mục Ứng dụng (hoặc tương đương trên các HĐH khác) mà Python đã tạo khi cài đặt, sau đó mở tập lệnh bằng cách nhấp đúp. Tên cụ thể của thư mục tùy thuộc vào phiên bản Python bạn đã cài đặt.
Erdős-Bacon

Làm việc như một bùa mê cho Python 3.7.3. Cảm ơn bạn.
klbytec

Cảm ơn. Tôi thực sự đã tìm kiếm 100 giải pháp và bạn đã làm việc.
NND

43

Trên Windows, Python không nhìn vào chứng chỉ hệ thống, nó sử dụng chính nó nằm ở ?\lib\site-packages\certifi\cacert.pem.

Giải pháp cho vấn đề của bạn:

  1. tải xuống chứng chỉ xác thực tên miền dưới dạng tệp * .crt hoặc * pem
  2. mở tệp trong trình chỉnh sửa và sao chép nội dung của nó vào clipboard
  3. tìm cacert.pemvị trí của bạn :from requests.utils import DEFAULT_CA_BUNDLE_PATH; print(DEFAULT_CA_BUNDLE_PATH)
  4. chỉnh sửa cacert.pemtệp và dán chứng chỉ xác thực tên miền của bạn vào cuối tệp.
  5. Lưu tập tin và tận hưởng các yêu cầu!

6
lib\site-packages\certifi\cacert.pemkhông tồn tại trong Python 2.7.10. Và câu hỏi là về urllib2khôngrequests
Kevin Smyth

2
Giải pháp tốt nhất cho đến nay, API twitter sử dụng chứng chỉ DigiCert không có trong tệp cacert.pem của python của tôi. Tôi đã thêm vào đó và VOILA!
digz6666

2
Đã làm việc trên Debian. Đối với các bản ghi, đường dẫn tệp trên hệ thống của tôi là : /usr/local/lib/python2.7/dist-packages/certifi-2015.09.06.2-py2.7.egg/certifi/cacert.pem. Cảm ơn!
ofavre

Thật không may, các yêu cầu python không sử dụng bất kỳ cửa hàng ủy thác CA nào của hệ điều hành. github.com/requests/requests/issues/2966 . Bạn phải đặt REQUESTS_CA_BUNDLE github.com/bloomreach/s4cmd/issues/111#issuecomment-406839514 .
Jamshid

Hoạt động trên Windows 10, Python 3.6, với API Google và Twitter và mô-đun yêu cầu nói chung.
brittenb

36

Giải pháp của tôi cho Mac OS X:

1) Nâng cấp lên Python 3.6.5 bằng ứng dụng gốc Trình cài đặt Python được tải xuống từ trang web ngôn ngữ Python chính thức https://www.python.org/doads/

Tôi đã thấy rằng trình cài đặt này đang chăm sóc việc cập nhật các liên kết và liên kết tượng trưng cho Python mới tốt hơn nhiều so với homebrew.

2) Cài đặt chứng chỉ mới bằng cách sử dụng "./Install Chứng chỉ.command" trong thư mục Python 3.6 được làm mới

> cd "/Applications/Python 3.6/"
> sudo "./Install Certificates.command"

Làm việc như bùa mê trong Mac OS X.
Manu mathew

31

Bạn có thể thử thêm điều này vào các biến môi trường của bạn:

PYTHONHTTPSVERIFY=0 

Lưu ý rằng điều này sẽ vô hiệu hóa tất cả xác minh HTTP, do đó, một chút cách tiếp cận búa tạ, tuy nhiên nếu không cần xác minh thì đó có thể là một giải pháp hiệu quả.


17
Tôi nghi ngờ rằng việc vô hiệu hóa tất cả xác minh HTTP cho tất cả các python là hơi quá đáng để xử lý một lỗi trong xác minh. Có rất nhiều trường hợp trong đó người ta có thể muốn xác minh theo mặc định.
trevorKirkby

Làm việc cho tôi trên Windows Server 2016 trên python 2.7.13. Tôi thường không cài đặt python trên các máy chủ windows nhưng cần nâng cấp vCenter với Nexus 1000v di chuyển sang VDS và điều này chỉ khắc phục sự cố với chứng chỉ vCenter tự ký vào thời điểm hiện tại (sẽ sử dụng VMCA và certs hợp lệ trong nâng cấp môi trường). Tôi không có may mắn nhận được chứng chỉ được chấp nhận bằng cách chỉnh sửa cacert.pem trong gói yêu cầu python
Christopher Thorjussen

3
Ngoài ra, tôi đặt biến trực tiếp trong cửa sổ dòng lệnh trước khi chạy tập lệnh, vì vậy nó sẽ không vô hiệu hóa tất cả các kiểm tra như @ ai đó hoặc người khác sợ, điều mà tôi cũng không khuyến nghị.
Christopher Thorjussen

Đó là hoàn hảo cho trường hợp sử dụng của tôi: thử nghiệm. Tôi sẽ không bao giờ làm điều này trong sản xuất, nhưng đối với việc chạy thử nghiệm không liên quan gì đến SSL, đó là một lựa chọn tuyệt vời.
sorin

Cảm ơn, giải pháp này đã giúp tôi: nhập os os.envir ["PYTHONHTTPSVERIFY"] = "0"
mbello

28

Tôi đã gặp một vấn đề tương tự, mặc dù tôi đã sử dụng urllib.request.urlopentrong Python 3.4, 3.5 và 3.6 . (Đây là một phần tương đương với Python 3 urllib2, trên mỗi ghi chú ở đầu urllib2trang tài liệu của Python 2. )

Giải pháp của tôi là pip install certificài đặt certifi, trong đó có:

... một bộ sưu tập Chứng chỉ gốc được quản lý cẩn thận để xác thực tính tin cậy của chứng chỉ SSL trong khi xác minh danh tính của máy chủ TLS.

Sau đó, trong mã của tôi, nơi trước đây tôi vừa có:

import urllib.request as urlrq

resp = urlrq.urlopen('https://example.com/bar/baz.html')

Tôi sửa nó thành:

import urllib.request as urlrq
import certifi

resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())

Nếu tôi đọc urllib2.urlopentài liệu chính xác, nó cũng có một cafileđối số. Vì vậy, urllib2.urlopen([...], certifi.where())có thể cũng hoạt động với Python 2.7.


CẬP NHẬT (2020/01/01): Tính đến Python 3.6, các cafilelập luận để urlopenđã bị phản đối , với contextlý luận phải được xác định để thay thế. Tôi thấy những điều sau đây hoạt động tốt như nhau trên 3,5 đến 3,8:

import urllib.request as urlrq
import certifi
import ssl

resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))

1
load_verify_locationsđột biến SSLContextthể hiện và trả về None. Bạn nên sử dụng context=ssl.create_default_context(cafile=certifi.where())thay thế. Xem ssltài liệu để biết thêm.
Ostrokach

1
@ostrokach Huh, tôi đã thử một cái gì đó như thế, nhưng tôi phải sử dụng sai sslchức năng. Xem chỉnh sửa; đồng ý?
hBy2Py

13
import requests
requests.packages.urllib3.disable_warnings()

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Lấy từ đây https://gist.github.com/michaelrice/a6794a017e349fc65d01


đã thử nghiệm giải pháp này trong môi trường Jenkins, môi trường cá nhân, điều này hoạt động!
rapport89

2
Điều này cực kỳ không an toàn vì nó bỏ qua TẤT CẢ xác minh chứng chỉ, sử dụng rủi ro của riêng bạn và vì tình yêu BẤT CỨ NÀO không sử dụng điều này trong mã sản xuất.
dragon788

Cảm ơn. Cuối cùng nó đã làm việc. Không cần thiết Python 3.6 được cài đặt trong / Ứng dụng trên Mac OS. Đây phải là câu trả lời được chấp nhận.
Biranchi

Bạn không bao giờ nên làm như vậy khỉpatching. Nó cực kỳ nguy hiểm và sẽ ảnh hưởng đến tất cả việc sử dụng mã phía dưới.
Acumenus

10

Giống như tôi đã viết trong một bình luận, vấn đề này có lẽ liên quan đến câu trả lời SO này .

Tóm lại: có nhiều cách để xác minh chứng chỉ. Xác minh được sử dụng bởi OpenSSL không tương thích với các chứng chỉ gốc đáng tin cậy mà bạn có trên hệ thống của mình. OpenSSL được sử dụng bởi Python.

Bạn có thể thử lấy chứng chỉ còn thiếu cho Cơ quan chứng nhận chính công cộng lớp 3 Verisign và sau đó sử dụng cafiletùy chọn theo tài liệu Python :

urllib2.urlopen(req, cafile="verisign.pem")

Bạn có thể giúp tôi giải quyết vấn đề có liên quan này trong liên kết
Không có

8

Tôi gặp vấn đề tương tự trên một trong các máy Linux của mình. Tạo chứng chỉ mới và xuất một biến môi trường trỏ đến thư mục chứng chỉ đã sửa nó cho tôi:

$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs

7

Tôi cần thêm một câu trả lời khác vì giống như Craig Glennie, tôi đã đuổi theo một con ngỗng hoang dã do có nhiều bài viết đề cập đến vấn đề này trên Web.

Tôi đang sử dụng MacPorts và điều ban đầu tôi nghĩ là sự cố Python thực tế là sự cố MacPorts: nó không cài đặt chứng chỉ gốc với cài đặt openssl. Giải pháp là port install curl-ca-bundle, như đã đề cập trong bài đăng trên blog này .


5

Tôi đã tìm thấy điều này ở đây

Tôi tìm thấy giải pháp này, chèn mã này vào đầu tệp nguồn của bạn:

import ssl

try:
   _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    # Legacy Python that doesn't verify HTTPS certificates by default
    pass
else:
    # Handle target environment that doesn't support HTTPS verification
    ssl._create_default_https_context = _create_unverified_https_context

Mã này làm cho xác minh hoàn tác để chứng nhận ssl không được xác minh.


xem video này nó đã giúp tôi rất nhiều để hiểu ssl là gì. URL video: youtu.be/dsuVPxuU_hc
Ganesh Chowdhary Sadanala

4

Đối với Python 3,4+ trên Centos 6/7, Fedora , chỉ cần cài đặt CA đáng tin cậy theo cách này:

  1. Sao chép CA.crt vào /etc/pki/ca-trust/source/anchors/
  2. update-ca-trust force-enable
  3. update-ca-trust extract

2
Có thể là câu hỏi ngu ngốc, nhưng CA.crt là gì và tôi có thể tìm thấy nó ở đâu?
Iqbal

4

Giải pháp cho Anaconda

Thiết lập của tôi là Anaconda Python 3.7 trên MacOS với proxy. Các con đường là khác nhau.

  • Đây là cách bạn có được đường dẫn chứng chỉ chính xác :
import ssl
ssl.get_default_verify_paths()

mà trên hệ thống của tôi sản xuất

Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None,
 openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem',
 openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')

Khi bạn biết chứng chỉ đi đến đâu, sau đó bạn nối chứng chỉ được sử dụng bởi proxy đến cuối tệp đó.

Tôi đã thiết lập conda để làm việc với proxy của mình, bằng cách chạy:

conda config --set ssl_verify <pathToYourFile>.crt

Nếu bạn không nhớ chứng chỉ của mình ở đâu, bạn có thể tìm thấy nó ở ~/.condarc:

ssl_verify: <pathToYourFile>.crt

Bây giờ nối tập tin đó vào cuối /miniconda3/ssl/cert.pem và các yêu cầu sẽ hoạt động, và đặc biệt sklearn.datasetsvà các công cụ tương tự sẽ hoạt động.

Hãy cẩn thận hơn nữa

Các giải pháp khác không hoạt động vì thiết lập Anaconda hơi khác:

  • Đường dẫn Applications/Python\ 3.Xđơn giản là không tồn tại.

  • Đường dẫn được cung cấp bởi các lệnh bên dưới là đường dẫn SAU

from requests.utils import DEFAULT_CA_BUNDLE_PATH
DEFAULT_CA_BUNDLE_PATH

3

Tôi cúi đầu trong sự xấu hổ, vì tôi có cùng một vấn đề, ngoại trừ trong trường hợp của tôi, URL tôi đang nhấn là hợp lệ, chứng chỉ là hợp lệ. Điều không hợp lệ là kết nối của tôi với web. Tôi đã không thêm chi tiết proxy vào trình duyệt (IE trong trường hợp này). Điều này đã dừng quá trình xác minh xảy ra chính xác.
Đã thêm vào các chi tiết proxy và con trăn của tôi sau đó rất hạnh phúc.


1
Đừng xấu hổ vì đã quên điều gì đó và sau đó tìm ra nó và chia sẻ, ai đó có thể thấy điều đó hữu ích. Sử dụng IE mặc dù ... xấu hổ: p
Davos

3

Python 2.7.12 (mặc định, ngày 29 tháng 7 năm 2016, 15:26:22) đã khắc phục sự cố được đề cập. Thông tin này có thể giúp đỡ người khác.


3
Tôi đã gặp nó vào ngày 2.7.12 trên mac, sử dụng thư viện urllib2, sử dụng thư viện của
constets

@marcadian Cài đặt và sử dụng certifi, rõ ràng là một loại chứng chỉ được giữ bởi requests, đã khắc phục sự cố cho tôi trên Python 3.4 đến 3.6 .
hBy2Py

3

Tôi ngạc nhiên khi tất cả các hướng dẫn này đã không giải quyết vấn đề của tôi. Tuy nhiên, chẩn đoán là chính xác (BTW, tôi đang sử dụng Mac và Python3.6.1). Vì vậy, để tóm tắt phần chính xác:

  • Trên Mac, Apple đang bỏ OpenSSL
  • Python hiện sử dụng bộ Chứng chỉ gốc CA của riêng nó
  • Cài đặt Python nhị phân cung cấp một tập lệnh để cài đặt chứng chỉ CA Root mà Python cần ("/ Ứng dụng / Python 3.6 / Cài đặt Chứng chỉ.command")
  • Đọc "/ Ứng dụng / Python 3.6 / ReadMe.rtf" để biết chi tiết

Đối với tôi, tập lệnh không hoạt động và tất cả các cài đặt certifi và openssl cũng không thể sửa được. Có lẽ bởi vì tôi có nhiều cài đặt python 2 và 3, cũng như nhiều virtualenv. Cuối cùng, tôi cần sửa nó bằng tay.

pip install certifi   # for your virtualenv
mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl
cp -a <your virtualenv>/site-package/certifi/cacert.pem \
  /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/cert.pem

Nếu điều đó vẫn thất bại bạn. Sau đó, cài đặt lại OpenSSL.

port install openssl

2

Giống như bạn, tôi đang sử dụng python 2.7 trên iMac cũ của mình (OS X 10.6.8), tôi cũng gặp vấn đề khi sử dụng urllib2.urlopen:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

Các chương trình của tôi đã chạy tốt mà không gặp sự cố chứng chỉ SSL và đột ngột (sau khi tải chương trình), chúng bị lỗi với lỗi SSL này.

Vấn đề là phiên bản của python được sử dụng:

  1. Không có vấn đề gì với https://www.python.org/doads và python-2.7.9-macosx10.6.pkg

  2. sự cố với công cụ Homebrew được cài đặt sẵn: "brew install python", phiên bản nằm trong / usr / local / bin.

Một chương, được gọi Certificate verification and OpenSSL [CHANGED for Python 2.7.9], trong /Applications/Python 2.7/ReadMe.rtfgiải thích vấn đề với nhiều chi tiết.

Vì vậy, hãy kiểm tra, tải xuống và đưa vào PATH của bạn phiên bản đúng của python.


2

Python 2.7 trên Amazon EC2 với centOS 7

Tôi đã phải đặt biến env SSL_CERT_DIRđể trỏ đến biến ca-bundleđược đặt tại/etc/ssl/certs/ca-bundle.crt


Câu trả lời của bạn đã đưa tôi đi đúng hướng cho tôi. Trên ubuntu, tôi đã phải thiết lập SSL_CERT_DIRđể /etc/ssl/certs, và cũng chắc chắn rằng các ca-certificatesgói đã được cài đặt và cập nhật.
Norman Breau


1

Thử

cài đặt pip --trusty-host pypi.python.org packagename

Nó làm việc cho tôi.


1

Hãy xem

/ Ứng dụng / Python 3.6 / Cài đặt Chứng chỉ.command

Bạn cũng có thể truy cập Ứng dụng và nhấp vào Chứng chỉ.


1

Trong trường hợp của tôi, tôi đã gặp lỗi này requestsurllib3các phiên bản không tương thích, đưa ra lỗi sau trong khi cài đặt:

ERROR: requests 2.21.0 has requirement urllib3<1.25,>=1.21.1, but you'll have urllib3 1.25 which is incompatible.
pip install 'urllib3<1.25' --force-reinstall

đã lừa


1

Một giải pháp Anaconda khác.Tôi đã nhận được CERTIFICATE_VERIFY_FAILED trong môi trường Python 2.7 của tôi trên macOS. Hóa ra đường dẫn conda rất tệ:

môi trường cơ sở (3.7):

>>> import ssl
>>> ssl.get_default_verify_paths()
DefaultVerifyPaths(cafile='/usr/local/anaconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/ssl/certs')

2.7 môi trường (đường dẫn không tồn tại!):

DefaultVerifyPaths(cafile='', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/anaconda3/envs/py27/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/anaconda3/envs/py27/ssl/certs')

Cách khắc phục:

cd /usr/local/anaconda3/envs/py27/
mkdir ssl
cd ssl
ln -s ../../../ssl/cert.pem

1

Lỗi SSL: CERTIFICATE_VERIFY_FAILED cũng có thể xảy ra do Chứng chỉ trung gian bị thiếu trong ca-certificatesgói trên Linux. Ví dụ, trong trường hợp của tôi, chứng chỉ trung gian " DigiCert SHA2 Secure Server CA " bị thiếu trong ca-certificatesgói mặc dù trình duyệt Firefox có bao gồm nó. Bạn có thể tìm ra chứng chỉ nào bị thiếu bằng cách trực tiếp chạy wgetlệnh trên URL gây ra lỗi này. Sau đó, bạn có thể tìm kiếm liên kết tương ứng đến tệp CRT cho chứng chỉ này từ trang web chính thức (ví dụ: https://www.digicert.com/digicert-root-certert.htmlm trong trường hợp của tôi) của Cơ quan cấp chứng chỉ. Bây giờ, để bao gồm chứng chỉ bị thiếu trong trường hợp của bạn, bạn có thể chạy các lệnh bên dưới bằng liên kết tải xuống tệp CRT của mình:

wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt

mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der

openssl x509 -inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt

sudo mkdir /usr/share/ca-certificates/extra

sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/

sudo dpkg-reconfigure ca-certificates

Sau này, bạn có thể kiểm tra lại với wgetURL của mình cũng như bằng cách sử dụng urllibgói python . Để biết thêm chi tiết, hãy tham khảo: https://bugs.launchpad.net/ubfox/+source/ca-certert/+orms/1795242


0

Nếu trên vCenter 6 của bạn, thay vào đó, bạn nên thêm chứng chỉ ủy quyền chứng chỉ vmware của vCenter vào danh sách CA đáng tin cậy của hệ điều hành của bạn. Để tải chứng chỉ của bạn, hãy làm như sau

  1. Mở trình duyệt Web của bạn.
  2. Điều hướng đến https: //
  3. Ở góc dưới bên phải, nhấp vào liên kết Tải xuống Root Root đáng tin cậy

Trên Fedora

  1. giải nén và thay đổi phần mở rộng từ .0 sang .cer
  2. Sao chép nó vào / etc / pki / ca-trust / source / anchor /
  3. chạy lệnh update-ca-trust.

Liên kết:

  1. https://virtualizationreview.com/articles/2015/04/02/install-root-elf-sign-certert-vcenter-6.aspx?m=1
  2. http://forums.fedoraforum.org/showthread.php?t=293856

Ông nói ông là trên OS X, không vCenter 6.
jww

0

Các bước cài đặt cho nltk (Tôi đã cài đặt python3 (3.6.2) trong MAC OS X

sudo easy_install pip

sử dụng bỏ qua tùy chọn đã cài đặt để bỏ qua việc gỡ cài đặt phiên bản sáu trước đó, nếu không, nó sẽ báo lỗi trong khi gỡ cài đặt và không quay phim về phía trước

sudo pip3 install -U nltk --ignore-installed six

Kiểm tra cài đặt pip và python, sử dụng các phiên bản '3'

which python python2 python3
which pip pip2 pip3

Kiểm tra xem NLTK đã được cài đặt chưa

python3
import nltk
nltk.__path__
['/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/nltk']

Cài đặt chứng chỉ SSL trước khi cài đặt sách ví dụ, nếu không chúng tôi sẽ chứng nhận lỗi trong khi cài đặt các ví dụ

/Applications/Python\ 3.6/Install\ Certificates.command
python3 -m nltk.downloader book

Điều đó đã hoàn thành việc cài đặt thành công nltk và nltk_ata cho các ví dụ về sách


0

Cài đặt PyOpenSSLsử dụng piplàm việc cho tôi (không chuyển đổi sang PEM):

pip install PyOpenSSL

0

Tôi đã giải quyết vấn đề này bằng cách đóng Fiddler (proxy gỡ lỗi HTTP) nếu bạn đã bật proxy và thử lại.


0

Trong python 2.7 thêm chi tiết CA gốc đáng tin cậy ở cuối tệp C: \ Python27 \ lib \ site-gói \ certifi \ cacert.pem đã giúp

sau đó tôi đã chạy (sử dụng quyền quản trị viên) cài đặt pip --trusty-host pypi.python.org --trusty-host pypi.org --trusty-host files.pythonhosted.org packName

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.