generate-cert 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #!/bin/bash
  2. set -euo pipefail
  3. CN="${1:-}"
  4. HOST="${2:-}"
  5. if [[ -z "$CN" || -z "$HOST" ]]; then
  6. echo "Usage: $0 <CN> <HOST>" >&2
  7. exit 1
  8. fi
  9. # Set up working temp dir
  10. WORKDIR=$(mktemp -d)
  11. trap "rm -rf $WORKDIR" EXIT
  12. CA_KEY="ca.key"
  13. CA_CERT="ca.pem"
  14. # === Ensure CA exists ===
  15. if [[ ! -f $CA_KEY || ! -f $CA_CERT ]]; then
  16. echo "🔧 Generating CA..."
  17. openssl genrsa -out $CA_KEY 4096
  18. openssl req -x509 -new -nodes -key $CA_KEY -sha256 -days 3650 -out $CA_CERT \
  19. -subj "/CN=Local Dev CA"
  20. fi
  21. # === Generate key and CSR ===
  22. openssl genrsa -out "$WORKDIR/key.pem" 2048
  23. openssl req -new -key "$WORKDIR/key.pem" -out "$WORKDIR/cert.csr" \
  24. -subj "/CN=$CN"
  25. cat > "$WORKDIR/cert.ext" <<EOF
  26. authorityKeyIdentifier=keyid,issuer
  27. basicConstraints=CA:FALSE
  28. keyUsage = digitalSignature, keyEncipherment
  29. extendedKeyUsage = serverAuth, clientAuth
  30. subjectAltName = DNS:$HOST
  31. EOF
  32. # === Sign cert ===
  33. openssl x509 -req \
  34. -in "$WORKDIR/cert.csr" \
  35. -CA "$CA_CERT" -CAkey "$CA_KEY" -CAcreateserial \
  36. -out "$WORKDIR/cert.pem" -days 825 -sha256 -extfile "$WORKDIR/cert.ext"
  37. # === Build full chain and mark alias ===
  38. cat "$WORKDIR/cert.pem" "$CA_CERT" > "$WORKDIR/chain.pem"
  39. cp "$CA_CERT" "$WORKDIR/ca.pem"
  40. echo "$CN" > "$WORKDIR/alias"
  41. # === Emit tarball to stdout ===
  42. tar -C "$WORKDIR" -cf - cert.pem key.pem chain.pem ca.pem alias