#!/bin/bash # Настройки CERT_DIR="$HOME/certs" CA_KEY="$CERT_DIR/truenasrootca.key" CA_CRT="$CERT_DIR/truenasrootca.crt" # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Функция для вывода ошибок error() { echo -e "${RED}[ERROR]${NC} $1" >&2 exit 1 } # Функция для вывода успеха success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } # Проверка аргументов if [ "$#" -ne 3 ]; then echo "Использование: $0 <имя_сертификата> " echo "Пример: $0 truenas truenas.local 192.168.0.137" exit 1 fi CERT_NAME="$1" DNS_NAME="$2" IP_ADDR="$3" # Переход в директорию сертификатов mkdir -p "$CERT_DIR" cd "$CERT_DIR" || error "Не удалось перейти в директорию $CERT_DIR" # 1. Проверка наличия корневого CA if [ ! -f "$CA_KEY" ] || [ ! -f "$CA_CRT" ]; then error "Корневой сертификат не найден! ($CA_CRT / $CA_KEY)" echo "Сначала создайте Root CA или убедитесь, что файлы лежат в $CERT_DIR" exit 1 fi echo -e "${YELLOW}Генерация сертификата для: ${CERT_NAME}${NC}" echo "DNS: $DNS_NAME" echo "IP: $IP_ADDR" # 2. Генерация приватного ключа сервера # (Пересоздаем ключ, если он уже есть, чтобы не было конфликтов) openssl genrsa -out "${CERT_NAME}.key" 4096 2>/dev/null || error "Не удалось создать ключ" chmod 600 "${CERT_NAME}.key" # Защита ключа # 3. Создание файла расширений (v3.ext) динамически cat > "${CERT_NAME}.ext" << EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = ${DNS_NAME} IP.1 = ${IP_ADDR} EOF # 4. Создание CSR (Certificate Signing Request) openssl req -new -key "${CERT_NAME}.key" -out "${CERT_NAME}.csr" \ -subj "/CN=${DNS_NAME}" 2>/dev/null || error "Не удалось создать CSR" # 5. Подпись сертификата корневым CA openssl x509 -req -in "${CERT_NAME}.csr" \ -CA "$CA_CRT" -CAkey "$CA_KEY" -CAcreateserial \ -out "${CERT_NAME}.crt" -days 3650 -sha256 \ -extfile "${CERT_NAME}.ext" 2>/dev/null || error "Не удалось подписать сертификат" # 6. Очистка временных файлов (CSR и ext) # Если вам нужен CSR для других целей, закомментируйте следующую строку rm -f "${CERT_NAME}.csr" "${CERT_NAME}.ext" # 7. Финальный вывод success "Сертификат успешно создан!" echo "Файлы:" echo " Ключ: $CERT_DIR/${CERT_NAME}.key" echo " Серт: $CERT_DIR/${CERT_NAME}.crt" echo "Подписан с помощью: (использовать для установки доверия на клиентах)" # Проверка содержимого echo "" echo "Информация о сертификате:" openssl x509 -in "${CERT_NAME}.crt" -noout -text | grep -A1 "Subject Alternative Name"