wrk 2025-01-01 11-48-22
check https (ssl) certificate import subprocess from datetime import datetime import argparse def get_cert_expiry_date(domain): try: # Получаем сертификат и извлекаем дату истечения result = subprocess.run( ['openssl', 's_client', '-connect', f'{domain}:443', '-servername', domain], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, input='Qn' ) # Извлекаем дату истечения из результата for line in result.stdout.splitlines(): if 'notAfter' in line: return line.strip().split('=')[1] # Если не нашли, пробуем получить дату через x509 cert_command = f"echo | openssl s_client -connect {domain}:443 -servername {domain} 2>/dev/null | openssl x509 -noout -enddate" expiry_date = subprocess.run(cert_command, shell=True, stdout=subprocess.PIPE, text=True) if expiry_date.stdout: return expiry_date.stdout.strip().split('=')[1] return None except Exception as e: print(f"Ошибка при получении сертификата для {domain}: {e}") return None def check_ssl_expiry(domain): expiry_date_str = get_cert_expiry_date(domain) if expiry_date_str: try: expiry_date = datetime.strptime(expiry_date_str.strip(), '%b %d %H:%M:%S %Y %Z') remaining_days = (expiry_date - datetime.utcnow()).days if remaining_days < 30: print(f"Сертификат для {domain} истекает через {remaining_days} дней.") else: print(f"Сертификат для {domain} действителен еще {remaining_days} дней.") except ValueError as ve: print(f"Ошибка при парсинге даты для {domain}: {ve}") else: print(f"Сертификат для {domain} не содержит даты истечения или не удалось получить информацию.") if __name__ == "__main__": parser = argparse.ArgumentParser(description='Check SSL certificate expiry dates.') parser.add_argument('domains', metavar='domain', type=str, nargs='+', help='Domain names to check') args = parser.parse_args() for domain in args.domains: check_ssl_expiry(domain)