#!/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}"