Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Tôi đang thực hiện một kịch bản đơn giản liên quan đến kiểm tra bảo mật CAS, JSPRING, chuyển hướng, v.v. Tôi muốn sử dụng các yêu cầu Python của Kenneth Reitz vì đó là một tác phẩm tuyệt vời! Tuy nhiên, CAS yêu cầu được xác thực qua SSL vì vậy tôi phải vượt qua bước đó trước. Tôi không biết những yêu cầu của Python đang muốn gì? Chứng chỉ SSL này phải cư trú ở đâu?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Andrew Brēza

7.1573 Huy hiệu vàng33 Huy hiệu bạc40 Huy hiệu đồng3 gold badges33 silver badges40 bronze badges

Hỏi ngày 19 tháng 5 năm 2012 lúc 18:45May 19, 2012 at 18:45

4

Vấn đề bạn đang gặp phải là do chứng chỉ SSL không đáng tin cậy.

Giống như @Dirk được đề cập trong một bình luận trước, bản sửa lỗi nhanh nhất là cài đặt

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4:

requests.get('https://example.com', verify=False)

Xin lưu ý rằng điều này sẽ khiến chứng chỉ không được xác minh. Điều này sẽ đưa ứng dụng của bạn vào các rủi ro bảo mật, chẳng hạn như các cuộc tấn công giữa các trung gian.This will expose your application to security risks, such as man-in-the-middle attacks.

Tất nhiên, áp dụng phán đoán. Như đã đề cập trong các ý kiến, điều này có thể được chấp nhận đối với các ứng dụng/tập lệnh nhanh chóng/vứt bỏ, nhưng thực sự không nên chuyển sang phần mềm sản xuất.

Nếu chỉ bỏ qua kiểm tra chứng chỉ là không thể chấp nhận được trong bối cảnh cụ thể của bạn, hãy xem xét các tùy chọn sau, tùy chọn tốt nhất của bạn là đặt tham số

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
5 thành một chuỗi là đường dẫn của tệp
cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
6 của chứng chỉ (mà bạn nên lấy theo một loại nào đó có phương tiện an toàn).

Vì vậy, kể từ phiên bản 2.0, tham số

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
5 chấp nhận các giá trị sau, với ngữ nghĩa tương ứng của chúng:

  • cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
    r = requests.get(url, verify=cafile)
    
    8: khiến chứng chỉ được xác thực đối với cơ quan chứng chỉ đáng tin cậy của thư viện (Lưu ý: Bạn có thể thấy những yêu cầu chứng chỉ gốc nào sử dụng thông qua Thư viện Certifi, cơ sở dữ liệu tin cậy của RCS được trích xuất từ ​​các yêu cầu: Certifi - cơ sở dữ liệu tin cậy cho con người).
  • cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
    r = requests.get(url, verify=cafile)
    
    9: Bỏ qua xác thực chứng chỉ hoàn toàn.
  • Đường dẫn đến tệp CA_Bundle cho các yêu cầu sử dụng để xác thực các chứng chỉ.

Nguồn: Yêu cầu - Xác minh chứng nhận SSL

Ngoài ra, hãy xem tham số

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
0 trên cùng một liên kết.

Đã trả lời ngày 12 tháng 10 năm 2012 lúc 18:19Oct 12, 2012 at 18:19

Rafael Almeidarafael AlmeidaRafael Almeida

9,9646 Huy hiệu vàng43 Huy hiệu bạc60 Huy hiệu Đồng6 gold badges43 silver badges60 bronze badges

15

Từ tài liệu yêu cầu về xác minh SSL:

Yêu cầu có thể xác minh chứng chỉ SSL cho các yêu cầu HTTPS, giống như trình duyệt web. Để kiểm tra chứng chỉ SSL của máy chủ, bạn có thể sử dụng đối số xác minh:

>>> requests.get('https://kennethreitz.com', verify=True)

Nếu bạn không muốn xác minh chứng chỉ SSL của mình, hãy tạo

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4

Ostergaard

