#!/bin/bash # Script para generar claves de firma para extensiones # Classic Add-ons Archive v3.0 set -e echo "==================================================" echo " Generador de Claves de Firma" echo "==================================================" echo "" # Colores GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' KEYS_DIR="private-keys" CHROME_KEY="$KEYS_DIR/chrome-extension.pem" FIREFOX_JWT="$KEYS_DIR/firefox-amo-credentials.json" # Crear directorio de claves si no existe if [ ! -d "$KEYS_DIR" ]; then mkdir -p "$KEYS_DIR" echo -e "${GREEN}✓${NC} Directorio de claves creado: $KEYS_DIR/" fi # Generar clave privada para Chrome echo "" echo "Generando clave privada para Chrome..." if [ -f "$CHROME_KEY" ]; then echo -e "${YELLOW}⚠${NC} La clave de Chrome ya existe: $CHROME_KEY" read -p "¿Deseas regenerarla? (s/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Ss]$ ]]; then echo "Manteniendo clave existente" else openssl genrsa -out "$CHROME_KEY" 2048 echo -e "${GREEN}✓${NC} Clave de Chrome regenerada" fi else openssl genrsa -out "$CHROME_KEY" 2048 echo -e "${GREEN}✓${NC} Clave de Chrome generada: $CHROME_KEY" fi # Generar ID de extensión de Chrome desde la clave if [ -f "$CHROME_KEY" ]; then echo "" echo "Calculando Extension ID de Chrome..." # Extraer la clave pública en formato DER y calcular ID # Alternativa sin xxd: usar od + awk openssl rsa -in "$CHROME_KEY" -pubout -outform DER 2>/dev/null | \ openssl dgst -sha256 -binary | \ head -c 16 | \ od -An -tx1 | \ tr -d ' \n' | \ tr '0-9a-f' 'a-p' > "$KEYS_DIR/chrome-extension-id.txt" CHROME_ID=$(cat "$KEYS_DIR/chrome-extension-id.txt") echo -e "${GREEN}✓${NC} Extension ID: $CHROME_ID" echo " (Guardado en: $KEYS_DIR/chrome-extension-id.txt)" fi # Generar hash de la clave para verificación if [ -f "$CHROME_KEY" ]; then KEY_HASH=$(sha256sum "$CHROME_KEY" | cut -d' ' -f1) echo "$KEY_HASH" > "$KEYS_DIR/chrome-key-hash.txt" echo -e "${GREEN}✓${NC} Hash de verificación guardado" fi # Información sobre credenciales de Firefox echo "" echo "==================================================" echo " Credenciales de Firefox (AMO)" echo "==================================================" echo "" echo "Para firmar extensiones de Firefox necesitas credenciales de AMO:" echo "" echo "1. Ve a: https://addons.mozilla.org/developers/addon/api/key/" echo "2. Genera un nuevo par de credenciales (JWT issuer y secret)" echo "3. Guarda las credenciales en: $FIREFOX_JWT" echo "" if [ ! -f "$FIREFOX_JWT" ]; then echo "Plantilla de credenciales de Firefox:" cat > "$FIREFOX_JWT" << 'EOF' { "web-ext": { "sign": { "apiKey": "user:12345678:123", "apiSecret": "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", "channel": "unlisted" } } } EOF echo -e "${YELLOW}⚠${NC} Archivo de plantilla creado: $FIREFOX_JWT" echo -e "${YELLOW}⚠${NC} EDITA este archivo con tus credenciales reales de AMO" echo "" echo "Nota: El ID de la extensión se lee automáticamente de manifest.json" else echo -e "${GREEN}✓${NC} Archivo de credenciales encontrado: $FIREFOX_JWT" fi # Crear archivo .gitignore para el directorio de claves cat > "$KEYS_DIR/.gitignore" << 'EOF' # Ignorar todas las claves privadas *.pem *.key *.p12 *.pfx *-credentials.json *-hash.txt # Permitir README !README.md EOF echo -e "${GREEN}✓${NC} Archivo .gitignore creado en $KEYS_DIR/" # Crear README en el directorio de claves cat > "$KEYS_DIR/README.md" << 'EOF' # Claves Privadas de Firma Este directorio contiene las claves privadas para firmar las extensiones. ## ⚠️ IMPORTANTE: Seguridad - **NUNCA** subas estas claves a repositorios públicos - **NUNCA** compartas estas claves con nadie - Haz backup de estas claves en un lugar seguro - Si pierdes las claves, perderás el ID de la extensión de Chrome ## Archivos ### Chrome - `chrome-extension.pem` - Clave privada RSA 2048-bit - `chrome-extension-id.txt` - ID de la extensión derivado de la clave - `chrome-key-hash.txt` - Hash SHA256 para verificación ### Firefox - `firefox-amo-credentials.json` - Credenciales de API de AMO (addons.mozilla.org) ## Uso Las claves se usan automáticamente por los scripts de build: ```bash ./build.sh --sign # Firma ambas versiones ./build.sh --sign-chrome # Solo Chrome ./build.sh --sign-firefox # Solo Firefox ``` ## Regenerar claves ```bash cd scripts ./generate-keys.sh ``` **Nota:** Regenerar la clave de Chrome cambiará el ID de la extensión. ## Obtener credenciales de Firefox 1. Inicia sesión en https://addons.mozilla.org 2. Ve a: https://addons.mozilla.org/developers/addon/api/key/ 3. Genera credenciales JWT 4. Copia API Key (issuer) y API Secret 5. Actualiza `firefox-amo-credentials.json` EOF echo -e "${GREEN}✓${NC} README creado en $KEYS_DIR/" # Proteger permisos de archivos sensibles chmod 600 "$CHROME_KEY" 2>/dev/null || true chmod 600 "$FIREFOX_JWT" 2>/dev/null || true chmod 700 "$KEYS_DIR" echo "" echo "==================================================" echo " ✨ Claves generadas exitosamente" echo "==================================================" echo "" echo "Archivos creados:" echo " - $CHROME_KEY (clave privada Chrome)" echo " - $KEYS_DIR/chrome-extension-id.txt (ID de extensión)" echo " - $KEYS_DIR/chrome-key-hash.txt (hash de verificación)" echo " - $FIREFOX_JWT (plantilla de credenciales)" echo "" echo "Próximos pasos:" echo "" echo " 1. BACKUP: Guarda $CHROME_KEY en un lugar seguro" echo "" echo " 2. Configura Firefox AMO:" echo " - Edita: $FIREFOX_JWT" echo " - Agrega tus credenciales de AMO" echo "" echo " 3. Firma extensiones:" echo " ./build.sh --sign" echo "" echo "==================================================" echo ""