111 lines
4.9 KiB
Bash
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}"
|
|
|