Cơ quan cấp chứng chỉ Python

Mô hình Bảo mật tầng vận chuyển (TLS), đôi khi được gọi bằng tên cũ SSL, dựa trên khái niệm về cơ quan cấp chứng chỉ (CA). Các cơ quan này được các trình duyệt và hệ điều hành tin cậy và lần lượt ký các chứng chỉ của máy chủ để xác thực quyền sở hữu của họ

Tuy nhiên, đối với mạng nội bộ, kiến ​​trúc vi dịch vụ hoặc thử nghiệm tích hợp, đôi khi sẽ hữu ích khi có CA cục bộ. một chỉ được tin cậy trong nội bộ và đến lượt nó, ký chứng chỉ của máy chủ cục bộ

Điều này đặc biệt có ý nghĩa đối với các bài kiểm tra tích hợp. Nhận chứng chỉ có thể là một gánh nặng vì máy chủ sẽ hoạt động trong vài phút. Nhưng tùy chọn "bỏ qua chứng chỉ" trong mã có thể cho phép nó được kích hoạt trong sản xuất, dẫn đến thảm họa bảo mật

Chứng chỉ CA không khác nhiều so với chứng chỉ máy chủ thông thường; . Ví dụ: trong thư viện yêu cầu, điều này có thể được thực hiện bằng cách đặt biến REQUESTS_CA_BUNDLE thành thư mục chứa chứng chỉ này

Trong ví dụ tạo chứng chỉ cho các bài kiểm tra tích hợp, không cần chứng chỉ tồn tại lâu dài. nếu các bài kiểm tra tích hợp của bạn mất hơn một ngày, bạn đã thất bại

Vì vậy, hãy tính ngày hôm qua và ngày mai là khoảng thời gian hiệu lực

>>> import datetime
>>> one_day = datetime.timedelta(days=1)
>>> today = datetime.date.today()
>>> yesterday = today - one_day
>>> tomorrow = today - one_day

Bây giờ bạn đã sẵn sàng để tạo một chứng chỉ CA đơn giản. Bạn cần tạo khóa riêng, tạo khóa chung, thiết lập các “tham số” của CA, sau đó tự ký chứng chỉ. chứng chỉ CA luôn tự ký. Cuối cùng, viết ra cả tệp chứng chỉ cũng như tệp khóa riêng

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes, serialization
from cryptography import x509
from cryptography.x509.oid import NameOID

private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.issuer_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.serial_number(x509.random_serial_number())
builder = builder.public_key(public_key)
builder = builder.add_extension(
    x509.BasicConstraints(ca=True, path_length=None),
    critical=True)
certificate = builder.sign(
    private_key=private_key, algorithm=hashes.SHA256(),
    backend=default_backend()
)
private_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
    encoding=serialization.Encoding.PEM)
with open("ca.pem", "wb") as fout:
    fout.write(private_bytes + public_bytes)
with open("ca.crt", "wb") as fout:
    fout.write(public_bytes)

Nói chung, một CA thực sự sẽ mong đợi một yêu cầu ký chứng chỉ (CSR) để ký chứng chỉ. Tuy nhiên, khi bạn là CA của chính mình, bạn có thể đưa ra các quy tắc của riêng mình. Chỉ cần đi trước và ký những gì bạn muốn

Tiếp tục với ví dụ kiểm thử tích hợp, bạn có thể tạo khóa riêng và ký tên vào khóa chung tương ứng ngay sau đó. Lưu ý COMMON_NAME cần phải là "tên máy chủ" trong URL https. Nếu bạn đã định cấu hình tra cứu tên, máy chủ cần thiết sẽ phản hồi dịch vụ. kiểm tra. địa phương

service_private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
service_public_key = service_private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
   x509.NameAttribute(NameOID.COMMON_NAME, 'service.test.local')
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.public_key(public_key)
certificate = builder.sign(
    private_key=private_key, algorithm=hashes.SHA256(),
    backend=default_backend()
)
private_bytes = service_private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
    encoding=serialization.Encoding.PEM)
with open("service.pem", "wb") as fout:
    fout.write(private_bytes + public_bytes)

Bây giờ dịch vụ. tệp pem có khóa riêng và chứng chỉ "hợp lệ". nó đã được ký bởi CA địa phương của bạn. Tệp ở định dạng có thể được cung cấp cho Nginx, HAProxy hoặc hầu hết các máy chủ HTTPS khác

Bằng cách áp dụng logic này để kiểm tra các tập lệnh, thật dễ dàng để tạo các máy chủ trông giống như các máy chủ HTTPS đích thực, miễn là máy khách được định cấu hình để tin cậy đúng CA

Đọc gì tiếp theo

Moshe Zadka

Cơ quan cấp chứng chỉ Python

Moshe đã tham gia vào cộng đồng Linux từ năm 1998, giúp đỡ trong "các bữa tiệc cài đặt" Linux. Anh ấy đã lập trình Python từ năm 1999 và đã đóng góp cho trình thông dịch Python cốt lõi. Moshe đã là một DevOps/SRE kể từ trước khi các điều khoản đó tồn tại, quan tâm sâu sắc đến độ tin cậy của phần mềm, khả năng tái tạo bản dựng và những thứ tương tự khác

Python xử lý chứng chỉ SSL như thế nào?

Yêu cầu xác minh chứng chỉ SSL cho các yêu cầu HTTPS, giống như trình duyệt web . Chứng chỉ SSL là các tệp dữ liệu nhỏ liên kết kỹ thuật số khóa mật mã với thông tin chi tiết của tổ chức. Thông thường, một trang web có chứng chỉ SSL được gọi là trang web an toàn.

Làm cách nào để đặt chứng chỉ SSL trong Python?

Tạo chứng chỉ SSL tự ký bằng Python . Tạo khóa RSA riêng tư. Tạo yêu cầu ký chứng chỉ (CSR) bằng khóa riêng. Ký yêu cầu CSR để tạo chứng chỉ.

Python tìm chứng chỉ CA ở đâ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 .

Cơ quan cấp chứng chỉ lớn nhất là ai?

Hàng hóa . Comodo đã phát hành hơn 100 triệu chứng chỉ, trở thành cơ quan cấp chứng chỉ lớn nhất thế giới.