fix(sefaz): cache de certificado entregava o array que o consumidor a… - #34
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…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
LoadPkcs12recebia 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
tryCertificado ilegível é falha esperada e precisa virar
Result. Fora dotry, 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
LoadPkcs12recebia 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
tryCertificado ilegível é falha esperada e precisa virar
Result. Fora dotry, 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.