3.2512 Huy hiệu vàng28 Huy hiệu bạc39 Huy hiệu đồng2 gold badges28 silver badges39 bronze badges

Đã trả lời ngày 19 tháng 5 năm 2012 lúc 19:20May 19, 2012 at 19:20

ZeugmazeugmaZeugma

30.1k8 Huy hiệu vàng64 Huy hiệu bạc78 Huy hiệu đồng8 gold badges64 silver badges78 bronze badges

8

Tên của tệp CA để sử dụng bạn có thể vượt qua

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
5:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

Nếu bạn sử dụng

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
3 thì
from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
4 sử dụng bộ CA của riêng mình có thể không có CA đã ký chứng chỉ máy chủ của bạn.

Đã trả lời ngày 12 tháng 10 năm 2012 lúc 18:38Oct 12, 2012 at 18:38

JFSJFSjfs

385K183 Huy hiệu vàng950 Huy hiệu bạc1626 Huy hiệu Đồng183 gold badges950 silver badges1626 bronze badges

9

Tôi đã gặp phải vấn đề tương tự và chứng chỉ SSL xác minh sự cố không thành công khi sử dụng AWS BOTO3, bằng cách xem xét mã BOTO3, tôi thấy

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
5 không được đặt, vì vậy tôi đã sửa lỗi cả bằng cách đặt nó theo cách thủ công:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

Đối với AWS-CLI, tôi đoán cài đặt Yêu cầu_ca_bundle trong

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
6 sẽ khắc phục sự cố này (không được kiểm tra vì AWS-CLI của tôi hoạt động mà không có nó).

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Rodorgas

8902 Huy hiệu vàng11 Huy hiệu bạc29 Huy hiệu đồng2 gold badges11 silver badges29 bronze badges

Đã trả lời ngày 15 tháng 11 năm 2015 lúc 7:47Nov 15, 2015 at 7:47

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

YongyongYong

6115 Huy hiệu bạc3 Huy hiệu đồng5 silver badges3 bronze badges

4

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
7

  • Đã thử nghiệm trên Python 2.7.6 @ Ubuntu 14.04.4 LTS
  • Đã thử nghiệm trên Python 2.7.5 @ macosx 10.9.5 (Mavericks)

Khi câu hỏi này được mở (2012-05), phiên bản yêu cầu là 0,13,1. Trên phiên bản 2.4.1 (2014-09) Các tính năng bổ sung "bảo mật" đã được giới thiệu, sử dụng gói

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
8 nếu có.

Ngay bây giờ (2016-09) Phiên bản chính là 2.11.1, hoạt động tốt mà không cần

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4. Không cần sử dụng
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
0, nếu được cài đặt với các tính năng bổ sung
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
1.without
cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4. No need to use
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
0, if installed with
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
1 extras.

Đã trả lời ngày 19 tháng 9 năm 2016 lúc 18:57Sep 19, 2016 at 18:57

Alanjdsalanjdsalanjds

3,8042 Huy hiệu vàng33 Huy hiệu bạc43 Huy hiệu đồng2 gold badges33 silver badges43 bronze badges

6

Trong trường hợp bạn có một thư viện dựa trên

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')
4 và bạn không thể sửa đổi đường dẫn xác minh (như với
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
3) thì bạn sẽ phải tìm
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
4 đi kèm với các yêu cầu và nối CA của bạn ở đó. Đây là cách tiếp cận chung để tìm vị trí
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
4:

các cửa sổ

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem

Linux

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem

BTW. @Yêu cầu-Devs, đóng gói cacert của riêng bạn với yêu cầu thực sự, thực sự khó chịu ... đặc biệt là bạn dường như không sử dụng cửa hàng CA System CA trước và điều này không được ghi nhận ở bất cứ đâu.

cập nhật

Trong các tình huống, nơi bạn đang sử dụng thư viện và không có quyền kiểm soát vị trí CA-Bundle, bạn cũng có thể đặt rõ ràng vị trí CA-Bundle để trở thành CA-Bundle trên toàn bộ máy chủ của bạn:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com')";

ibre5041

