ADR-006 · Certificado do mTLS conferido no cadastro, com go-pkcs12
Status: Aceita · Data: 29/10/2026
Contexto
Seção intitulada “Contexto”Os bancos entregam o certificado do mTLS como .p12 com senha (Efí, Inter) ou como PEM. Até aqui o Lastro guardava o arquivo como bytes, sem ler. Senha errada, arquivo corrompido ou certificado vencido entravam sem erro e só apareciam quando o banco recusasse a primeira chamada. Além disso, a validade ficava dentro do blob cifrado, e sem ela não existe alerta de vencimento (RN-62).
A stdlib do Go lê PEM, mas não lê PKCS#12. O golang.org/x/crypto/pkcs12 está
congelado e marcado como deprecated. Ele não lê os .p12 com AES, que são o
padrão do OpenSSL 3 e de quem exporta certificado hoje.
Decisão
Seção intitulada “Decisão”- O certificado é lido no cadastro, em
app.Contas.Criar, que é o único caminho da CLI e da API. O Lastro recusa arquivo ilegível, senha errada, chave que não corresponde ao certificado e certificado vencido. Nenhuma mensagem traz o conteúdo do arquivo. - A leitura do .p12 usa
software.sslmate.com/src/go-pkcs12(BSD-3, mantida, lê os formatos com AES e os antigos com RC2/3DES). A leitura do PEM usa a stdlib. Isso fica eminternal/platform/certificado. Oappchega lá pelo portports.Certificados, porqueappnão importaplatform. - Os dados públicos ficam fora do blob cifrado, em colunas da conta: sujeito,
impressão digital SHA-256 e validade. O certificado e a chave privada continuam
só no blob (RN-61). A validade vai em segundos Unix, porque certificado pode
valer até 9999-12-31 (RFC 5280), além do que cabe em nanossegundos
int64. - Chave PEM cifrada é recusada com orientação (exportar sem senha ou usar o .p12), em vez de suportar o formato legado de PEM cifrado.
Consequências
Seção intitulada “Consequências”- ➕ Certificado errado aparece no cadastro, com o motivo, e não na primeira cobrança.
- ➕ Alerta de vencimento (#72) e regra de ambiente (#73) usam os dados públicos sem decifrar nada.
- ➕ A impressão digital deixa conferir, sem expor o certificado, qual arquivo está em cada conta.
- ➖ Uma dependência externa a mais no caminho de segredo. É pequena, só depende de
golang.org/x/cryptoe é auditável. - ➖ Sujeito e validade ficam em claro no banco. São dados públicos de qualquer certificado, mas dizem com qual banco a instância trabalha.