Kỹ thuật phân tích chứng chỉ X.509 sử dụng thư viện Cryptography trong Python

Thư viện cryptography là một giải pháp mã hóa toàn diện cho Python, được xây dựng dựa trên nền tảng OpenSSL. Nó cung cấp các hàm API mạnh mẽ để xử lý các chứng chỉ X.509, quản lý cặp khóa bí mật và công khai, cũng như thực hiện các tác vụ bảo mật như ký số, xác thực chữ ký, mã hóa và giải mã dữ liệu.

Để sử dụng, bạn cần cài đặt gói thư viện này qua pip:

pip install cryptography

Đoạn mã dưới đây minh họa quy trình nạp một chuỗi chứng chỉ định dạng PEM, giải thích các trường dữ liệu bên trong và trích xuất các thông tin quan trọng như thời hạn hiệu lực, thông tin chủ thể, người cấp phát, và các phần mở rộng tùy chỉnh.

from cryptography import x509
from cryptography.hazmat.primitives import serialization
from cryptography.x509.oid import NameOID, ExtensionOID

# Chuỗi dữ liệu chứng chỉ mẫu (PEM format)
pem_content = b"""-----BEGIN CERTIFICATE-----
MIICmzCCAkCgAwIBAgIDBPBxMAoGCCqGSM49BAMCMHsxCzAJBgNVBAYTAmNuMRAw
DgYDVQQIEwdiZWlqaW5nMRAwDgYDVQQHEwdiZWlqaW5nMRMwEQYDVQQKEwpUZXN0
Q01vcmcxMRIwEAYDVQQLEwlyb290LWNlcnQxHzAdBgNVBAMMFmNhLuekuuS+i+a1
i+ivlee7hOe7hzEwHhcNMjMwMTEzMTAzMzE3WhcNMzIwMTExMTAzMzE3WjCBhDEL
MAkGA1UEBhMCY24xEDAOBgNVBAgTB2JlaWppbmcxEDAOBgNVBAcTB2JlaWppbmcx
EzARBgNVBAoTClRlc3RDTW9yZzExDjAMBgNVBAsTBWFkbWluMSwwKgYDVQQDDCPn
pLrkvovmtYvor5XnlKjmiLcxLnNpZ24uVGVzdENNb3JnMTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABOgUND6Hi/Sk5NxWZSYYrm4+CuwMzKEdG2pbySdkFqv8KXPO
6HcrmJqs63YJ9RVX2y4kGDwz0d0w+Pic5vIWOsujgagwgaUwDgYDVR0PAQH/BAQD
AgGmMA8GA1UdJQQIMAYGBFUdJQAwKQYDVR0OBCIEIFM1ET3HKfgbcQscGNWPIFZI
bej+SY6sCuhWtCHoSj32MCsGA1UdIwQkMCKAIK/AH4T9T1bZonOO7+tzl1eLDO24
8wX1TQdeLBVOM0l/MCoGA1UdEQQjMCGCCWxvY2FsaG9zdIIOY2hhaW5tYWtlci5v
cmeHBH8AAAEwCgYIKoZIzj0EAwIDSQAwRgIhAMl0MreFSbM5XfMUhPTbhYYPtyTC
TtQafx96xeykAHlaAiEA/6gveqPsooMn4lNPptsxwPtHxtF/BFNU1BWqyXKDS3w=
-----END CERTIFICATE-----
"""

