Files
cert/check-all-certs.sh
T
2026-10-01 16:13:02 +03:00

111 lines
4.9 KiB
Bash

#!/bin/bash
# Цветовая разметка для терминала
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0;60m' # Сброс цвета
# Массив со строго заданными именами ваших файлов
TARGET_CERTS=("root_ca.crt" "intermediate_ca.crt" "issuing.crt")
echo -e "${BLUE}==================================================${NC}"
echo -e "${BLUE} АНАЛИЗ И ПРОВЕРКА СЕРТИФИКАТОВ ${NC}"
echo -e "${BLUE}==================================================${NC}"
for cert in "${TARGET_CERTS[@]}"; do
# Если конкретного файла нет — просто идём к следующему
if [ ! -f "$cert" ]; then
continue
fi
echo ""
echo -e "${YELLOW}--------------------------------------------------${NC}"
echo -e "Файл: ${GREEN}$cert${NC}"
echo -e "${YELLOW}--------------------------------------------------${NC}"
# Извлекаем основные метаданные
SUBJECT=$(openssl x509 -in "$cert" -noout -subject | sed 's/subject=//')
ISSUER=$(openssl x509 -in "$cert" -noout -issuer | sed 's/issuer=//')
END_DATE=$(openssl x509 -in "$cert" -noout -enddate | sed 's/notAfter=//')
echo -e "${BLUE}Имя (Subject):${NC} $SUBJECT"
echo -e "${BLUE}Издатель (Issuer):${NC} $ISSUER"
echo -e "${BLUE}Действует до:${NC} $END_DATE"
# Проверяем тип сертификата (CA или конечный)
IS_CA=$(openssl x509 -in "$cert" -text -noout | grep -E "CA:TRUE|CA:FALSE")
if [[ "$IS_CA" == *"CA:TRUE"* ]]; then
# Вытаскиваем строку Basic Constraints и очищаем от пробелов
PATHLEN_LINE=$(openssl x509 -in "$cert" -text -noout | grep -A1 "Basic Constraints" | tail -n 1 | sed 's/^[ \t]*//')
# Переводим технический текст на понятный русский язык
if [[ "$PATHLEN_LINE" == *"pathlen:0"* ]]; then
RU_PATHLEN=" [Выпуск CA недоступен]"
elif [[ "$PATHLEN_LINE" == *"pathlen:"* ]]; then
# Вырезаем цифру лимита (например, pathlen:1)
NUM=$(echo "$PATHLEN_LINE" | grep -o -E '[0-9]+')
RU_PATHLEN=" [Допустима цепочка СА из $NUM сертификатов]"
else
# Если параметр pathlen вообще отсутствует в Basic Constraints
RU_PATHLEN=" [Не имеет ограничений по выпуску CA]"
fi
echo -e "${BLUE}Тип:${NC} Удостоверяющий центр (CA)$RU_PATHLEN"
# Вывод Name Constraints для промежуточных CA
CONSTRAINTS=$(openssl x509 -in "$cert" -text -noout | awk '/Permitted:/ {flag=1; next} /X509v3|Signature Algorithm:/ {flag=0} flag {print}' | sed 's/^[ \t]*//' | sed 's/^/ /')
if [ ! -z "$CONSTRAINTS" ]; then
echo -e "${BLUE}Ограничения имён (Name Constraints):${NC}"
echo "$CONSTRAINTS"
fi
else
echo -e "${BLUE}Тип:${NC} Конечный SSL-сертификат (End-Entity)"
# Вывод SAN для конечного сертификата
SAN_DOMAINS=$(openssl x509 -in "$cert" -text -noout | awk '/Subject Alternative Name:/ {flag=1; next} /X509v3|Signature Algorithm:/ {flag=0} flag {print}' | sed 's/^[ \t]*//' | sed 's/, /\n/g' | sed 's/^/ /')
if [ ! -z "$SAN_DOMAINS" ]; then
echo -e "${BLUE}Защищаемые домены и IP (SAN):${NC}"
echo "$SAN_DOMAINS"
fi
fi
done
echo ""
echo -e "${BLUE}==================================================${NC}"
echo -e "${BLUE} ПРОВЕРКА ЦЕПОЧКИ ВЕРИФИКАЦИИ ${NC}"
echo -e "${BLUE}==================================================${NC}"
ROOT_FILE="root_ca.crt"
INTERMEDIATE_FILE="intermediate_ca.crt"
ISSUING_FILE="issuing.crt"
# 1. Проверка Intermediate CA через Root CA
if [ -f "$ROOT_FILE" ] && [ -f "$INTERMEDIATE_FILE" ]; then
echo -n "Проверка Intermediate CA корневым (Root): "
VERIFY_INT=$(openssl verify -CAfile "$ROOT_FILE" "$INTERMEDIATE_FILE" 2>&1)
if [[ "$VERIFY_INT" == *"OK"* ]]; then
echo -e "${GREEN}УСПЕШНО (OK)${NC}"
else
echo -e "${RED}ОШИБКА\n$VERIFY_INT${NC}"
fi
fi
# 2. Проверка конечного SSL (issuing.crt) БЕЗ БАНДЛА (через -untrusted)
if [ -f "$ROOT_FILE" ] && [ -f "$INTERMEDIATE_FILE" ] && [ -f "$ISSUING_FILE" ]; then
echo -n "Проверка конечного SSL полной цепочкой (Root+Int): "
VERIFY_ISS=$(openssl verify -CAfile "$ROOT_FILE" -untrusted "$INTERMEDIATE_FILE" "$ISSUING_FILE" 2>&1)
if [[ "$VERIFY_ISS" == *"OK"* ]]; then
echo -e "${GREEN}УСПЕШНО (OK)${NC}"
else
echo -e "${RED}ОШИБКА${NC}"
echo "$VERIFY_ISS"
fi
fi
echo -e "${BLUE}==================================================${NC}"