4.5931 Huy hiệu vàng17 Huy hiệu bạc33 Huy hiệu đồng1 gold badge17 silver badges33 bronze badges

Đã trả lời ngày 4 tháng 3 năm 2016 lúc 8:38Mar 4, 2016 at 8:38

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Tintintintintintin

3.05630 huy hiệu bạc34 Huy hiệu đồng30 silver badges34 bronze badges

3

Như người khác chỉ ra, vấn đề này "là do chứng chỉ SSL không đáng tin cậy". Câu trả lời của tôi dựa trên câu trả lời được xếp hạng hàng đầu và câu trả lời này.

Bạn có thể kiểm tra chứng chỉ bằng

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
6:

curl -vvI https://example.com

Nếu một lỗi trả về, bạn có 3 tùy chọn:

  1. Để khắc phục nhanh, bạn không thể xác minh chứng chỉ:
requests.get('https://example.com', verify=False)
  1. Chuyển đường dẫn đến tệp hoặc thư mục CA_Bundle có chứng chỉ CAS đáng tin cậy:
requests.get('https://example.com', verify=False)
1
  1. Nếu bạn có quyền truy cập, hãy khắc phục chứng chỉ máy chủ web.

Vấn đề của tôi là vì tôi chỉ sử dụng chứng chỉ trang web của mình chứ không phải chứng chỉ trung gian (chuỗi a.k.a.).

Nếu bạn đang sử dụng Let's Encrypt, bạn nên sử dụng tệp

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
7 chứ không phải
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
8.

Đã trả lời ngày 20 tháng 11 năm 2020 lúc 15:09Nov 20, 2020 at 15:09

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

1

Nếu bạn muốn xóa các cảnh báo, hãy sử dụng mã bên dưới.

requests.get('https://example.com', verify=False)
2

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4 với phương pháp
C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
0 hoặc
C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
1

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Đã trả lời ngày 3 tháng 11 năm 2015 lúc 7:42Nov 3, 2015 at 7:42

AniketgoleaniketgoleAniketGole

7301 huy hiệu vàng9 Huy hiệu bạc22 Huy hiệu đồng1 gold badge9 silver badges22 bronze badges

0

Tôi phải đối mặt với cùng một vấn đề bằng cách sử dụng GSPREAD và các lệnh này hoạt động với tôi:

requests.get('https://example.com', verify=False)
3

Đã trả lời ngày 16 tháng 2 năm 2016 lúc 4:53Feb 16, 2016 at 4:53

user941581user941581user941581

3492 Huy hiệu bạc4 Huy hiệu đồng2 silver badges4 bronze badges

3

Tôi đã tìm thấy một cách tiếp cận cụ thể để giải quyết một vấn đề tương tự. Ý tưởng là trỏ tệp cacert được lưu trữ tại hệ thống và được sử dụng bởi các ứng dụng dựa trên SSL khác.

Trong Debian (Tôi không chắc chắn nếu giống nhau trong các phân phối khác) Các tệp chứng chỉ (.pem) được lưu trữ tại

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
2 Vì vậy, đây là mã hoạt động cho tôi:

requests.get('https://example.com', verify=False)
4

Để đoán xem tệp

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
3 chọn gì, tôi đã duyệt đến URL và kiểm tra cơ quan chứng chỉ (CA) nào đã tạo chứng chỉ.

Chỉnh sửa: Nếu bạn không thể chỉnh sửa mã (vì bạn đang chạy ứng dụng thứ ba), bạn có thể thử thêm chứng chỉ

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
3 trực tiếp vào
C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
5 (ví dụ: sao chép nó vào cuối tệp).

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Nsnoob

5.4886 Huy hiệu vàng41 Huy hiệu bạc53 Huy hiệu Đồng6 gold badges41 silver badges53 bronze badges

Đã trả lời ngày 18 tháng 4 năm 2013 lúc 14:29Apr 18, 2013 at 14:29

Slamoraslamoraslamora

66510 Huy hiệu bạc15 Huy hiệu Đồng10 silver badges15 bronze badges

