203
scripts/generate-keys.sh
Archivo ejecutable
203
scripts/generate-keys.sh
Archivo ejecutable
@@ -0,0 +1,203 @@
|
||||
#!/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 ""
|
||||
Referencia en una nueva incidencia
Block a user