No more browser warnings! mkcert creates locally-trusted certs. Pi Setup: - Auto-install mkcert during setup - Generate trusted certs when HTTPS enabled - Copy CA to /static/ca/rootCA.pem for easy device setup - New devices can download CA via HTTP and install it Docker: - docker-entrypoint.sh checks for mkcert, falls back to openssl - Shows instructions for CA distribution to other devices Scripts: - Added setup-trusted-certs.sh helper for local dev - Installs mkcert, generates certs, shows device setup instructions To trust on new devices: 1. Download: http://stegasoo.local/static/ca/rootCA.pem 2. Install as trusted CA in browser/OS 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
150 lines
5.1 KiB
Bash
Executable File
150 lines
5.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Setup trusted HTTPS certificates for Stegasoo
|
|
# Uses mkcert to create browser-trusted certs (no warning screens!)
|
|
#
|
|
# Usage: ./setup-trusted-certs.sh [hostname]
|
|
#
|
|
# This script:
|
|
# 1. Installs mkcert if needed
|
|
# 2. Creates a local CA (one-time)
|
|
# 3. Generates certs for your hostname
|
|
# 4. Shows how to trust the CA on other devices
|
|
#
|
|
|
|
set -e
|
|
|
|
HOSTNAME="${1:-stegasoo.local}"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$SCRIPT_DIR/.."
|
|
CERT_DIR="$PROJECT_ROOT/frontends/web/certs"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
echo ""
|
|
echo -e "${CYAN}╔═══════════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${CYAN}║ Stegasoo Trusted Certificate Setup ║${NC}"
|
|
echo -e "${CYAN}╚═══════════════════════════════════════════════════════════════╝${NC}"
|
|
echo ""
|
|
|
|
# Check/install mkcert
|
|
install_mkcert() {
|
|
if command -v mkcert &> /dev/null; then
|
|
echo -e "${GREEN}✓${NC} mkcert already installed"
|
|
return
|
|
fi
|
|
|
|
echo -e "${YELLOW}Installing mkcert...${NC}"
|
|
|
|
# Detect OS and install
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
# macOS
|
|
if command -v brew &> /dev/null; then
|
|
brew install mkcert
|
|
else
|
|
echo -e "${RED}Please install Homebrew first: https://brew.sh${NC}"
|
|
exit 1
|
|
fi
|
|
elif [[ -f /etc/debian_version ]]; then
|
|
# Debian/Ubuntu/Raspberry Pi OS
|
|
sudo apt-get update
|
|
sudo apt-get install -y libnss3-tools
|
|
|
|
# Download mkcert binary
|
|
ARCH=$(dpkg --print-architecture)
|
|
if [[ "$ARCH" == "arm64" ]] || [[ "$ARCH" == "aarch64" ]]; then
|
|
MKCERT_URL="https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-linux-arm64"
|
|
else
|
|
MKCERT_URL="https://github.com/FiloSottile/mkcert/releases/latest/download/mkcert-linux-amd64"
|
|
fi
|
|
|
|
sudo curl -L "$MKCERT_URL" -o /usr/local/bin/mkcert
|
|
sudo chmod +x /usr/local/bin/mkcert
|
|
elif [[ -f /etc/arch-release ]]; then
|
|
# Arch Linux
|
|
sudo pacman -S mkcert
|
|
else
|
|
echo -e "${RED}Unsupported OS. Please install mkcert manually:${NC}"
|
|
echo " https://github.com/FiloSottile/mkcert#installation"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}✓${NC} mkcert installed"
|
|
}
|
|
|
|
# Install local CA
|
|
setup_ca() {
|
|
echo ""
|
|
echo -e "${CYAN}Setting up local Certificate Authority...${NC}"
|
|
|
|
if mkcert -install 2>/dev/null; then
|
|
echo -e "${GREEN}✓${NC} Local CA installed in system trust store"
|
|
else
|
|
echo -e "${YELLOW}!${NC} Could not auto-install CA (may need manual browser import)"
|
|
fi
|
|
}
|
|
|
|
# Generate certificates
|
|
generate_certs() {
|
|
echo ""
|
|
echo -e "${CYAN}Generating trusted certificate for: ${YELLOW}$HOSTNAME${NC}"
|
|
|
|
mkdir -p "$CERT_DIR"
|
|
cd "$CERT_DIR"
|
|
|
|
# Generate cert for hostname + common local names
|
|
mkcert -key-file key.pem -cert-file cert.pem \
|
|
"$HOSTNAME" \
|
|
localhost \
|
|
127.0.0.1 \
|
|
::1
|
|
|
|
echo -e "${GREEN}✓${NC} Certificates generated in: $CERT_DIR"
|
|
}
|
|
|
|
# Show CA location for other devices
|
|
show_ca_info() {
|
|
CA_ROOT=$(mkcert -CAROOT)
|
|
CA_FILE="$CA_ROOT/rootCA.pem"
|
|
|
|
echo ""
|
|
echo -e "${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} Setup Complete!${NC}"
|
|
echo -e "${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo "Your certificates are ready. Browsers on THIS machine will trust them."
|
|
echo ""
|
|
echo -e "${YELLOW}To trust on OTHER devices (phones, tablets, other computers):${NC}"
|
|
echo ""
|
|
echo " 1. Copy the CA certificate to that device:"
|
|
echo -e " ${CYAN}$CA_FILE${NC}"
|
|
echo ""
|
|
echo " 2. Import it as a trusted CA:"
|
|
echo " - iOS: AirDrop/email the file, Settings > Profile Downloaded > Install"
|
|
echo " - Android: Settings > Security > Install from storage"
|
|
echo " - Windows: Double-click > Install > Trusted Root CAs"
|
|
echo " - macOS: Double-click > Keychain Access > Trust Always"
|
|
echo " - Linux: Copy to /usr/local/share/ca-certificates/ && update-ca-certificates"
|
|
echo ""
|
|
echo -e "${YELLOW}Quick copy command:${NC}"
|
|
echo " scp $CA_FILE user@device:/path/"
|
|
echo ""
|
|
|
|
# Offer to serve CA file via HTTP for easy phone download
|
|
echo -e "${YELLOW}Or serve the CA for easy phone download:${NC}"
|
|
echo " python3 -m http.server 8080 -d $CA_ROOT"
|
|
echo " Then visit: http://$(hostname -I | awk '{print $1}'):8080/rootCA.pem"
|
|
echo ""
|
|
}
|
|
|
|
# Main
|
|
install_mkcert
|
|
setup_ca
|
|
generate_certs
|
|
show_ca_info
|