nas_scripts/generate_signed_cert.sh

94 lines
3.3 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 <имя_сертификата> <DNS_имя> <IP_адрес>"
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"