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

import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

Nếu URL sử dụng chứng chỉ tự ký, điều này sẽ thất bại với

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Tôi biết rằng tôi có thể chuyển

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
1 cho tham số
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
2, như thế này:

r = requests.post(url, data=data, verify=False)

Tuy nhiên, những gì tôi muốn làm là các yêu cầu chỉ vào một bản sao của khóa công khai trên đĩa và bảo nó tin tưởng chứng chỉ đó.

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

frlan

6.8283 huy hiệu vàng31 Huy hiệu bạc72 Huy hiệu đồng3 gold badges31 silver badges72 bronze badges

Khi được hỏi ngày 22 tháng 5 năm 2015 lúc 21:06May 22, 2015 at 21:06

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

Matthew Moisenmatthew MoisenMatthew Moisen

15.4K26 Huy hiệu vàng111 Huy hiệu bạc216 Huy hiệu đồng26 gold badges111 silver badges216 bronze badges

1

try:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

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

12

Với tham số

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
2, bạn có thể cung cấp gói cơ quan chứng chỉ tùy chỉnh

requests.get(url, verify=path_to_bundle_file)

Từ các tài liệu:

Bạn có thể chuyển

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
2 Đường dẫn đến tệp CA_Bundle với chứng chỉ CAS đáng tin cậy. Danh sách CAS đáng tin cậy này cũng có thể được chỉ định thông qua biến môi trường yêu cầu_ca_bundle.

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

0

Dễ nhất là xuất biến

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
5 chỉ vào cơ quan chứng chỉ riêng của bạn hoặc gói chứng chỉ cụ thể. Trên dòng lệnh, bạn có thể làm điều đó như sau:

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

Nếu bạn có thẩm quyền chứng chỉ của mình và bạn không muốn nhập

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
6 mỗi khi bạn có thể thêm
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
5 vào
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
8 như sau:

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

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

Mike nmike nMike N

5.9353 Huy hiệu vàng23 Huy hiệu bạc21 Huy hiệu đồng3 gold badges23 silver badges21 bronze badges

3

Trường hợp cần giải quyết nhiều chứng chỉ như sau: Concatenate các tệp PEM nhiều gốc, MyCert-A-Root.PEM và MyCert-B-Root.pem, vào một tệp. Sau đó đặt các yêu cầu yêu cầu_ca_bundle var thành tệp đó trong ./.bash_profile của tôi.

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

Đã trả lời ngày 8 tháng 6 năm 2017 lúc 15:55Jun 8, 2017 at 15:55

1

Đặt

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
9 nên thực hiện công việc.

Đã trả lời ngày 21 tháng 9 năm 2017 lúc 7:21Sep 21, 2017 at 7:21

Gizzmolegizzmolegizzmole

1.33916 huy hiệu bạc24 Huy hiệu đồng16 silver badges24 bronze badges

2

Nếu bạn đứng sau tường lửa mạng của công ty như tôi, hãy hỏi quản trị viên mạng của bạn ở đâu chứng chỉ công ty của bạn, sau đó:

import os
os.environ["REQUESTS_CA_BUNDLE"] = 'path/to/corporate/cert.pem'
os.environ["SSL_CERT_FILE"] = 'path/to/corporate/cert.pem'

Các vấn đề cố định này tôi đã gặp phải với các yêu cầu và openSSL.

Đã trả lời ngày 28 tháng 9 năm 2021 lúc 11:11Sep 28, 2021 at 11:11

Jordan Mjordan mJordan M

1532 Huy hiệu bạc6 Huy hiệu Đồng2 silver badges6 bronze badges

Tất cả các câu trả lời cho câu hỏi này đều chỉ ra cùng một đường dẫn: lấy tệp PEM, nhưng họ không cho bạn biết cách lấy nó từ chính trang web.

Nhận tệp PEM từ chính trang web là một tùy chọn hợp lệ nếu bạn tin tưởng trang web, chẳng hạn như trên máy chủ công ty nội bộ. Nếu bạn tin tưởng trang web, tại sao bạn nên làm điều này? Bạn nên làm điều này bởi vì nó giúp bảo vệ bản thân và những người khác khỏi việc vô tình sử dụng lại mã của bạn trên một trang web không an toàn.

Đây là cách bạn có thể nhận được tệp PEM.

  1. Nhấp vào khóa bên cạnh URL.

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

  2. Điều hướng đến nơi bạn có thể xem chứng chỉ và mở chứng chỉ.

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

  3. Tải xuống chuỗi PEM Cert.

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

  4. Đặt tệp .pem ở đâu đó bạn có thể truy cập nó và thử

    r = requests.post(url, data=data, verify=False)
    
    0 trong cuộc gọi
    r = requests.post(url, data=data, verify=False)
    
    1 của bạn.

r = requests.post(url, data=data, verify=False)
2

Đã trả lời ngày 28 tháng 1 lúc 19:17Jan 28 at 19:17

FoggyfoggyFoggy

1731 Huy hiệu bạc10 Huy hiệu đồng1 silver badge10 bronze badges

2

Trong trường hợp bất kỳ ai tình cờ hạ cánh ở đây (như tôi đã làm) đang tìm cách thêm CA (trong trường hợp của tôi Charles Proxy) cho httplib2, có vẻ như bạn có thể nối nó vào tệp

r = requests.post(url, data=data, verify=False)
3 được bao gồm trong gói Python.

Ví dụ:

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

Các biến môi trường được tham chiếu trong các giải pháp khác dường như là yêu cầu cụ thể và không được HTTPLIB2 chọn trong thử nghiệm của tôi.

Đã trả lời ngày 29 tháng 6 năm 2017 lúc 2:39Jun 29, 2017 at 2:39

Mat Schaffermat SchafferMat Schaffer

1.6141 Huy hiệu vàng14 Huy hiệu bạc24 Huy hiệu đồng1 gold badge14 silver badges24 bronze badges

Trong môi trường Dev, sử dụng thơ làm nhà cung cấp env ảo trên máy Mac với Python 3.8 Tôi đã sử dụng câu trả lời này https://stackoverflow.com/a/42982144/15484549 làm cơ sở và thêm nội dung của chứng chỉ gốc tự ký của tôi cho chứng nhận của tôi cho chứng nhận Tệp cacert.pem.

Các bước chi tiết:

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
0

Đã trả lời ngày 4 tháng 2 lúc 15:01Feb 4 at 15:01

AlexalexAlex

1061 Huy hiệu bạc4 Huy hiệu đồng1 silver badge4 bronze badges

Tôi biết đó là một chủ đề cũ. Tuy nhiên, tôi gặp phải vấn đề này gần đây. Mã yêu cầu Python của tôi không chấp nhận chứng chỉ tự ký nhưng Curl cũng vậy. Hóa ra các yêu cầu Python rất nghiêm ngặt về chứng chỉ tự ký. Nó cần phải là một chứng chỉ CA gốc. Nói cách khác,

Những hạn chế cơ bản: CA: Đúng

Việc sử dụng chính: Chữ ký số, không từ chối, mã hóa chính, dấu hiệu chứng chỉ

Đã trả lời ngày 1 tháng 4 lúc 18:50Apr 1 at 18:50

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

YufengyufengYufeng

Huy hiệu Bạc 211 Huy hiệu Đồng1 silver badge1 bronze badge