Làm cách nào để thêm chứng chỉ CA Root tùy chỉnh vào CA Store được sử dụng bởi pip trong Windows?


82

Tôi vừa cài đặt Python3 từ python.org và đang gặp sự cố khi cài đặt các gói với pip. Theo thiết kế, có một công cụ kiểm tra gói trung gian trên mạng ở đây để kiểm tra tất cả các gói (bao gồm ssl) bằng cách loại bỏ tất cả các kết nối ssl với chứng chỉ riêng của nó. Một phần của GPO đẩy chứng chỉ gốc tùy chỉnh vào Windows Keystore.

Khi sử dụng Java, nếu tôi cần truy cập vào bất kỳ trang web https bên ngoài nào, tôi cần cập nhật thủ công các cacerts trong JVM để tin cậy chứng chỉ CA tự ký.

Làm cách nào để thực hiện điều đó cho python? Ngay bây giờ, khi tôi cố gắng cài đặt các gói bằng cách sử dụng pip, có thể hiểu được, tôi gặp [SSL: CERTIFICATE_VERIFY_FAILED]lỗi tuyệt vời .

Tôi nhận ra rằng tôi có thể bỏ qua chúng bằng cách sử dụng --trusted-hosttham số, nhưng tôi không muốn làm điều đó cho mọi gói mà tôi đang cố gắng cài đặt.

Có cách nào để cập nhật kho lưu trữ Chứng chỉ CA mà python sử dụng không?


4
@rfkortekaas Tất cả các tùy chọn đó đều liên quan đến việc thêm một cái gì đó mới vào quy trình. Python phải sử dụng kho tin cậy mặc định được lưu trữ ở đâu đó trên hệ thống. Tôi muốn sửa đổi cửa hàng tin cậy đó. Tôi không muốn thêm các biến phụ, các kho lưu trữ ca khác nhau, v.v. Trong java, jvm dựa vào cửa hàng tin cậy của riêng nó (tách biệt với Hệ điều hành). Tôi nghi ngờ rằng python phải đang làm điều gì đó tương tự vì chứng chỉ gốc của tôi nằm trong cửa hàng Windows của tôi và không được python nhận dạng.
Eric B.

Câu trả lời:


94

Tổ chức phát hành chứng chỉ tự ký pip/conda

Sau khi ghi lại toàn bộ vấn đề tương tự với Git ( Làm cách nào để git chấp nhận chứng chỉ tự ký? ), Ở đây chúng ta lại đứng sau tường lửa công ty với proxy cho chúng ta một "cuộc tấn công" MitM mà chúng ta nên tin tưởng và:

KHÔNG BAO GIỜ vô hiệu hóa tất cả xác minh SSL!

Điều này tạo ra một văn hóa bảo mật xấu. Đừng là người đó.

tl; dr

pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify

# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt

Nhưng chúng ta lấy ở ca-bundle.crtđâu?


Nhận Gói CA cập nhật

cURL xuất bản bản trích xuất của Tổ chức phát hành chứng chỉ đi kèm với Mozilla Firefox

https://curl.haxx.se/docs/caextract.html

Tôi khuyên bạn nên mở cacert.pemtệp này trong trình soạn thảo văn bản vì chúng tôi sẽ cần thêm CA tự ký của mình vào tệp này.

Chứng chỉ là một tài liệu tuân thủ X.509 nhưng chúng có thể được mã hóa vào đĩa theo một số cách. Bài viết dưới đây là một bài đọc tốt nhưng phiên bản ngắn là chúng tôi đang xử lý mã hóa base64 thường được gọi là PEM trong phần mở rộng tệp. Bạn sẽ thấy nó có định dạng:

----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


Nhận chứng chỉ tự ký của chúng tôi

Dưới đây là một số tùy chọn về cách nhận chứng chỉ tự ký của chúng tôi:

  • Qua OpenSSL CLI
  • Qua trình duyệt
  • Qua Python Scripting

Nhận chứng chỉ tự ký của chúng tôi bằng OpenSSL CLI

/unix/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

Nhận Tổ chức phát hành chứng chỉ tự ký của chúng tôi thông qua trình duyệt

Nhờ câu trả lời này và blog được liên kết, nó hiển thị các bước (trên Windows) cách xem chứng chỉ và sau đó sao chép vào tệp bằng tùy chọn mã hóa PEM base64.

Sao chép nội dung của tệp đã xuất này và dán vào cuối cacerts.pemtệp của bạn .

Để có tính nhất quán, hãy đổi tên tệp này cacerts.pem-> ca-bundle.crtvà đặt nó ở đâu đó dễ dàng như:

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# or *nix
$HOME/certs/cabundle.crt

Nhận Tổ chức phát hành chứng chỉ tự ký của chúng tôi qua Python

Cảm ơn tất cả các câu trả lời tuyệt vời trong:

Làm cách nào để nhận chứng chỉ SSL phản hồi từ các yêu cầu trong python?

Tôi đã tổng hợp những điều sau đây để cố gắng tiến thêm một bước nữa.

https://github.com/neozenith/get-ca-py


Cuối cùng

Đặt cấu hình trong pip và conda để nó biết nơi cư trú của cửa hàng CA này với CA tự ký bổ sung của chúng tôi.

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

