Python ca là gì

Phân tích sâu hơn về trạng thái bảo trì của django-ca dựa trên nhịp phiên bản PyPI đã phát hành, hoạt động của kho lưu trữ và các điểm dữ liệu khác đã xác định rằng việc bảo trì của nó là Khỏe mạnh

Chúng tôi thấy rằng django-ca thể hiện nhịp phát hành phiên bản tích cực với ít nhất một phiên bản mới được phát hành trong 3 tháng qua

Là một dấu hiệu lành mạnh cho việc bảo trì dự án đang diễn ra, chúng tôi nhận thấy rằng kho lưu trữ GitHub có ít nhất 1 yêu cầu kéo hoặc vấn đề được cộng đồng tương tác

Gần đây, tôi đã làm việc với mô-đun yêu cầu Python để bảo mật lệnh gọi API bằng chứng chỉ của máy chủ

Tôi đã thực sự bế tắc tại một thời điểm và việc tìm hiểu những gì tôi đã làm để khắc phục sự cố đó thật tuyệt vời và đã khiến tôi tạo một bài đăng về tìm hiểu sâu về chứng chỉ SSL

Ảnh của Andrea Piacquadio từ PexelsVấn đề

Tôi đang sử dụng mô-đun yêu cầu và đây là lệnh gọi API

response = requests.post(url, files=files, headers=headers)

và đã nhận được một lỗi

