#!/usr/bin/env bash # ============================================================================= # generate-certs.sh — Generate a custom CA and TLS certificates for ELK stack # ============================================================================= set -euo pipefail CERT_DIR="${1:-./certs}" DAYS_VALID=825 CA_SUBJECT="/C=US/ST=State/L=City/O=ELK-Lab/OU=Infrastructure/CN=ELK-Lab-CA" DOMAIN="elk.local" mkdir -p "${CERT_DIR}" echo ">>> Generating Custom CA..." openssl genrsa -out "${CERT_DIR}/ca.key" 4096 openssl req -x509 -new -nodes \ -key "${CERT_DIR}/ca.key" \ -sha256 -days ${DAYS_VALID} \ -out "${CERT_DIR}/ca.crt" \ -subj "${CA_SUBJECT}" # --- Function to generate a certificate signed by the CA --- generate_cert() { local NAME="$1" local CN="$2" local SANS="$3" echo ">>> Generating certificate for ${NAME} (CN=${CN})..." openssl genrsa -out "${CERT_DIR}/${NAME}.key" 2048 cat > "${CERT_DIR}/${NAME}.cnf" <>> Creating Elasticsearch PKCS12 keystore..." openssl pkcs12 -export \ -in "${CERT_DIR}/elasticsearch.crt" \ -inkey "${CERT_DIR}/elasticsearch.key" \ -CAfile "${CERT_DIR}/ca.crt" \ -chain \ -out "${CERT_DIR}/elasticsearch.p12" \ -passout pass:changeit # --- Create Elasticsearch HTTP PKCS12 keystore --- cp "${CERT_DIR}/elasticsearch.p12" "${CERT_DIR}/elastic-http.p12" # --- Cleanup serial file --- rm -f "${CERT_DIR}/ca.srl" echo "" echo "=== Certificates generated in ${CERT_DIR}/ ===" ls -la "${CERT_DIR}/" echo "" echo "CA certificate: ${CERT_DIR}/ca.crt" echo "CA private key: ${CERT_DIR}/ca.key" echo "Elasticsearch cert: ${CERT_DIR}/elasticsearch.crt" echo "Kibana cert: ${CERT_DIR}/kibana.crt" echo "Logstash cert: ${CERT_DIR}/logstash.crt" echo "NGINX cert: ${CERT_DIR}/nginx.crt" echo "Authentik cert: ${CERT_DIR}/authentik.crt"