TrashNotes

2025-04-21 08:48:38
скрипт комплексной проверки SSL-соединения

#!/bin/bash

# Список доменов для проверки
DOMAINS=("ur4uqu.com" "google.com")

# Путь к CA bundle (CentOS 7)
CA_BUNDLE="/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem"

# Проверка наличия CA bundle
if [[ ! -f "$CA_BUNDLE" ]]; then
  echo "Ошибка: CA bundle не найден по пути $CA_BUNDLE"
  echo "Установите пакет ca-certificates и выполните update-ca-trust extract"
  exit 1
fi

# Функция проверки DNS (A/AAAA) и ping
check_dns_and_ping() {
  local domain=$1
  echo "=== DNS и доступность для $domain ==="
  echo "A-записи:"
  dig +short A "$domain" || echo "  Ошибка при получении A-записей"
  echo "AAAA-записи:"
  dig +short AAAA "$domain" || echo "  Ошибка при получении AAAA-записей"
  echo

  echo "Ping (4 пакета):"
  ping -c 4 "$domain" || echo "  Хост недоступен по ping"
  echo
}

# Функция проверки CAA-записей
check_caa() {
  local domain=$1
  echo "=== Проверка CAA-записей для $domain ==="
  local caa_records
  caa_records=$(dig +short CAA "$domain")
  if [[ -z "$caa_records" ]]; then
    echo "  CAA записи отсутствуют — любой CA может выдавать сертификаты"
  else
    echo "  Найдены CAA записи:"
    echo "$caa_records" | while read -r line; do
      echo "    $line"
    done
  fi
  echo
}

# Функция получения и анализа SSL-сертификата
check_ssl_cert() {
  local domain=$1
  local port=443
  echo "=== Проверка SSL-сертификата для $domain:$port ==="

  # Получаем сертификат
  cert=$(echo | openssl s_client -connect "${domain}:${port}" -servername "$domain" 2>/dev/null | \
    sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p')

  if [[ -z "$cert" ]]; then
    echo "  Ошибка: не удалось получить сертификат"
    echo
    return
  fi

  # Выводим основные данные сертификата
  echo "$cert" | openssl x509 -noout -subject -issuer -dates -serial -fingerprint

  # Извлекаем Issuer (CA)
  issuer=$(echo "$cert" | openssl x509 -noout -issuer | sed 's/issuer= //')
  echo "  Центр сертификации (Issuer): $issuer"

  # Проверяем цепочку доверия
  verify_output=$(echo "$cert" | openssl verify -CAfile "$CA_BUNDLE" /dev/stdin 2>&1)
  echo "  Проверка цепочки доверия:"
  echo "  $verify_output"

  # Сравнение CA с CAA
  echo
  echo "  Проверка соответствия CA сертификата CAA-записям:"
  caa_records=$(dig +short CAA "$domain")
  if [[ -z "$caa_records" ]]; then
    echo "    CAA записи отсутствуют — любой CA может выдавать сертификаты"
  else
    echo "    Найдены CAA записи:"
    echo "$caa_records" | while read -r line; do
      echo "      $line"
    done

    ca_name=$(echo "$issuer" | grep -oP 'CN\s*=\s*\K[^,]+' || echo "")
    if [[ -z "$ca_name" ]]; then
      echo "    Не удалось извлечь имя CA из Issuer"
    else
      if echo "$caa_records" | grep -qi "$ca_name"; then
        echo "    CA из сертификата ($ca_name) соответствует CAA-записям"
      else
        echo "    Внимание: CA из сертификата ($ca_name) НЕ совпадает с CAA-записями"
      fi
    fi
  fi

  echo
}

# Функция проверки HTTPS соединения с помощью curl
check_https_curl() {
  local domain=$1
  echo "=== Проверка HTTPS соединения curl для $domain ==="
  curl -vI --connect-timeout 10 --max-time 15 "https://${domain}" 2>&1 | \
    grep -E "^(<|*|SSL|TLS|curl:|HTTP/)"
  echo
}

# Основной цикл по доменам
for domain in "${DOMAINS[@]}"; do
  echo "############################################################"
  echo "Проверка домена: $domain"
  echo "############################################################"
  check_dns_and_ping "$domain"
  check_caa "$domain"
  check_ssl_cert "$domain"
  check_https_curl "$domain"
done
← Previous Next →
Back to list