Làm cách nào để yêu cầu Python tin cậy chứng chỉ SSL tự ký?


82
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 không thành công 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 Falsetới verifytham số, như sau:

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

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


Câu trả lời:


60

thử:

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

1
Bạn có thể làm điều tương tự và sử dụng chứng chỉ ứng dụng khách cùng một lúc không? Tôi đang gặp vấn đề với điều này.
user1156544

9
Lưu ý rằng tệp .pem bạn chuyển phải bao gồm chứng chỉ của máy chủ và bất kỳ chứng chỉ trung gian nào . Tôi đã mất vài giờ cố gắng tìm ra lý do tại sao nó không hoạt động sau khi thêm chứng chỉ của máy chủ.
ChrisBob

Tôi đã thêm certificate.pem tự ký và nó đã hoạt động.
HS Rathore

4
Kỹ thuật này không hiệu quả với tôi. Tôi đã từng ssl.get_server_certificatetải xuống một chứng chỉ cho (self-signed.badssl.com, 443), lưu chứng chỉ đó vào cert.pem, sau đó chạy requests.get('https://self-signed.badssl.com/', verify='cert.pem')và nó vẫn không thành công với lỗi SSL (chứng chỉ đó là chứng chỉ tự ký).
Jason R. Coombs

41

Với verifytham số, bạn có thể cung cấp gói tổ chức phát hành 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 verifyđường dẫn đến tệp CA_BUNDLE với chứng chỉ của các CA đáng tin cậy. Danh sách CA đáng tin cậy này cũng có thể được chỉ định thông qua biến môi trường REQUESTS_CA_BUNDLE.


2
Để làm cho nó rất rõ ràng, đáy biến với cert=(...)CHỈ cho SSL client , TLS aka lẫn nhau. Mặc dù thú vị nhưng nó hiếm hơn nhiều và không thực sự là câu hỏi về cái gì.
Nick T

@ nick-t Cảm ơn bạn đã bình luận. Bạn nói đúng, tôi đã bỏ phần dưới cùng của câu trả lời để bớt dài dòng.
Tiến sĩ Jan-Philip Gehrcke

22

Cách dễ nhất là xuất biến REQUESTS_CA_BUNDLEtrỏ tới tổ chức phát hành chứng chỉ riêng của bạn hoặc một 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ó tổ chức phát hành chứng chỉ của mình và bạn không muốn nhập exportmỗi lần, bạn có thể thêm REQUESTS_CA_BUNDLEvào ~/.bash_profilenhư sau:

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

Biến môi trường là thứ tôi cần để PyCharm hoạt động với các chứng chỉ được lưu trữ trong tệp chứng chỉ OpenSSL.
Brady

Tôi có một chứng chỉ tự ký trong chuỗi. Giải pháp này đã giải quyết vấn đề của tôi với thư viện boto3.
Ilkin

6

Trường hợp cần nhiều chứng chỉ đã được giải quyết như sau: Nối nhiều tệp pem gốc, myCert-A-Root.pem và myCert-B-Root.pem, thành một tệp. Sau đó, đặt yêu cầu REQUESTS_CA_BUNDLE var thành tệp đó trong tệp ./.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

Đó là khoảnh khắc "ahhh" của tôi trong ngày ... Cảm ơn rất nhiều ... Với gợi ý này, tôi đã có chứng chỉ jira tự ký để làm việc ... ;-) Tôi biết có thể có nhiều trang web và câu trả lời mô tả điều này , nhưng tôi đã tìm thấy của bạn, vì vậy bạn nhận được tín dụng của tôi vì đã giúp tôi giải quyết vấn đề của mình ... d
alexrjs 13/03 '19

4

Cài đặt export SSL_CERT_FILE=/path/file.crtsẽ thực hiện công việc.


Cảm ơn. Hoạt động đối với tôi (Trong khi REQUESTS_CA_BUNDLEbiến không có tác dụng trong trường hợp của tôi).
Pascal H.

0

Trong trường hợp bất cứ ai tình cờ hạ cánh ở đây (như tôi đã làm) tìm cách thêm CA (trong trường hợp của tôi là Charles Proxy) cho httplib2, có vẻ như bạn có thể nối nó vào cacerts.txttệp đi kèm với 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 có vẻ là yêu cầu cụ thể và không được chọn bởi httplib2 trong thử nghiệm của tôi.


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.