Ir para o conteúdo

Por que a extensão Anotae tem key MV3 fixa no manifest.json

TL;DR: a key é a chave pública RSA 2048 que torna o ID da extensão determinístico entre máquinas. Sem ela, cada Chrome dev geraria um ID aleatório, e o NMH não confiaria em ninguém. Não é credencial.


Problema

O Native Messaging Host (NMH) do Anotae só aceita mensagens de extensões cujos IDs estão em allowed_origins:

# anotae/nmh/manifest.py
ALLOWED_ORIGINS_CHROME = [
    CHROME_EXTENSION_ORIGIN,  # = chrome-extension://hfebcjlpbgegopcdllhannfmfihbnhcm/
]

Mas o ID de uma extensão Chrome carregada em modo dev é gerado aleatoriamente a cada instalação, baseado num hash do caminho local. Sem mecanismo, cada máquina teria um ID diferente — o NMH rejeitaria todas.

Solução: campo key MV3

O Manifest V3 do Chrome aceita um campo opcional "key" cujo valor é a chave pública RSA 2048 (formato SubjectPublicKeyInfo, base64). Quando presente:

extension_id = sha256(base64decode(manifest['key']))[:16].hex().translate("0..f"  "a..p")

O ID passa a ser determinístico: qualquer máquina que carregue a extensão com a mesma key obtém o mesmo ID.

Por que NÃO é credencial

  • A key é a parte pública de um par RSA. A privkey correspondente nunca é commitada e foi descartada após geração.
  • Saber a pubkey não permite assinar atualizações da extensão (isso requer a privkey).
  • Saber a pubkey não permite carregar uma extensão diferente com o mesmo ID (o Chrome valida hash do conteúdo).
  • O pior que alguém com a key pode fazer é calcular o ID determinístico — informação que já está pública em allowed_origins do NMH.

A privkey só será necessária se publicarmos na Chrome Web Store (para o release v1.0). Quando isso acontecer, geraremos um novo par dedicado (a key atual fica para uso dev) ou usaremos a key de upload da Web Store.

Como regenerar (se necessário)

python scripts/extension-keypair.py --regenerate

Isso: 1. Gera novo par RSA 2048 (privkey descartada) 2. Sobrescreve extension/chrome/manifest.json campo "key" 3. Reescreve anotae/core/extension_id.py com o novo ID 4. Imprime o novo ID

⚠️ Cuidado: mudar a key muda o ID. Toda extensão já instalada precisará ser carregada novamente, e todo NMH registrado precisará ser reinstalado.

Auditoria

# Verificar ID atual:
python scripts/extension-keypair.py
# → "Extension ID atual: hfebcjlpbgegopcdllhannfmfihbnhcm"

# Verificar que módulo Python e manifest estão sincronizados:
# Saída inclui "Módulo Python: sincronizado." se ok.

Referências