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
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