Files
ca-archive/scripts/generate-keys.sh
2026-02-08 23:35:53 +01:00

204 líneas
5.8 KiB
Bash
Archivo Ejecutable

#!/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 ""