@xgyrfalconx

Как проверить дату окончания всех сертификатов сайта?

Добрый день, просьба подсказать , есть ил возможность с помощью openssl вывести даты всех сертификатов сайта ?
На данный момент использую
echo | openssl s_client -servername yandex.ru -connect yandex.ru:443 | openssl x509 -dates -nocert


Но он выводит дату начала и окончания только для сертификата yandex.ru, а я хочу посмотреть даты Yandex CA и Certum Trusted Network CA.

depth=2 C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Trusted Network CA
verify return:1
depth=1 C = RU, O = Yandex LLC, OU = Yandex Certification Authority, CN = Yandex CA
verify return:1
depth=0 C = RU, L = Moscow, OU = ITO, O = Yandex LLC, CN = yandex.ru
verify return:1
notBefore=Feb 17 07:32:21 2022 GMT
notAfter=Aug 16 00:00:00 2022 GMT
DONE


Даты можно узнать если сохранить каждый сертификат из цепочки в отдельные файлы и вызвать
openssl x509 -in yandex.pem -dates -noout

Но не хотелось бы постоянно сохранять их.
  • Вопрос задан
  • 298 просмотров
Решения вопроса 1
@xgyrfalconx Автор вопроса
В общем решение нашел сам , смысл скрипта заключается в том что бы получить каждый сертификат отдельно и по каждому отдельно вызвать "openssl x509" , если кому то это поможет в будущем то оставлю здесь свой скрипт на python:
#!/usr/bin/python3

import re
import datetime
import sys
import traceback
from subprocess import PIPE, Popen, DEVNULL


def get_cert_dates(hostname):
    try:
        result = []
        certs = Popen('sudo openssl s_client -showcerts -verify_quiet -servername {0} -connect {0}:443'.format(hostname), shell=True,
                      stdout=PIPE, stdin=DEVNULL, stderr=PIPE).stdout.read().decode('utf-8')
        pattern = r'(-----BEGIN CERTIFICATE-----[\D\d]*?-----END CERTIFICATE-----)'
        for cert in re.findall(pattern, certs):
            data = Popen('echo "{}" |sudo openssl x509 -subject -dates -noout'.format(cert), shell=True, stdout=PIPE,
                         stderr=PIPE).stdout.read().decode('utf-8').split('\n')
            subject = re.search(r'CN\s*=\s*([\D\d]*?$)',
                                data[0]).group(1).strip().replace(' ', '_').replace("'", '')
            expiry_dt = datetime.datetime.strptime(re.search(r'notAfter\s*=\s*([\D\d]*?$)', data[2]).group(1),
                                                   '%b %d %H:%M:%S %Y %Z')
            expiry_ts = int(datetime.datetime.timestamp(expiry_dt))
            end = expiry_ts - int(datetime.datetime.timestamp(datetime.datetime.now()))
            result.append({'subject': subject, 'expiry_dt': expiry_dt, 'expiry_ts': expiry_ts, 'end': end})
        return result
    except:
        print(traceback.format_exc())


print(get_cert_dates('yandex.ru'))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@q2digger
никого не трогаю, починяю примус
Использую вот этот скрипт - https://github.com/Matty9191/ssl-cert-check , пробегает по списку сайтов, генерит алерт если срок подходит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы