Skip to content

fix(sefaz): cache de certificado entregava o array que o consumidor a… - #34

Merged
net0well merged 1 commit into
mainfrom
fix/cache-de-certificado-zerava-o-pfx
Jul 29, 2026
Merged

net0well merged 1 commit into
mainfrom
fix/cache-de-certificado-zerava-o-pfx

Conversation

@net0well

Copy link
Copy Markdown
Owner

…pagava

O serviço fiscal zera o material do certificado num finally, a cada chamada à SEFAZ. Enquanto cada chamada baixava o arquivo do cofre outra vez, ela zerava um array só seu e a limpeza era inofensiva.

Com o cache por execução servindo a instância guardada, a primeira das vinte chamadas encadeadas destruía o material das dezenove seguintes. A partir do segundo lote o LoadPkcs12 recebia zeros e falhava com "ASN1 corrupted data" — classe universal 0 onde se espera 16, que é o decodificador dizendo que o primeiro byte é 0x00 em vez do 0x30 que abre todo DER.

A captura ficou doze horas parada. Empresa sem novidade fazia uma chamada só e passava; empresa com documentos encadeava lotes e morria na segunda — o que fez o defeito parecer intermitente e mandou a investigação atrás de concorrência.

O cache passa a entregar cópia. Custa alguns kilobytes por chamada e torna o defeito impossível sem depender de nenhum consumidor saber que o array é compartilhado: o serviço fiscal limpa a cópia dele, o cache limpa o original no fim da execução.

O LoadPkcs12 passa para dentro do try

Certificado ilegível é falha esperada e precisa virar Result. Fora do try, virava exceção: o Hangfire apagava o trabalho por esgotar as tentativas — que são zero na captura, de propósito — e nada era gravado no histórico de execuções. Doze horas sem uma linha que explicasse o motivo, e nada em "Failed" no painel.

Testes

Ficam também os três que descartaram hipóteses — carga repetida do mesmo array, senha errada e concorrência —, dois deles rodados em Linux, que é onde o carregador usa OpenSSL. Senha errada produz mensagem própria, então "ASN1 corrupted data" não volta a ser confundido com credencial.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
fix(sefaz): cache de certificado entregava o array que o consumidor apagava

O serviço fiscal zera o material do certificado num finally, a cada chamada à SEFAZ. Enquanto cada chamada baixava o arquivo do cofre outra vez, ela zerava um array só seu e a limpeza era inofensiva.

Com o cache por execução servindo a instância guardada, a primeira das vinte chamadas encadeadas destruía o material das dezenove seguintes. A partir do segundo lote o LoadPkcs12 recebia zeros e falhava com "ASN1 corrupted data" — classe universal 0 onde se espera 16, que é o decodificador dizendo que o primeiro byte é 0x00 em vez do 0x30 que abre todo DER.

A captura ficou doze horas parada. Empresa sem novidade fazia uma chamada só e passava; empresa com documentos encadeava lotes e morria na segunda — o que fez o defeito parecer intermitente e mandou a investigação atrás de concorrência.

O cache passa a entregar cópia. Custa alguns kilobytes por chamada e torna o defeito impossível sem depender de nenhum consumidor saber que o array é compartilhado: o serviço fiscal limpa a cópia dele, o cache limpa o original no fim da execução.

O LoadPkcs12 passa para dentro do try

Certificado ilegível é falha esperada e precisa virar Result. Fora do try, virava exceção: o Hangfire apagava o trabalho por esgotar as tentativas — que são zero na captura, de propósito — e nada era gravado no histórico de execuções. Doze horas sem uma linha que explicasse o motivo, e nada em "Failed" no painel.

Testes

O de regressão reproduz a sequência de produção: vinte cargas, zerando entre cada uma. Ficam também os três que descartaram hipóteses — carga repetida do mesmo array, senha errada e concorrência —, dois deles rodados em Linux, que é onde o carregador usa OpenSSL. Senha errada produz mensagem própria, então "ASN1 corrupted data" não volta a ser confundido com credencial.

