Hướng dẫn python httpx self signed certificate - python httpx chứng chỉ tự ký

Vấn đề mới

Có một câu hỏi về dự án này? Đăng ký một tài khoản GitHub miễn phí để mở một vấn đề và liên hệ với người bảo trì và cộng đồng của nó. Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Bằng cách nhấp vào Đăng ký đăng ký cho GitHub, bạn đồng ý với Điều khoản dịch vụ và tuyên bố quyền riêng tư của chúng tôi. Chúng tôi thỉnh thoảng gửi cho bạn các email liên quan đến tài khoản.

Đã có trên Github? đăng nhập vào tài khoản của bạn

Nhãn

tài liệu

Thay đổi tài liệu

http/2

Các vấn đề và PR liên quan đến HTTP/2

tls+pki

Các vấn đề và PR liên quan đến TLS và PKI

Bình luận

Hướng dẫn python httpx self signed certificate - python httpx chứng chỉ tự ký

Trong #503, @GVBGDUH đã đề cập đến việc cần phải thực hiện các yêu cầu HTTP/2 cho máy chủ cục bộ. Do việc triển khai hiện tại của chúng tôi (yêu cầu TLS cho HTTP/2, như trình duyệt làm), điều này thường yêu cầu thiết lập chứng chỉ tự ký cục bộ để sử dụng trong các thử nghiệm.

Tôi có lẽ không phải là người nhận thức rõ nhất về cách làm điều này có thể được thực hiện - @sethmlarson có thể có một số gợi ý? Nhưng ít nhất chúng ta có thể thu thập một số tài nguyên về cách thiết lập mọi thứ, và sau đó xem liệu/làm thế nào chúng ta có thể đưa chúng vào tài liệu của chúng ta. Điều này có thể ở dạng một ghi chú được thêm vào ở đây với một liên kết đến hướng dẫn hướng dẫn có liên quan.

Nếu đó là để phát triển cục bộ (đặc biệt là trong bối cảnh thử nghiệm), tôi khuyên bạn nên sử dụng TrustMe để tạo chứng chỉ và sau đó định cấu hình chúng như bất kỳ chứng chỉ nào khác. Điều đó giúp bạn có được kịch bản thực tế nhất là tin tưởng một chứng chỉ CA đã ký chứng chỉ trước đây mà máy chủ đang trình bày. Sẽ không khó để đánh lên một công cụ nhỏ mà chỉ đưa cho bạn chứng chỉ và cho bạn biết phải làm gì với từng công cụ.

(BTW Tôi đang kết hợp một tiện ích nhỏ tạo chứng chỉ trong cấu hình này cho bạn từ dòng lệnh)

Tôi chỉ nhận thấy rằng chúng tôi hiện không có bất kỳ gợi ý sử dụng nào về cách sử dụng tham số cert (chỉ là một định nghĩa về nó trong giao diện nhà phát triển). Đây sẽ là một cơ hội tốt để thiết lập nó?

Có lẽ phần "Chứng chỉ SSL tùy chỉnh" trong các tài liệu nâng cao, cho thấy cách sử dụng chứng chỉ trustme trong httpx

Tôi cũng vừa thử trustme tại địa phương:

# app.py
from starlette.responses import PlainTextResponse

app = PlainTextResponse("Hello, world!")

# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")

# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")

Usage:

  1. $ python create_certs.py
  2. $ uvicorn --ssl-certfile=server.pem app:app
  3. $ python example.py

Tôi đã nhận được điều đó đúng @sethmlarson @gvbgduh chưa?

Trông đúng với tôi, tôi đã tạo ra một kịch bản nhỏ về cơ bản những gì bạn có trong create_certs.py: https://github.com/sethmlarson/trustme-cli

Chúng ta có thể đề cập rằng trong các tài liệu nếu mọi người không sử dụng trustme theo chương trình như với

# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")
1 để tạo CERTS trong bộ thử nghiệm mà thay vào đó là chọc vào hoặc chạy mọi thứ theo cách thủ công.

Hoàn toàn đồng ý rằng chúng ta nên có một phần về điều này vì nó không phải là tầm thường.

TUYỆT VỜI @SETHMLARSON!

Phần nào đó liên quan - chúng tôi có các tham số cert

# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")
3. Theo tôi hiểu,
# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")
3 có thể được sử dụng để nói với HTTPX sử dụng gói CA tùy chỉnh (tức là không phải là Certifi), nhưng sau đó chúng ta sẽ sử dụng loại tình huống nào?

cert là chứng nhận khách hàng. Thật khó hiểu, nhưng đó là API yêu cầu của chúng tôi đang kế thừa.

Về cơ bản

# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")
3 là xác minh máy chủ và cert là để máy chủ thực hiện xác minh máy khách.

Ah. Đó là khó hiểu. Vì vậy, cert sẽ được sử dụng nếu chúng tôi có chứng chỉ riêng và chúng tôi muốn máy chủ tin tưởng chứng chỉ đó khi chúng tôi kết nối với nó?

cert là để xác thực máy khách bởi máy chủ, chứng chỉ cho biết "Tôi là @sethmlarson" và được ký bởi một chứng chỉ mà máy chủ tin tưởng. Vì vậy, nếu bạn đang tương tác với một dịch vụ xác thực thông qua các chứng chỉ TLS thì bạn cần cung cấp tham số cert.

Chúng ta có thể chọn lạc đề từ

# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")
2 ở đó và sử dụng
# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")
3.

Ít nhất chúng ta có thể muốn thêm một số tài liệu ở đó, yup. Tôi đã không chọn rằng đó là cho chứng nhận khách hàng cá nhân và nó chắc chắn rơi vào danh mục "Bạn không cần điều này, trừ khi bạn biết bạn đang làm gì".

Có lẽ nó nằm ngoài vương quốc của những gì các trình duyệt thường sẽ làm, phải không?

.

@SethMlarson

# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")
4 hoạt động như một sự quyến rũ!

Tôi đã mở #510 với một số tài liệu cơ bản dựa trên những gì chúng ta đã thấy cho đến nay:

  • Sử dụng chứng chỉ tùy chỉnh
  • Thực hiện các yêu cầu HTTPS cho Localhost

Rất thích có phản hồi của bạn ở đó. :-)

@FlorimondManca @sethmlarson DOCO và CLI trông thật tuyệt vời! Nó chắc chắn sẽ giải quyết hàng đống sự nhầm lẫn.

Tôi nghĩ rằng có thể hợp lý khi cuối cùng thêm một phần tương tự vào DOCO

# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")
5 và bao gồm nó từ phía máy chủ. Có lẽ với một liên kết chéo đến ví dụ
# example.py
import httpx

# Use CA bundle generated by trustme
r = httpx.get("https://localhost:8000", verify="ca.pem")
6 và một ví dụ cho
# create_certs.py
import trustme


ca = trustme.CA()
cert = ca.issue_cert("localhost")

# For use by clients (eg 'verify' in HTTPX)
ca.cert_pem.write_to_path("ca.pem")

# For use by servers (eg '--ssl-certfile' in Uvicorn)
cert.private_key_and_cert_chain_pem.write_to_path("server.pem")
1. Tôi có thể làm điều đó sau một số thử nghiệm chiến đấu.

Nhãn

tài liệu

Thay đổi tài liệu

http/2

Các vấn đề và PR liên quan đến HTTP/2

tls+pki

Các vấn đề và PR liên quan đến TLS và PKI