2

Nếu bạn không bận tâm về chứng chỉ, chỉ cần sử dụng

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4.

requests.get('https://example.com', verify=False)
5

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Đã trả lời ngày 21 tháng 5 năm 2015 lúc 12:01May 21, 2015 at 12:01

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Sau nhiều giờ gỡ lỗi, tôi chỉ có thể khiến nó hoạt động bằng cách sử dụng các gói sau:

requests.get('https://example.com', verify=False)
6

Sử dụng

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem
7

Không có các gói này

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
4 không hoạt động.

Tôi hi vọng điêu nay se giup được ai đo.

Đã trả lời ngày 20 tháng 7 năm 2017 lúc 20:10Jul 20, 2017 at 20:10

Michaelmichaelmichael

5727 Huy hiệu bạc11 Huy hiệu đồng7 silver badges11 bronze badges

Tôi đã gặp phải vấn đề tương tự. Hóa ra tôi đã không cài đặt chứng chỉ trung gian trên máy chủ của mình (chỉ cần nối nó vào cuối chứng chỉ của bạn như được thấy bên dưới).

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

Đảm bảo bạn đã cài đặt gói CA chứng nhận CA:

requests.get('https://example.com', verify=False)
7

Cập nhật thời gian cũng có thể giải quyết điều này:

requests.get('https://example.com', verify=False)
8

Nếu bạn đang sử dụng chứng chỉ tự ký, có lẽ bạn sẽ phải thêm nó vào hệ thống của mình theo cách thủ công.

Đã trả lời ngày 13 tháng 6 năm 2014 lúc 19:19Jun 13, 2014 at 19:19

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

2

Nếu các cuộc gọi yêu cầu được chôn ở đâu đó sâu trong mã và bạn không muốn cài đặt chứng chỉ máy chủ, thì chỉ cho mục đích gỡ lỗi, có thể các yêu cầu của MonkeyPatch:debug purposes only, it's possible to monkeypatch requests:

requests.get('https://example.com', verify=False)
9

Không bao giờ sử dụng trong sản xuất!

Đã trả lời ngày 29 tháng 8 năm 2017 lúc 6:06Aug 29, 2017 at 6:06

xmedekoxmedekoxmedeko

6,8256 Huy hiệu vàng 50 Huy hiệu bạc82 Huy hiệu Đồng6 gold badges50 silver badges82 bronze badges

Quá muộn cho bữa tiệc tôi đoán nhưng tôi muốn dán bản sửa lỗi cho những kẻ lang thang như tôi! Vì vậy, những điều sau đây đã làm việc cho tôi trên Python 3.7.x

Nhập những thứ sau trong thiết bị đầu cuối của bạn

>>> requests.get('https://kennethreitz.com', verify=True)
0

Hãy thử chạy lại tập lệnh/yêu cầu của bạn và xem nó có hoạt động không (tôi chắc chắn nó sẽ không được sửa!). Nếu nó không hoạt động thì hãy thử chạy lệnh sau trong thiết bị đầu cuối trực tiếp

>>> requests.get('https://kennethreitz.com', verify=True)
1

Đã trả lời ngày 29 tháng 11 năm 2018 lúc 11:32Nov 29, 2018 at 11:32

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

d-coderd-coderd-coder

11.6K4 Huy hiệu vàng25 Huy hiệu bạc35 Huy hiệu Đồng4 gold badges25 silver badges35 bronze badges

Điều này tương tự như câu trả lời của @Rafael-Almeida, nhưng tôi muốn chỉ ra rằng theo yêu cầu 2.11+, không có 3 giá trị mà

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
5 có thể thực hiện, thực sự có 4:

  • cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
    r = requests.get(url, verify=cafile)
    
    8: Xác thực chống lại CAS đáng tin cậy nội bộ của các yêu cầu.
  • cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
    r = requests.get(url, verify=cafile)
    
    9: Bỏ qua xác thực chứng chỉ hoàn toàn. (Không được khuyến khích)
  • Đường dẫn đến một tập tin CA_Bundle. Yêu cầu sẽ sử dụng điều này để xác thực chứng chỉ của máy chủ.
  • Đường dẫn đến một thư mục chứa các tệp chứng chỉ công cộng. Yêu cầu sẽ sử dụng điều này để xác thực chứng chỉ của máy chủ.