…pagava

O serviço fiscal zera o material do certificado num `finally`, a cada chamada à SEFAZ.
Enquanto cada chamada baixava o arquivo do cofre outra vez, ela zerava um array só seu e a
limpeza era inofensiva.

Com o cache por execução servindo a instância guardada, a primeira das vinte chamadas
encadeadas destruía o material das dezenove seguintes. A partir do segundo lote o
`LoadPkcs12` recebia zeros e falhava com "ASN1 corrupted data" — classe universal 0 onde se
espera 16, que é o decodificador dizendo que o primeiro byte é 0x00 em vez do 0x30 que abre
todo DER.

A captura ficou doze horas parada. Empresa sem novidade fazia uma chamada só e passava;
empresa com documentos encadeava lotes e morria na segunda — o que fez o defeito parecer
intermitente e mandou a investigação atrás de concorrência.

O cache passa a entregar cópia. Custa alguns kilobytes por chamada e torna o defeito
impossível sem depender de nenhum consumidor saber que o array é compartilhado: o serviço
fiscal limpa a cópia dele, o cache limpa o original no fim da execução.

O LoadPkcs12 passa para dentro do `try`

Certificado ilegível é falha esperada e precisa virar `Result`. Fora do `try`, virava
exceção: o Hangfire apagava o trabalho por esgotar as tentativas — que são zero na captura,
de propósito — e nada era gravado no histórico de execuções. Doze horas sem uma linha que
explicasse o motivo, e nada em "Failed" no painel.

Testes

Ficam também os três que descartaram hipóteses — carga repetida do mesmo array, senha
errada e concorrência —, dois deles rodados em Linux, que é onde o carregador usa OpenSSL.
Senha errada produz mensagem própria, então "ASN1 corrupted data" não volta a ser confundido
com credencial.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(sefaz): cache de certificado entregava o array que o consumidor apagava

O serviço fiscal zera o material do certificado num `finally`, a cada chamada à SEFAZ.
Enquanto cada chamada baixava o arquivo do cofre outra vez, ela zerava um array só seu e a
limpeza era inofensiva.

Com o cache por execução servindo a instância guardada, a primeira das vinte chamadas
encadeadas destruía o material das dezenove seguintes. A partir do segundo lote o
`LoadPkcs12` recebia zeros e falhava com "ASN1 corrupted data" — classe universal 0 onde se
espera 16, que é o decodificador dizendo que o primeiro byte é 0x00 em vez do 0x30 que abre
todo DER.

A captura ficou doze horas parada. Empresa sem novidade fazia uma chamada só e passava;
empresa com documentos encadeava lotes e morria na segunda — o que fez o defeito parecer
intermitente e mandou a investigação atrás de concorrência.

O cache passa a entregar cópia. Custa alguns kilobytes por chamada e torna o defeito
impossível sem depender de nenhum consumidor saber que o array é compartilhado: o serviço
fiscal limpa a cópia dele, o cache limpa o original no fim da execução.

O LoadPkcs12 passa para dentro do `try`

Certificado ilegível é falha esperada e precisa virar `Result`. Fora do `try`, virava
exceção: o Hangfire apagava o trabalho por esgotar as tentativas — que são zero na captura,
de propósito — e nada era gravado no histórico de execuções. Doze horas sem uma linha que
explicasse o motivo, e nada em "Failed" no painel.

Testes

O de regressão reproduz a sequência de produção: vinte cargas, zerando entre cada uma.
Ficam também os três que descartaram hipóteses — carga repetida do mesmo array, senha
errada e concorrência —, dois deles rodados em Linux, que é onde o carregador usa OpenSSL.
Senha errada produz mensagem própria, então "ASN1 corrupted data" não volta a ser confundido
com credencial.
@net0well
net0well merged commit dfcd75b into main Jul 29, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant