Просмотр информации по сертификатам

На вывод необходимо получить всю информацию из ssl сертификата (subject, issuer, extensions и т д).
С сертификатами форматов pem, der разобрался, но не могу найти решение для .jks, .cacert.
Нужно сделать на питоне. Что имею сейчас:

def get_info(path_to_file, filename, file_type):
    with open(path_to_file + "/" + filename, 'rb') as cert_file:
        if file_type == '.der':
            cert = x509.load_der_x509_certificate(cert_file.read(), default_backend())
        elif file_type == '.pem' or file_type == '.cer' or file_type == '.crt':
            cert = x509.load_pem_x509_certificate(cert_file.read(), default_backend())

        cryptography.hazmat.primitives.serialization.pkcs12.load_pkcs12(cert_file.read(), None)
            cert = cert.cert.certificate

        print("Subject: " + str(cert.subject))
        for extension in cert.extensions:
            print(extension)

То есть нужен какой то аналог x509.load_der_x509_certificate, но для других форматов.
Задача в том, чтобы программно реализовать команды типа

openssl x509 -in certificate.crt -text -noout

Ответы (1 шт):

Автор решения: Dmitry

Можно воспользоваться subprocess и выполнить команду на прямую через openssl

import subprocess
result = subprocess.run(['openssl', 'x509', '-in', 'certificate.crt', '-text', '-noout'])

Данное использование выведет результат по исполнению команды. Чтобы поместить в переменную результат, необходимо вызвать check_output метод:

import subprocess
result = subprocess.check_output(['openssl', 'x509', '-in', 'certificate.crt', '-text', '-noout'])

Буквально, данный метод позволяет использовать любой функционал внешней утилиты. В данном примере openssl

Как воспользоваться данной возможностью на Windows

  1. Установите OpenSSl для Windows
  2. Установите переменную окружения для OpenSSl
  3. Воспользуйтесь командой для Python, указанной выше

Если, же вы не знаете, как работать с переменными окружения в Windows, то можете указать путь к запуску на прямую, пример

import subprocess
result = subprocess.check_output(['C:\\Program Files\\OpenSSL-Win64\\bin\\openssl', 'x509', '-in', 'client.crt', '-text', '-noout'])

Опробовано на Windows 10 Pro, 64 bit

→ Ссылка