def parse_certificate_details(data):
    try:
        # Nạp chứng chỉ từ định dạng PEM
        credential = x509.load_pem_x509_certificate(data)

        # 1. Kiểm tra thời hạn hiệu lực
        print(f"Thời gian bắt đầu hiệu lực: {credential.not_valid_before}")
        print(f"Thời gian hết hạn: {credential.not_valid_after}")

        # 2. Thông tin chủ thể (Subject)
        subject_entity = credential.subject
        cn = subject_entity.get_attributes_for_oid(NameOID.COMMON_NAME)[0].value
        org = subject_entity.get_attributes_for_oid(NameOID.ORGANIZATION_NAME)[0].value
        country = subject_entity.get_attributes_for_oid(NameOID.COUNTRY_NAME)[0].value
        locality = subject_entity.get_attributes_for_oid(NameOID.LOCALITY_NAME)[0].value
        ou = subject_entity.get_attributes_for_oid(NameOID.ORGANIZATIONAL_UNIT_NAME)[0].value
        print(f"Chủ thể - Tên chung (CN): {cn}")
        print(f"Chủ thể - Tổ chức (O): {org}")
        print(f"Chủ thể - Quốc gia (C): {country}")
        print(f"Chủ thể - Khu vực (L): {locality}")
        print(f"Chủ thể - Đơn vị (OU): {ou}")

        # 3. Thông tin người cấp (Issuer)
        issuer_entity = credential.issuer
        issuer_cn = issuer_entity.get_attributes_for_oid(NameOID.COMMON_NAME)[0].value
        issuer_org = issuer_entity.get_attributes_for_oid(NameOID.ORGANIZATION_NAME)[0].value
        issuer_ou = issuer_entity.get_attributes_for_oid(NameOID.ORGANIZATIONAL_UNIT_NAME)[0].value
        print(f"Người cấp - Tên chung (CN): {issuer_cn}")
        print(f"Người cấp - Tổ chức (O): {issuer_org}")
        print(f"Người cấp - Đơn vị (OU): {issuer_ou}")

        # 4. Thông tin chữ ký và bảo mật
        sig_algo = credential.signature_algorithm_oid._name
        hash_algo = credential.signature_hash_algorithm.name
        print(f"Thuật toán chữ ký: {sig_algo}")
        print(f"Thuật toán băm (Hash): {hash_algo}")
        
        # Tính toán Fingerprint
        fingerprint = credential.fingerprint(credential.signature_hash_algorithm).hex()
        print(f"Mã băm vân tay (Fingerprint): {fingerprint}")

        # Lấy Subject Key Identifier
        ski_ext = credential.extensions.get_extension_for_oid(ExtensionOID.SUBJECT_KEY_IDENTIFIER)
        ski_hex = ski_ext.value.key_identifier.hex()
        print(f"Định danh khóa chủ thể (SKI): {ski_hex}")

        # 5. Xuất khẩu khóa công khai (Public Key)
        pub_key = credential.public_key().public_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PublicFormat.SubjectPublicKeyInfo
        )
        print(f"Khóa công khai (PEM):\n{pub_key.decode('utf-8')}")

        # 6. Phân tích phần mở rộng (Extensions) - Subject Alternative Name
        san_ext = credential.extensions.get_extension_for_oid(ExtensionOID.SUBJECT_ALTERNATIVE_NAME).value
        dns_list = san_ext.get_values_for_type(x509.DNSName)
        ip_list = san_ext.get_values_for_type(x509.IPAddress)
        print(f"Danh sách tên miền (SAN DNS): {dns_list}")
        print(f"Danh sách địa chỉ IP (SAN IP): {ip_list}")

    except Exception as e:
        print(f"Có lỗi xảy ra trong quá trình xử lý: {e}")

if __name__ == "__main__":
    parse_certificate_details(pem_content)

Kết quả thu được sau khi thực thi đoạn mã trên sẽ hiển thị các thông số kỹ thuật của chứng chỉ như sau:

Thời gian bắt đầu hiệu lực: 2023-01-13 10:33:17
Thời gian hết hạn: 2032-01-11 10:33:17
Chủ thể - Tên chung (CN): 示例测试用户1.sign.TestCMorg1
Chủ thể - Tổ chức (O): TestCMorg1
Chủ thể - Quốc gia (C): cn
Chủ thể - Khu vực (L): beijing
Chủ thể - Đơn vị (OU): admin
Người cấp - Tên chung (CN): ca.示例测试组织1
Người cấp - Tổ chức (O): TestCMorg1
Người cấp - Đơn vị (OU): root-cert
Thuật toán chữ ký: ecdsa-with-SHA256
Thuật toán băm (Hash): sha256
Mã băm vân tay (Fingerprint): 8e78b776113cd16a862952a830b8fe809951bdbcaa03a8476b8dabd1d262871b
Định danh khóa chủ thể (SKI): 5335113dc729f81b710b1c18d58f2056486de8fe498eac0ae856b421e84a3df6
Khóa công khai (PEM):
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6BQ0PoeL9KTk3FZlJhiubj4K7AzM
oR0balvJJ2QWq/wpc87odyuYmqzrdgn1FVfbLiQYPDPR3TD4+Jzm8hY6yw==
-----END PUBLIC KEY-----

Danh sách tên miền (SAN DNS): ['localhost', 'chainmaker.org']
Danh sách địa chỉ IP (SAN IP): [IPv4Address('127.0.0.1')]

Thẻ: python cryptography X.509 openssl Security

Đăng vào ngày 21 tháng 6 lúc 04:26