# Decisao Final: Certificados e Senhas

Data: 20/07/2026

## Decisao

Na versao final, o banco novo do motor vai armazenar:

- certificado A1 `.pfx` criptografado;
- senha do `.pfx` criptografada;
- metadados do certificado;
- vinculo com o municipio/tenant.

A chave mestra usada para descriptografar certificado e senha fica fora do banco.

## Onde fica cada coisa

```text
Banco:
  nfse_certificados.certificado_criptografado
  nfse_certificados.senha_criptografada
  nfse_certificados.certificado_sha256
  nfse_certificados.certificado_nome_original
  nfse_certificados.subject_name
  nfse_certificados.documento_federal
  nfse_certificados.valido_ate

Fora do banco:
  NFSE_MASTER_KEY
```

## Por que assim

Vantagens:

- backup do banco leva configuracao completa dos tenants;
- nao precisa sincronizar arquivos `.pfx` em disco entre servidores;
- facilita multitenant;
- reduz erro operacional de caminho/permissao de arquivo;
- cada certificado continua vinculado ao municipio correto.

Condicao de seguranca:

- a chave mestra nunca pode ficar no mesmo banco;
- acesso ao banco sozinho nao deve permitir abrir os certificados;
- acesso a banco + `NFSE_MASTER_KEY` deve ser tratado como acesso sensivel total.

## Modelo da tabela

Campos principais em `nfse_certificados`:

```text
storage_tipo=db_encrypted
certificado_criptografado=LONGBLOB
certificado_crypto_alg=AES-256-GCM
certificado_key_id=NFSE_MASTER_KEY
certificado_sha256=hash do PFX original
certificado_nome_original=nome do arquivo recebido
senha_criptografada=senha do PFX criptografada
senha_crypto_alg=AES-256-GCM
senha_key_id=NFSE_MASTER_KEY
```

O campo `arquivo_path` fica apenas para desenvolvimento, migracao ou emergencia operacional. Em producao, o padrao deve ser `storage_tipo=db_encrypted`.

## Fluxo final

Cadastro:

```text
1. usuario/operador informa municipio, PFX e senha;
2. sistema valida se o PFX abre;
3. sistema extrai metadados do certificado;
4. sistema calcula SHA-256 do PFX original;
5. sistema criptografa o PFX com NFSE_MASTER_KEY;
6. sistema criptografa a senha com NFSE_MASTER_KEY;
7. sistema grava tudo em nfse_certificados;
8. sistema garante as tabelas fisicas do municipio.
```

Consumo:

```text
1. worker busca municipio/certificado ativo;
2. garante tabelas do codigo IBGE;
3. le certificado_criptografado;
4. descriptografa PFX em memoria;
5. le senha_criptografada;
6. descriptografa senha em memoria;
7. abre certificado;
8. consulta ADN;
9. grava nas tabelas do municipio;
10. atualiza last_nsu.
```

## Chave mestra

Inicialmente:

```text
NFSE_MASTER_KEY=base64-de-32-bytes
```

No futuro, se o cliente tiver estrutura:

- Vault;
- KMS;
- HSM;
- secret manager.

## Rotacao

Rotacao de certificado:

- inserir novo registro em `nfse_certificados`;
- marcar antigo como `ativo=0`;
- manter historico para auditoria.

Rotacao de chave mestra:

- criar nova chave;
- descriptografar PFX/senhas com a chave antiga;
- criptografar novamente com a nova chave;
- atualizar `certificado_key_id` e `senha_key_id`.