HOẶC LÀ

pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

SAU ĐÓ

pip config list
conda config --show ssl_verify

# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'

Người giới thiệu


5
Một trong những câu trả lời vĩ đại nhất của mọi thời đại
Kevin Pauli

pip cấu hình bộ global.trusted-host XXXXX.com
zzzz zzzz

Trong windows, nó hoạt động với tôi khi sử dụng định dạng .pem cho chứng chỉ.
Daniel Argüelles

1
@ DanielArgüelles vâng đúng vậy. Thông thường, bạn có thể thoát khỏi việc không hợp nhất gói Tổ chức phát hành chứng chỉ nhưng tôi đã có đủ thời gian cần đến gói đầy đủ để pip hoặc conda có thể xác thực chứng chỉ cho các máy chủ khác. Cuối cùng thì một gói vẫn là một tệp văn bản với nội dung của rất nhiều tệp pem. Rất vui vì nó đã hoạt động và bạn không cần phải tắt xác minh! : D
Josh Peak

42

Run: python -c "import ssl; print(ssl.get_default_verify_paths())"để kiểm tra các đường dẫn hiện tại được sử dụng để xác minh chứng chỉ. Thêm chứng chỉ gốc của công ty bạn vào một trong những chứng chỉ đó.

Đường dẫn openssl_capath_envtrỏ tới biến môi trường: SSL_CERT_DIR.

Nếu SSL_CERT_DIRkhông tồn tại, bạn sẽ cần tạo nó và trỏ nó vào một thư mục hợp lệ trong hệ thống tệp của bạn. Sau đó, bạn có thể thêm chứng chỉ của mình vào thư mục này để sử dụng nó.


10
trên hệ thống Windows của tôi, điều này trả về '/ usr / local / ssl / certs' không có sẵn trên Windows.
Colin Talbert

1
Cuối cùng tôi cũng đã làm được điều này sau khi bị kéo vào một dự án khác và tương tự như @ColinTalbert, nó trỏ đến một thư mục không tồn tại /usr/local/ssl/certs.
Eric B.

Tôi đã chỉnh sửa câu hỏi của mình và hy vọng điều này giải quyết được trường hợp.
rfkortekaas

1
@rfkortekaas Cập nhật SSL_CERT_FILE hoặc các biến SSL_CERT_DIR không hoạt động. Tôi vừa tạo một câu hỏi SO mới cho vấn đề này vì nó có thể không chỉ đơn giản là câu hỏi về cách cập nhật tệp PEM, mà là cách để python truy cập đúng đường dẫn trong cygwin / Windows.
Eric B.

1
Tôi đã thử. Tôi đã kết thúc việc tạo tệp pip.conf ~/.config/pip/pip.confvới các cài đặt cần thiết. Hãy xem câu trả lời này .
Eric B.

7

Không phải là câu trả lời hay nhất nhưng bạn có thể sử dụng lại nhóm ca đã được tạo bằng cách sử dụng --certtùy chọn pip, ví dụ:

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"

4

Trên Windows, tôi đã giải quyết nó bằng cách tạo tệp pip.ini trong% APPDATA% \ pip \

ví dụ như C: \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini

Trong pip.ini, tôi đặt đường dẫn đến chứng chỉ của mình:

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

https://pip.pypa.io/en/stable/user_guide/#configuration có thêm thông tin về tệp cấu hình.


Xin chào Alex, bạn đã "đặt" đường dẫn đến chứng chỉ của mình trong tệp pip.ini như thế nào? Từ dòng lệnh? Bạn đã nhập đường dẫn tệp vào một cái gì đó như notepad và lưu nó dưới dạng tệp văn bản? Tôi đang sử dụng dấu nhắc anaconda, nhưng tôi nghĩ rằng nó tương tự như cửa sổ.
spacedustpi 31-07-18

Tôi đã tạo một tệp văn bản bằng Notepad và sau đó thay đổi phần mở rộng tệp từ "txt" thành "ini".
Alex

Ah. Được chứ. Bạn có phải nhập "[gobal]" phía trên đường dẫn không? Bạn có biết nơi tôi có thể tìm một hướng dẫn cho loại điều này không? Cảm ơn.
spacedustpi

Có, bạn cũng cần nhập "[global]". Xin lỗi, tôi không biết bất kỳ hướng dẫn nào nhưng pip.pypa.io/en/stable/user_guide/#configuration có thêm thông tin.
Alex

Cảm ơn, tôi đã thử cả hai cách và vâng, "[toàn cầu]" không hiệu quả.
spacedustpi

2

Giải pháp thay thế trên Windows là cài đặt python-certifi-win32 sẽ cho phép Python sử dụng Windows Certificate Store.

pip install python-certifi-win32

-1

Mở Anaconda Navigator.

Đi tới Tệp \ Tùy chọn.

Bật xác minh SSL Tắt (không được khuyến nghị)

hoặc Bật và chỉ ra đường dẫn chứng chỉ SSL (Tùy chọn)

Cập nhật gói lên phiên bản cụ thể:

Chọn Cài đặt ở trên cùng bên phải

Chọn gói bấm vào đánh dấu

Đánh dấu để cập nhật

Đánh dấu để cài đặt phiên bản cụ thể

Nhấp vào Áp dụng

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.