Phần còn lại của câu trả lời của tôi là khoảng 4, cách sử dụng thư mục chứa chứng chỉ để xác nhận:

Có được các chứng chỉ công cộng cần thiết và đặt chúng vào một thư mục.

Nói đúng ra, bạn có thể "nên" sử dụng một phương thức ngoài băng tần để có được chứng chỉ, nhưng bạn cũng có thể tải chúng bằng cách sử dụng bất kỳ trình duyệt nào.

Nếu máy chủ sử dụng chuỗi chứng chỉ, hãy chắc chắn để có được mỗi chứng chỉ trong chuỗi.

Theo tài liệu yêu cầu, thư mục có chứa chứng chỉ trước tiên phải được xử lý với tiện ích "Rehash" (

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
2).

. Master/Sample/c_rehash.rb, mặc dù tôi chưa thử điều này.)

Tôi đã gặp một số rắc rối với việc nhận được các yêu cầu để nhận biết chứng chỉ của mình, nhưng sau khi tôi sử dụng lệnh

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
4 để chuyển đổi CERTS thành định dạng Base64
cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
6, mọi thứ đều hoạt động hoàn hảo.

Bạn cũng có thể chỉ làm Lazy Rehashing:

>>> requests.get('https://kennethreitz.com', verify=True)
2

Đã trả lời ngày 10 tháng 10 năm 2019 lúc 20:44Oct 10, 2019 at 20:44

CowlinatorCowLinatorcowlinator

6.2496 Huy hiệu vàng39 Huy hiệu bạc55 Huy hiệu Đồng6 gold badges39 silver badges55 bronze badges

Tôi đã chiến đấu với vấn đề này trong nhiều giờ.

Tôi đã cố gắng cập nhật các yêu cầu. Sau đó, tôi đã cập nhật Certifi. Tôi đã chỉ xác minh đến certifi.where () (mã thực hiện điều này theo mặc định dù sao). Không có gì làm việc.

Cuối cùng tôi đã cập nhật phiên bản Python lên Python 2.7.11 của mình. Tôi đã ở trên Python 2.7.5 có một số không tương thích với cách xác minh chứng chỉ. Khi tôi cập nhật Python (và một số ít phụ thuộc khác), nó bắt đầu hoạt động.

Đã trả lời ngày 6 tháng 5 năm 2016 lúc 21:13May 6, 2016 at 21:13

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Ajonajonajon

7,64011 Huy hiệu vàng47 Huy hiệu bạc85 Huy hiệu Đồng11 gold badges47 silver badges85 bronze badges

2

Một số máy chủ không có chứng nhận gốc đáng tin cậy cho LetSenCrypt.

Ví dụ: giả sử máy chủ được chỉ bởi URL bên dưới được bảo vệ bởi SSL LetSenCrypt.

>>> requests.get('https://kennethreitz.com', verify=True)
3

Yêu cầu này có thể thất bại với [ssl: cerpilate_verify_failed] vì máy chủ yêu cầu không có chứng nhận gốc cho LetSenCrypt.

Khi điều này xảy ra, hãy tải xuống chứng nhận 'PEM' tự ký hoạt động từ liên kết bên dưới.

https://letsencrypt.org/certicates/. (Active ISRG Root X1 Khi viết bài này)Active ISRG Root X1 as of this writing)

Bây giờ, sử dụng nó trong tham số xác minh như sau.

>>> requests.get('https://kennethreitz.com', verify=True)
4

Đã trả lời ngày 20 tháng 10 năm 2021 lúc 20:09Oct 20, 2021 at 20:09

Hiện tại có một vấn đề trong mô -đun yêu cầu gây ra lỗi này, có trong v2.6.2 đến v2.12.4 (atow): https://github.com/kennethreitz/requests/issues/2573

