cert-gen.sh
Генерация самоподписанных TLS-сертификатов для dev-окружений за одну команду. Создаёт собственный CA (Certificate Authority), серверный сертификат и ключ. Удобно для локальной разработки с HTTPS без Let's Encrypt.
Зависимости
openssl(обычно уже установлен)bash 4+
Использование
chmod +x cert-gen.sh # Генерация сертификата для домена ./cert-gen.sh myapp.local # С указанием директории для файлов ./cert-gen.sh myapp.local ./certs # Результат: ca.pem, server.key, server.crt
После генерации добавьте ca.pem в доверенные корневые сертификаты браузера для устранения предупреждений.
Код
#!/usr/bin/env bash
set -euo pipefail
# cert-gen.sh — генерация самоподписанных TLS-сертификатов
# Использование: ./cert-gen.sh <domain> [output_dir=./certs]
DOMAIN="${1:?Укажите домен, например: myapp.local}"
OUT_DIR="${2:-./certs}"
DAYS=365
mkdir -p "$OUT_DIR"
CA_KEY="$OUT_DIR/ca.key"
CA_CERT="$OUT_DIR/ca.pem"
SRV_KEY="$OUT_DIR/server.key"
SRV_CSR="$OUT_DIR/server.csr"
SRV_CERT="$OUT_DIR/server.crt"
SRV_EXT="$OUT_DIR/server.ext"
echo "▸ Генерация CA..."
openssl genrsa -out "$CA_KEY" 2048 2>/dev/null
openssl req -x509 -new -nodes -key "$CA_KEY" -sha256 -days "$DAYS" \
-subj "/C=RU/ST=Dev/O=LocalCA/CN=LocalCA" \
-out "$CA_CERT" 2>/dev/null
echo "▸ Генерация серверного ключа и CSR..."
openssl genrsa -out "$SRV_KEY" 2048 2>/dev/null
openssl req -new -key "$SRV_KEY" \
-subj "/C=RU/ST=Dev/O=LocalDev/CN=$DOMAIN" \
-out "$SRV_CSR" 2>/dev/null
# Расширения для SAN (Subject Alternative Name)
cat > "$SRV_EXT" <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature,nonRepudiation,keyEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1=$DOMAIN
DNS.2=*.$DOMAIN
IP.1=127.0.0.1
EOF
echo "▸ Подпись сертификата..."
openssl x509 -req -in "$SRV_CSR" -CA "$CA_CERT" -CAkey "$CA_KEY" \
-CAcreateserial -out "$SRV_CERT" -days "$DAYS" -sha256 \
-extfile "$SRV_EXT" 2>/dev/null
# Очистка временных файлов
rm -f "$SRV_CSR" "$SRV_EXT" "$OUT_DIR/ca.srl"
echo ""
echo "✓ Сертификаты созданы в $OUT_DIR/"
echo " CA: $CA_CERT"
echo " Ключ: $SRV_KEY"
echo " Сертификат: $SRV_CERT"
echo " Домен: $DOMAIN, *.$DOMAIN"
echo " Срок: $DAYS дней"