From 7ca246db3f644dd1e989b62a39eab3ad35da3442 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 18 Mar 2026 09:43:48 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BA=D0=BE=D1=80=D0=BD=D0=B5=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B8=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B8=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generate_root_ca.sh | 56 +++++++++++++++++++++++++ generate_signed_cert.sh | 93 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100755 generate_root_ca.sh create mode 100755 generate_signed_cert.sh diff --git a/generate_root_ca.sh b/generate_root_ca.sh new file mode 100755 index 0000000..ba48aad --- /dev/null +++ b/generate_root_ca.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# Настройки +CERT_DIR="$HOME/certs" +CA_NAME="myrootca" +DAYS=3650 # 10 лет + +# Цвета +GREEN='\033[0;32m' +RED='\033[0;31m' +NC='\033[0m' + +echo "Генерация корневого сертификата (Root CA)..." + +# 1. Создание директории +mkdir -p "$CERT_DIR" +cd "$CERT_DIR" || exit 1 + +# Проверка: если CA уже существует, предупреждаем +if [ -f "${CA_NAME}.crt" ] && [ -f "${CA_NAME}.key" ]; then + echo -e "${RED}Внимание!${NC} Файлы ${CA_NAME}.crt и ${CA_NAME}.key уже существуют." + read -p "Перезаписать их? (это аннулирует все ранее выданные сертификаты) [y/N]: " confirm + if [[ ! $confirm =~ ^[Yy]$ ]]; then + echo "Отменено." + exit 0 + fi +fi + +# 2. Генерация приватного ключа (4096 бит) +echo "Генерация приватного ключа..." +openssl genrsa -out "${CA_NAME}.key" 4096 2>/dev/null +chmod 600 "${CA_NAME}.key" # Защита ключа + +# 3. Генерация самоподписанного сертификата +echo "Генерация корневого сертификата..." +openssl req -x509 -new -nodes \ + -key "${CA_NAME}.key" \ + -sha256 \ + -days ${DAYS} \ + -out "${CA_NAME}.crt" \ + -subj "/C=RU/ST=State/L=City/O=MyOrg/CN=TrueNAS Root CA" + +# Проверка результата +if [ -f "${CA_NAME}.crt" ]; then + echo -e "${GREEN}Успешно!${NC}" + echo "Файлы созданы в: $CERT_DIR" + echo " Ключ: ${CA_NAME}.key (храните в секрете!)" + echo " Серт: ${CA_NAME}.crt (установите этот файл на все клиентские устройства)" + + echo "" + echo "Информация о сертификате:" + openssl x509 -in "${CA_NAME}.crt" -noout -subject -dates +else + echo -e "${RED}Ошибка при создании сертификата.${NC}" + exit 1 +fi diff --git a/generate_signed_cert.sh b/generate_signed_cert.sh new file mode 100755 index 0000000..731b310 --- /dev/null +++ b/generate_signed_cert.sh @@ -0,0 +1,93 @@ +#!/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" +