Giải pháp cho vấn đề này là thêm dòng sau:

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem
6

Đã trả lời ngày 15 tháng 1 năm 2017 lúc 20:10Jan 15, 2017 at 20:10

PeterpeterPeter

1.24211 huy hiệu bạc11 huy hiệu đồng11 silver badges11 bronze badges

1

Như đã đề cập bởi @rafael Almeida, vấn đề bạn đang gặp phải là do chứng chỉ SSL không đáng tin cậy. Trong trường hợp của tôi, chứng chỉ SSL không được máy chủ của tôi không tin tưởng. Để khắc phục điều này mà không ảnh hưởng đến bảo mật, tôi đã tải xuống chứng chỉ và cài đặt nó trên máy chủ (chỉ bằng cách nhấp đúp vào tệp .CRT và sau đó cài đặt chứng chỉ ...).

Đã trả lời ngày 14 tháng 6 năm 2017 lúc 11:07Jun 14, 2017 at 11:07

MichaelmichaelMichael

Huy hiệu đồng bạc 19911 silver badge9 bronze badges

Trong trường hợp của tôi, lý do khá tầm thường.

Tôi đã biết rằng việc xác minh SSL đã hoạt động cho đến một vài ngày trước đó, và đang hoạt động trên một máy khác.

Bước tiếp theo của tôi là so sánh nội dung và kích thước chứng chỉ giữa máy mà xác minh đang hoạt động và cái mà nó không phải là.

Điều này nhanh chóng dẫn đến việc tôi xác định rằng chứng chỉ trên máy làm việc 'không chính xác' không tốt và một khi tôi đã thay thế nó bằng chứng chỉ 'tốt', mọi thứ đều ổn.

Đã trả lời ngày 30 tháng 4 năm 2019 lúc 11:59Apr 30, 2019 at 11:59

1

Tôi nghĩ rằng bạn có một số cách để khắc phục vấn đề này. Tôi đã đề cập đến 5 cách dưới đây:

  1. Bạn có thể xác định bối cảnh cho từng yêu cầu và vượt qua bối cảnh trên mỗi yêu cầu sử dụng nó như bên dưới:
>>> requests.get('https://kennethreitz.com', verify=True)
5
  1. Hoặc đặt tệp chứng chỉ trong
    #  (py2.7.5,requests 2.7.0, verify not enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/lib/python2.7/dist-packages/certifi/cacert.pem
    
    #  (py2.7.10, verify enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/local/lib/python2.7/dist-packages/requests/cacert.pem
    
    7.
>>> requests.get('https://kennethreitz.com', verify=True)
6
  1. Hoặc thay thế phương thức
    #  (py2.7.5,requests 2.7.0, verify not enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/lib/python2.7/dist-packages/certifi/cacert.pem
    
    #  (py2.7.10, verify enforced)
    root@host:~/# python -c "import requests; print requests.certs.where()"
    /usr/local/lib/python2.7/dist-packages/requests/cacert.pem
    
    8:
>>> requests.get('https://kennethreitz.com', verify=True)
7
  1. Hoặc nếu bạn sử dụng máy Linux, 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ó.Linux machine, generating fresh certificates and exporting an environment variable pointing to the certificates directory fixed it.
>>> requests.get('https://kennethreitz.com', verify=True)
8
  1. Hoặc nếu bạn sử dụng máy Mac, tạo chứng chỉ mớiMac machine, generating fresh certificates
>>> requests.get('https://kennethreitz.com', verify=True)
9

Đã trả lời ngày 7 tháng 8 lúc 19:07Aug 7 at 19:07

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Ali Zahedigolali ZahedigolAli ZahediGol

6082 Huy hiệu vàng8 Huy hiệu bạc18 Huy hiệu đồng2 gold badges8 silver badges18 bronze badges

1

