Initial commit - Phase 3/4
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
114
scripts/generate-ssl-cert.sh
Normal file
114
scripts/generate-ssl-cert.sh
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/bin/bash
|
||||
# Generate self-signed SSL certificate for Dangerous Pi
|
||||
# Supports first-boot auto-generation or manual regeneration
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
CERT_DIR="/opt/dangerous-pi/ssl"
|
||||
CERT_FILE="$CERT_DIR/dangerous-pi.crt"
|
||||
KEY_FILE="$CERT_DIR/dangerous-pi.key"
|
||||
DAYS_VALID=3650 # 10 years
|
||||
|
||||
# Certificate subject
|
||||
SUBJECT="/CN=Dangerous Pi/O=Dangerous Pi/C=US"
|
||||
|
||||
# Subject Alternative Names (SANs)
|
||||
# - The AP gateway IP
|
||||
# - mDNS hostname
|
||||
# - Bare hostname
|
||||
# - Localhost for development
|
||||
SANS="IP:192.168.4.1,DNS:dangerous-pi.local,DNS:dangerous-pi,DNS:localhost,IP:127.0.0.1"
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Generate self-signed SSL certificate for Dangerous Pi HTTPS."
|
||||
echo ""
|
||||
echo "Options:"
|
||||
echo " --force Regenerate certificate even if one exists"
|
||||
echo " --cert-dir Specify certificate directory (default: $CERT_DIR)"
|
||||
echo " --help Show this help message"
|
||||
echo ""
|
||||
echo "The certificate will be valid for:"
|
||||
echo " - 192.168.4.1 (AP gateway IP)"
|
||||
echo " - dangerous-pi.local (mDNS hostname)"
|
||||
echo " - dangerous-pi (bare hostname)"
|
||||
echo " - localhost"
|
||||
}
|
||||
|
||||
FORCE=false
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--force)
|
||||
FORCE=true
|
||||
shift
|
||||
;;
|
||||
--cert-dir)
|
||||
CERT_DIR="$2"
|
||||
CERT_FILE="$CERT_DIR/dangerous-pi.crt"
|
||||
KEY_FILE="$CERT_DIR/dangerous-pi.key"
|
||||
shift 2
|
||||
;;
|
||||
--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Create SSL directory if it doesn't exist
|
||||
mkdir -p "$CERT_DIR"
|
||||
|
||||
# Check if certificate already exists
|
||||
if [ -f "$CERT_FILE" ] && [ "$FORCE" = false ]; then
|
||||
echo "Certificate already exists at $CERT_FILE"
|
||||
echo "Use --force to regenerate."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Generating self-signed SSL certificate for Dangerous Pi..."
|
||||
echo " Certificate: $CERT_FILE"
|
||||
echo " Private key: $KEY_FILE"
|
||||
echo " Validity: $DAYS_VALID days"
|
||||
echo ""
|
||||
|
||||
# Generate private key and certificate with SANs
|
||||
# Using EC P-256 for better performance on Raspberry Pi
|
||||
openssl req -x509 -nodes -days "$DAYS_VALID" \
|
||||
-newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
|
||||
-keyout "$KEY_FILE" \
|
||||
-out "$CERT_FILE" \
|
||||
-subj "$SUBJECT" \
|
||||
-addext "subjectAltName=$SANS" \
|
||||
-addext "basicConstraints=CA:FALSE" \
|
||||
-addext "keyUsage=digitalSignature,keyEncipherment" \
|
||||
-addext "extendedKeyUsage=serverAuth"
|
||||
|
||||
# Set secure permissions
|
||||
# Private key: owner read/write only
|
||||
chmod 600 "$KEY_FILE"
|
||||
# Certificate: world readable
|
||||
chmod 644 "$CERT_FILE"
|
||||
|
||||
# Set ownership to root
|
||||
if [ "$EUID" -eq 0 ]; then
|
||||
chown root:root "$KEY_FILE" "$CERT_FILE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "SSL certificate generated successfully!"
|
||||
echo ""
|
||||
echo "Certificate details:"
|
||||
openssl x509 -in "$CERT_FILE" -noout -subject -dates -ext subjectAltName 2>/dev/null || \
|
||||
openssl x509 -in "$CERT_FILE" -noout -subject -dates
|
||||
echo ""
|
||||
echo "To enable HTTPS, set HTTPS_ENABLED=true in /opt/dangerous-pi/.env"
|
||||
echo "Then restart the services: sudo systemctl restart dangerous-pi-nginx-config nginx"
|
||||
Reference in New Issue
Block a user