Код
import os
from datetime import datetime, timedelta, timezone
from cryptography import x509
from cryptography.hazmat.backends import default_backend
# Текущая директория
current_directory = os.path.dirname(os.path.abspath(__file__))
# Папка с сертификатами относительно текущей директории
CERTS_DIR = os.path.join(current_directory, ‘certs’)
# Формирование имени отчетного файла с текущей датой и временем
current_time = datetime.now().strftime(‘%Y-%m-%d_%H-%M-%S’)
REPORT_FILE = os.path.join(current_directory, f’certificates_report_{current_time}.txt’)
#REPORT_FILE = os.path.join(current_directory, ‘certificates_report.txt’)
# Количество дней до окончания срока действия, за которое нужно уведомить
NOTIFY_DAYS_BEFORE_EXPIRY = 30
def load_certificate(file_path):
with open(file_path, ‘rb’) as cert_file:
cert_data = cert_file.read()
try:
# Пытаемся загрузить сертификат как PEM
cert = x509.load_pem_x509_certificate(cert_data, default_backend())
except ValueError:
# Если не удалось, пытаемся загрузить как DER
cert = x509.load_der_x509_certificate(cert_data, default_backend())
return cert
def get_certificate_info(cert):
owner = cert.subject.get_attributes_for_oid(x509.NameOID.COMMON_NAME)[0].value
creation_date = cert.not_valid_before_utc
expiry_date = cert.not_valid_after_utc
return owner, creation_date, expiry_date
def check_certificates(directory):
current_date = datetime.now(timezone.utc)
notify_date = current_date + timedelta(days=NOTIFY_DAYS_BEFORE_EXPIRY)
report_lines = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(‘.cer’):
cert_path = os.path.join(root, file)
try:
cert = load_certificate(cert_path)
owner, creation_date, expiry_date = get_certificate_info(cert)
# Запись информации о сертификате в отчет
report_lines.append(f’Сертификат: {file}’)
report_lines.append(f’Владелец: {owner}’)
report_lines.append(f’Дата создания: {creation_date}’)
report_lines.append(f’Дата истечения: {expiry_date}’)
report_lines.append(»)
# Проверка срока действия сертификата
if current_date <= expiry_date < notify_date:
print(f’Сертификат {file} истекает {expiry_date}. Нужно обновить.’)
except Exception as e:
print(f’Ошибка при обработке сертификата {file}: {e}’)
report_lines.append(f’Ошибка при обработке сертификата {file}: {e}’)
report_lines.append(»)
# Запись отчета в файл
with open(REPORT_FILE, ‘w’, encoding=’utf-8′) as report_file:
report_file.write(‘\n’.join(report_lines))
if __name__ == «__main__»:
if not os.path.exists(CERTS_DIR):
print(f’Папка {CERTS_DIR} не существует.’)
else:
check_certificates(CERTS_DIR)
print(f’Отчет сохранен в {REPORT_FILE}’)
from datetime import datetime, timedelta, timezone
from cryptography import x509
from cryptography.hazmat.backends import default_backend
# Текущая директория
current_directory = os.path.dirname(os.path.abspath(__file__))
# Папка с сертификатами относительно текущей директории
CERTS_DIR = os.path.join(current_directory, ‘certs’)
# Формирование имени отчетного файла с текущей датой и временем
current_time = datetime.now().strftime(‘%Y-%m-%d_%H-%M-%S’)
REPORT_FILE = os.path.join(current_directory, f’certificates_report_{current_time}.txt’)
#REPORT_FILE = os.path.join(current_directory, ‘certificates_report.txt’)
# Количество дней до окончания срока действия, за которое нужно уведомить
NOTIFY_DAYS_BEFORE_EXPIRY = 30
def load_certificate(file_path):
with open(file_path, ‘rb’) as cert_file:
cert_data = cert_file.read()
try:
# Пытаемся загрузить сертификат как PEM
cert = x509.load_pem_x509_certificate(cert_data, default_backend())
except ValueError:
# Если не удалось, пытаемся загрузить как DER
cert = x509.load_der_x509_certificate(cert_data, default_backend())
return cert
def get_certificate_info(cert):
owner = cert.subject.get_attributes_for_oid(x509.NameOID.COMMON_NAME)[0].value
creation_date = cert.not_valid_before_utc
expiry_date = cert.not_valid_after_utc
return owner, creation_date, expiry_date
def check_certificates(directory):
current_date = datetime.now(timezone.utc)
notify_date = current_date + timedelta(days=NOTIFY_DAYS_BEFORE_EXPIRY)
report_lines = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(‘.cer’):
cert_path = os.path.join(root, file)
try:
cert = load_certificate(cert_path)
owner, creation_date, expiry_date = get_certificate_info(cert)
# Запись информации о сертификате в отчет
report_lines.append(f’Сертификат: {file}’)
report_lines.append(f’Владелец: {owner}’)
report_lines.append(f’Дата создания: {creation_date}’)
report_lines.append(f’Дата истечения: {expiry_date}’)
report_lines.append(»)
# Проверка срока действия сертификата
if current_date <= expiry_date < notify_date:
print(f’Сертификат {file} истекает {expiry_date}. Нужно обновить.’)
except Exception as e:
print(f’Ошибка при обработке сертификата {file}: {e}’)
report_lines.append(f’Ошибка при обработке сертификата {file}: {e}’)
report_lines.append(»)
# Запись отчета в файл
with open(REPORT_FILE, ‘w’, encoding=’utf-8′) as report_file:
report_file.write(‘\n’.join(report_lines))
if __name__ == «__main__»:
if not os.path.exists(CERTS_DIR):
print(f’Папка {CERTS_DIR} не существует.’)
else:
check_certificates(CERTS_DIR)
print(f’Отчет сохранен в {REPORT_FILE}’)
Проверяет сертификаты которые лежат в папке «certs» и показывает сертификаты у которых скоро кончится срок действия.
Код
@echo off
rem Установка пути к интерпретатору Python
set PYTHON=python
rem Установка пути к скрипту Python
set SCRIPT_PATH=C:\путь до скрипта.py
rem Запуск скрипта Python
%PYTHON% %SCRIPT_PATH%
pause
выше bat файл для удобства запуска