Không khả thi để thêm các tùy chọn nếu các yêu cầu được gọi từ một gói khác. Trong trường hợp đó, việc thêm chứng chỉ vào gói cacert là đường thẳng, ví dụ: Tôi đã phải thêm "Máy chủ trung gian chính của StartCom Class 1", trong đó tôi đã tải xuống chứng chỉ gốc vào StartComClass1.pem. Cho VirtualEnv của tôi có tên là Caldav, tôi đã thêm chứng chỉ với:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
0

một trong số đó có thể là đủ, tôi đã không kiểm tra

Đã trả lời ngày 3 tháng 8 năm 2015 lúc 17:29Aug 3, 2015 at 17:29

Rhoerberhoerberhoerbe

4531 Huy hiệu vàng4 Huy hiệu bạc17 Huy hiệu đồng1 gold badge4 silver badges17 bronze badges

Tôi đã có một vấn đề xác nhận chứng nhận tương tự hoặc tương tự. Tôi đọc rằng các phiên bản OpenSSL nhỏ hơn 1.0.2, yêu cầu phụ thuộc vào đôi khi gặp khó khăn trong việc xác nhận chứng chỉ mạnh (xem tại đây). Centos 7 dường như sử dụng 1.0.1E dường như có vấn đề.

Tôi không chắc chắn làm thế nào để giải quyết vấn đề này trên Centos, vì vậy tôi quyết định cho phép chứng chỉ CA 1024bit yếu hơn.

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
1

Đã trả lời ngày 11 tháng 7 năm 2017 lúc 13:26Jul 11, 2017 at 13:26

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

1

Tôi đã phải nâng cấp từ Python 3.4.0 lên 3.4.6

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
2

Đã trả lời ngày 7 tháng 3 năm 2018 lúc 23:22Mar 7, 2018 at 23:22

PaulpaulPaul

2.3492 Huy hiệu vàng24 Huy hiệu bạc29 Huy hiệu đồng2 gold badges24 silver badges29 bronze badges

Tôi đã tìm thấy câu trả lời này đã sửa nó:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
3

Tôi không biết nó làm gì, mặc dù.

Đã trả lời ngày 2 tháng 10 năm 2021 lúc 6:41Oct 2, 2021 at 6:41

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Urban P.urban P.Urban P.

1291 Huy hiệu bạc9 Huy hiệu đồng1 silver badge9 bronze badges

Khi nó nói

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)
5 lấy 'đường dẫn đến chứng chỉ', tôi đã chỉ nó vào chứng chỉ của tổ chức phát hành để nó có thể sử dụng nó để xác minh chứng chỉ URL.
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
6 và
REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com')";
1 vẫn ổn với chứng chỉ đó. Nhưng không phải là yêu cầu Python.

Tôi đã phải tạo một chuỗi chứng chỉ với tất cả các chứng chỉ từ cuối (lá?) Để root cho các yêu cầu Python để xử lý nó tốt.Và chuỗi hoạt động tốt với Curl và Wget quá tự nhiên.

Hy vọng nó sẽ giúp ai đó và tiết kiệm vài giờ.

Đã trả lời ngày 27 tháng 10 lúc 11:54Oct 27 at 11:54

Đây chỉ là một cách khác bạn có thể cố gắng giải quyết vấn đề.

Nếu bạn đặt "www.example.com", hãy yêu cầu bạn hét lên với bạn.Nếu bạn đặt "https://www.example.com", bạn sẽ gặp lỗi này.Vì vậy, nếu bạn không cần HTTPS, bạn có thể tránh được lỗi bằng cách thay đổi "https" thành "http".ví dụ."http://www.example.com"

Cảnh báo: Không sử dụng HTTPS thường không phải là một ý tưởng tốt.Xem tại sao HTTPS cho mọi thứ?Tại sao HTTPS lại quan trọng. See Why HTTPS for Everything? Why HTTPS matters

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Đã trả lời ngày 2 tháng 9 năm 2020 lúc 8:09Sep 2, 2020 at 8:09

Hướng dẫn python requests x509 certificate - python yêu cầu chứng chỉ x509

Mặc định mặc địnhDefault

6349 Huy hiệu bạc17 Huy hiệu đồng9 silver badges17 bronze badges