#!/bin/bash
 
# Каталоги
OUTPUT_DIR="./ingress-cert"
CORPORATE_CA_DIR="./corporate-pki"
 
echo "=== Создание сертификата для Ingress (*.my-cluster.dapp.test.un.sbt) ==="
 
# Шаг 1: Создание каталога
mkdir -p "$OUTPUT_DIR"
 
# Шаг 2: Проверка наличия корневого CA
if [ ! -f "$CORPORATE_CA_DIR/corporate-ca.crt" ] || [ ! -f "$CORPORATE_CA_DIR/corporate-ca.key" ]; then
    echo "Ошибка: Не найден корневой CA. Сначала запустите эмуляцию корпоративного PKI."
    exit 1
fi
 
echo "Найден корневой CA: $CORPORATE_CA_DIR/corporate-ca.crt"
 
# Шаг 3: Создание конфигурационного файла для сертификата ingress
cat > "$OUTPUT_DIR/ingress.conf" <<EOF
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
 
[ req_distinguished_name ]
CN = *.my-cluster.dapp.test.un.sbt
 
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
 
[ alt_names ]
DNS.1 = *.my-cluster.dapp.test.un.sbt
DNS.2 = my-cluster.dapp.test.un.sbt
EOF
 
# Шаг 4: Генерация приватного ключа для ingress
echo "Генерация приватного ключа для ingress..."
openssl genrsa -out "$OUTPUT_DIR/tls.key" 2048
 
# Шаг 5: Создание Certificate Signing Request (CSR)
echo "Создание CSR для ingress..."
openssl req -new \
  -key "$OUTPUT_DIR/tls.key" \
  -out "$OUTPUT_DIR/tls.csr" \
  -config "$OUTPUT_DIR/ingress.conf" \
  -extensions v3_req
 
# Шаг 6: Подпись CSR корпоративным CA
echo "Подпись CSR корпоративным CA..."
openssl x509 -req \
  -in "$OUTPUT_DIR/tls.csr" \
  -CA "$CORPORATE_CA_DIR/corporate-ca.crt" \
  -CAkey "$CORPORATE_CA_DIR/corporate-ca.key" \
  -CAcreateserial \
  -out "$OUTPUT_DIR/tls.crt" \
  -days 365 \
  -extensions v3_req \
  -extfile "$OUTPUT_DIR/ingress.conf"
 
# Шаг 7: Создание полной цепочки сертификатов
echo "Создание полной цепочки сертификатов..."
cat "$OUTPUT_DIR/tls.crt" "$CORPORATE_CA_DIR/corporate-ca.crt" > "$OUTPUT_DIR/tls-fullchain.crt"
 
# Шаг 8: Вывод результатов
echo
echo "=== Результаты ==="
echo "Приватный ключ ingress: $OUTPUT_DIR/tls.key"
echo "Сертификат ingress:     $OUTPUT_DIR/tls.crt"
echo "Полная цепочка:         $OUTPUT_DIR/tls-fullchain.crt"
echo "CSR для ingress:        $OUTPUT_DIR/tls.csr"
 
# Шаг 9: Проверка сертификата
echo
echo "=== Проверка сертификата ==="
echo "Subject:"
openssl x509 -in "$OUTPUT_DIR/tls.crt" -noout -subject
 
echo "Issuer:"
openssl x509 -in "$OUTPUT_DIR/tls.crt" -noout -issuer
 
echo "SAN:"
openssl x509 -in "$OUTPUT_DIR/tls.crt" -noout -text | grep -A 2 "Subject Alternative Name"
 
echo "Срок действия:"
openssl x509 -in "$OUTPUT_DIR/tls.crt" -noout -dates
 
# Шаг 10: Проверка цепочки
echo
echo "=== Проверка цепочки ==="
if openssl verify -CAfile "$CORPORATE_CA_DIR/corporate-ca.crt" "$OUTPUT_DIR/tls.crt" >/dev/null 2>&1; then
    echo "✅ Цепочка сертификатов КОРРЕКТНА"
else
    echo "❌ Цепочка сертификатов НЕКОРРЕКТНА"
    openssl verify -CAfile "$CORPORATE_CA_DIR/corporate-ca.crt" "$OUTPUT_DIR/tls.crt"
fi
 
# Шаг 11: Проверка соответствия ключа и сертификата
echo
echo "=== Проверка соответствия ключа и сертификата ==="
KEY_MODULUS=$(openssl rsa -noout -modulus -in "$OUTPUT_DIR/tls.key" 2>/dev/null | openssl md5)
CERT_MODULUS=$(openssl x509 -noout -modulus -in "$OUTPUT_DIR/tls.crt" | openssl md5)
 
if [ "$KEY_MODULUS" = "$CERT_MODULUS" ]; then
    echo "✅ Приватный ключ и сертификат СООТВЕТСТВУЮТ"
else
    echo "❌ Приватный ключ и сертификат НЕ СООТВЕТСТВУЮТ"
fi
 
echo
echo "=== Готово! ==="
echo "Сертификат готов для использования в ingress controller"
echo "Для создания Kubernetes secret:"
echo "kubectl create secret tls ingress-tls \\"
echo "  --cert=$OUTPUT_DIR/tls.crt \\"
echo "  --key=$OUTPUT_DIR/tls.key"
