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:
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
keypode fazer é calcular o ID determinístico — informação que já está pública emallowed_originsdo 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)¶
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.