Нужна помощь в конвертации ASN1 (x509) - PullRequest
0 голосов
/ 29 октября 2019

Застрял на попытке преобразовать мой результат из "20190211004950Z" (ASN1) в "2019-02-11" (стандартная дата). Прежде чем кто-либо спросит, это просто простая проверка истечения срока действия SSL, и даты создания / окончания срока действия продолжают выводиться. как я писал ранее.

Мой код выглядит так

          **

    **import OpenSSL
import socket
import ssl
from pprint import pprint
from urllib.error import URLError, HTTPError
from urllib.request import Request, urlopen
import datetime


def get_certificate(port=443, timeout=10):
    """

    :param timeout:
    :type port: object
    """
    context = ssl.create_default_context()
    # test=(host,port)
    host = input("enter a URL")
    conn = socket.create_connection(address=(host, port))

    sock = context.wrap_socket(conn, server_hostname=host)

    sock.settimeout(timeout)
    try:
        der_cert = sock.getpeercert(True)
    finally:
        sock.close()
    return ssl.DER_cert_to_PEM_cert(der_cert)


certificate = get_certificate()
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, certificate)


result = {
    'subject': dict(x509.get_subject().get_components()),
    'issuer': dict(x509.get_issuer().get_components()),
    'serialNumber': x509.get_serial_number(),
    'version': x509.get_version(),
    'notBefore': str(x509.get_notBefore()),
    'notAfter': str(x509.get_notAfter())
}

extensions = (x509.get_extension(i) for i in range(x509.get_extension_count()))
extension = (e.get_short_name() for e in extensions)
result.update(name=extension)
pprint(result)**

**

Любая помощь будет оценена

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Ваша строка всегда будет соответствовать формату: 4 цифры для года + 2 цифры для месяца + цифры дня? Как насчет всех тех персонажей, которые появляются после, они актуальны? Чем они определяются?

На данный момент, есть решение, которое предполагает, что дата соответствует тому же формату и что остальная часть строки должна игнорироваться:

import datetime


parse_format = ‘%Y%m%d’
out_format = ‘%Y-%m-%d’

str_1 = ‘20190211004950Z’

parse_date_res = datetime.datetime.strptime(str_1[:8], parse_format)

date_str_out = parse_date_res.strftime(out_format)

ЭтоКод сначала разбирает строку в объект даты, так как я не был полностью уверен, что вы просто хотите получить строку в качестве вывода. В любом случае, если ничто не мешает вам использовать объект даты, то вам, вероятно, следует!

0 голосов
/ 29 октября 2019

результат = '20190211004950Z'

formatted_result = '{} - {} - {}'. Формат (результат [: 4], результат [4: 6], результат [6: 8])

...