/ (Caused by SSLError(SSLCertVerification(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))
Cố gắng

1. Thực hiện cuộc gọi không an toàn với verify=False

Lần thử đầu tiên của tôi là sử dụng cờ xác minh là

/ (Caused by SSLError(SSLCertVerification(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))
1 và thử

response = requests.post(url, files=files, headers=headers, verify=False)

Mặc dù tôi đạt 200, nhưng tôi đã nhận được một cảnh báo khó chịu xác nhận rằng tôi đang làm một công việc tồi tệ, không cung cấp chứng chỉ. Vì vậy, tôi đã phải tìm đúng cách để làm điều đó

2. Cung cấp chứng chỉ máy chủ

Đầu tiên tôi nghĩ, nếu tôi có thể cung cấp chứng chỉ máy chủ trong khóa xác minh, nó sẽ thực hiện thủ thuật. Tôi cũng vậy,

response = requests.post(url, files=files, headers=headers, verify='server.cer')

Đây là chứng chỉ được mã hóa DER

tôi gặp một lỗi khác

/ (Caused by SSLError(SSLError(136, '[X509] no certificate or crl found (_ssl.c:4232)'))

3. Ghi đè CA_REQUESTS_BUNDLE

Các yêu cầu mô-đun sử dụng certifi để truy cập gói CA và xác thực các kết nối SSL an toàn và chúng tôi có thể sử dụng biến môi trường CA_REQUESTS_BUNDLE để ghi đè vị trí gói CA. Vì vậy, tôi nghĩ, nếu tôi có thể cung cấp máy chủ theo cách thủ công. cer trong biến đó, tôi sẽ đạt được giác ngộ. Nhưng với sự tuyệt vọng của tôi, điều đó cũng thất bại

4. Chuyển đổi sang mã hóa chứng chỉ khác

Sau đó, tôi nghĩ rằng mô-đun yêu cầu không được lấy chứng chỉ được mã hóa DER. Vì vậy, tôi đã chuyển đổi sang PEM là văn bản gốc nhưng được mã hóa Base 64

openssl x509 -in server.cer -inform DER -outform PEM -out server.pem

và gọi lại

response = requests.post(url, files=files, headers=headers, verify='server.pem')

lỗi khác

/ (Caused by SSLError(SSLCertVerification(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))

Vâng, điều này giống như Lỗi 1. Vì vậy, chúng tôi trở lại hình vuông 1. Tôi đã cố gắng tìm kiếm trên internet, nhưng không ai có giải pháp có ý nghĩa. Người nào

Sau đó, tôi nghĩ đây không phải là cách, tôi sẽ giải quyết vấn đề này. Vì vậy, tôi đã nghiên cứu rất nhiều về Chứng chỉ và cuối cùng tôi đã nhận được. Tôi đã viết bài Deep Dive và đặt mọi thứ ở đó

Trở lại vấn đề cơ bản

Vấn đề và tất cả các vấn đề tương tự liên quan đến chứng chỉ (trong bất kỳ ngôn ngữ nào, không chỉ python) trên internet yêu cầu hiểu biết rõ ràng và rõ ràng về chuỗi chứng chỉ. Tôi đã giải thích rất rõ ràng mọi thứ trong bài viết chuyên sâu của mình

Thông thường, chuỗi chứng chỉ bao gồm 3 bên

  1. Cơ quan cấp chứng chỉ gốc
  2. Một hoặc nhiều cơ quan cấp chứng chỉ trung gian
  3. Chứng chỉ máy chủ, yêu cầu chứng chỉ được ký

Việc ủy ​​thác trách nhiệm là

Dấu hiệu CA gốc → CA trung gian

Dấu hiệu CA trung gian → chứng chỉ máy chủ

Chứng chỉ gốc từ Root CA thường có thời hạn sử dụng rất dài (hơn 20 năm) và được đóng gói dưới dạng gói CA trong tất cả các máy tính và máy chủ và được lưu giữ rất an toàn theo các quy tắc nghiêm ngặt để không ai có thể thay đổi chúng trong bất kỳ máy nào

Vì Root CA rất thiêng liêng, chúng cần các CA trung gian ủy thác trách nhiệm ký chứng chỉ máy chủ khi bất kỳ ai yêu cầu bằng cách cung cấp CSR. Các trung gian này được gọi là CA trung gian. Có thể có nhiều CA trung gian trong chuỗi chứng chỉ

Giải pháp

Trong trường hợp của chúng tôi, khi chúng tôi chuyển đổi tệp chứng chỉ sang định dạng PEM, chúng tôi gặp lỗi,

unable to get local issuer certificate (_ssl.c:1108)

Điều đó xảy ra vì 2 lý do

  • Chứng chỉ CA trung gian không có sẵn trong máy chủ. tập tin pem
  • Vì chúng tôi đang chỉ định thủ công tệp chứng chỉ nào sẽ sử dụng bằng cách chỉ định verify=server. pem, mô-đun yêu cầu python sẽ không sử dụng gói CA hiện có, thay vào đó sẽ sử dụng máy chủ. pem và mong đợi điều đó, nó chứa tất cả chứng chỉ trong chuỗi, máy chủ. cer, chứng chỉ trung gian và chứng chỉ gốc

Vì vậy, tôi đã tước chứng chỉ máy chủ theo cách thủ công như thế này

Ví dụ về cách tước tất cả chứng chỉ từ chuỗi chứng chỉ

Điều này được thực hiện trong windows, nhưng những điều tương tự có thể được thực hiện trong Mac hoặc Linux

Sau khi tước tất cả các chứng chỉ từ máy chủ. cer, chúng tôi sẽ có khác nhau. cer cho tất cả các CA. Vì vậy, đối với trường hợp trên, chúng ta sẽ có 4. tập tin cer

  • Gốc CA (Gốc Zeescalar ca)
  • CA trung gian 1(Zscalar CA gốc trung gian)
  • CA trung gian 2 (Zscalar CA gốc trung gian)
  • máy chủ google. tập tin chứng nhận

Bây giờ tất cả những gì chúng ta phải làm là chuyển đổi tất cả những. tập tin cer để. pem và thêm chúng lại với nhau để tạo tệp pem hợp nhất và cung cấp tệp đó cho các yêu cầu python

Vì vậy, đối với tất cả các tệp cer, hãy chạy lệnh sau 4 lần

openssl x509 -in server.cer -inform DER -outform PEM  >> consolidate.pem

Tất cả những gì chúng tôi đang làm ở đây là tạo ra một gói CA chính thức có tất cả các chứng chỉ và dù sao thì chúng tôi cũng có thể làm được.

Thế là xong, chúng tôi cung cấp tệp CA pem mới của mình cho các yêu cầu python và thật vui

/ (Caused by SSLError(SSLCertVerification(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)'))
0

Nếu bạn thích bài viết này, xin vui lòng chia sẻ hoặc bình luận về bài viết. Bất kỳ loại tương tác được đánh giá cao. Nếu bạn muốn hỗ trợ tôi và có quyền truy cập vào tất cả những điều tuyệt vời trong phương tiện, vui lòng tham gia và trở thành thành viên. Đây là liên kết giới thiệu của tôi

Tham gia Medium với liên kết giới thiệu của tôi - Supratim Samanta

Là thành viên Phương tiện, một phần phí thành viên của bạn sẽ được chuyển đến các tác giả mà bạn đã đọc và bạn có toàn quyền truy cập vào mọi câu chuyện…

susamn. trung bình. com

Tăng cấp mã hóa

Cảm ơn vì đã là một phần của cộng đồng của chúng tôi. Tăng cấp đang chuyển đổi tuyển dụng công nghệ. Tìm công việc hoàn hảo của bạn tại các công ty tốt nhất

Chứng chỉ CA trong Python ở đâu?

Theo mặc định, mô-đun ssl của Python sử dụng gói chứng chỉ CA hệ thống - /etc/pki/tls/certs/ca-bundle .

CA trong Web là gì?

Cơ quan cấp chứng chỉ (CA) là thực thể đáng tin cậy cấp chứng chỉ Lớp cổng bảo mật (SSL) . Các chứng chỉ kỹ thuật số này là các tệp dữ liệu được sử dụng để liên kết bằng mật mã một thực thể với khóa chung. Trình duyệt web sử dụng chúng để xác thực nội dung được gửi từ máy chủ web, đảm bảo độ tin cậy đối với nội dung được gửi trực tuyến.

CERTiFi dùng để làm gì?

Certifi cung cấp bộ sưu tập Chứng chỉ gốc được tuyển chọn cẩn thận của Mozilla để xác thực độ tin cậy của chứng chỉ SSL trong khi xác minh danh tính của máy chủ TLS . Nó đã được trích xuất từ ​​dự án Yêu cầu.

Python sử dụng kho chứng chỉ nào?

Thư viện python-certifi-win32 sử dụng kho chứng chỉ Windows để kiểm tra tính hợp lệ của chứng chỉ.