Assinatura Inválida na Recepção de Lotes

285 views
Skip to first unread message

BITFIN Tecnologia

unread,
Mar 18, 2025, 6:23:42 AM3/18/25
to wsnfsecampinas
Tenho vinho que muitos de vocês já estão emitindo normalmente a NFSe. Estamos neste momento fazendo uma nova implementação e estamos esbarrando na mensagem de assinatura inválida: Arquivo enviado com erro na assinatura. / Acerte a assinatura do arquivo.

De acordo com as mensagens deste grupo, assinatura tem algumas condições: ora assina o elemento InfDeclaracaoPrestacaoServico, ora assina o LoteRps. Há exemplos de XML em que ambos os elementos estão assinados. De qualquer forma, ao postar a mensagem, a informação de erro sempre é a mesma. Vocês que já passaram por essa etapa, poderiam compartilhar alguma dica que possa nos ajudar neste entendimento?

Tecnologicamente falando, utilizamos C# com o SignedXml, mas acredito que isso não seja um problema, já que a parametrização dos algoritmos de hash e canonicalization estão de acordo com o manual.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:nfse="http://nfse.abrasf.org.br">
<soapenv:Header/>
<soapenv:Body>
<nfse:RecepcionarLoteRpsSincrono xmlns:nfse="http://nfse.abrasf.org.br">
<EnviarLoteRpsSincronoEnvio>
<LoteRps Id="lote1"
 versao="2.03">
<NumeroLote>1</NumeroLote>
<CpfCnpj>
<Cnpj>00000000000000</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>000000000</InscricaoMunicipal>
<QuantidadeRps>1</QuantidadeRps>
<ListaRps>
<Rps>
<InfDeclaracaoPrestacaoServico Id="rps1">
<Rps Id="1">
<IdentificacaoRps>
<Numero>1</Numero>
<Serie>1</Serie>
<Tipo>1</Tipo>
</IdentificacaoRps>
<DataEmissao>2025-03-18</DataEmissao>
<Status>1</Status>
</Rps>
<Competencia>2025-03-18</Competencia>
<Servico>
<Valores>
<ValorServicos>10.00</ValorServicos>
</Valores>
<IssRetido>2</IssRetido>
<ItemListaServico>1.0</ItemListaServico>
<CodigoCnae>620910001</CodigoCnae>
<Discriminacao>Servicos Prestados</Discriminacao>
<CodigoMunicipio>1</CodigoMunicipio>
<ExigibilidadeISS>1</ExigibilidadeISS>
<MunicipioIncidencia>1</MunicipioIncidencia>
</Servico>
<Prestador>
<CpfCnpj>
<Cnpj>00000000000000</Cnpj>
</CpfCnpj>
<InscricaoMunicipal>000000000</InscricaoMunicipal>
</Prestador>
<Tomador>
<IdentificacaoTomador>
<CpfCnpj>
<Cpf>00000000000</Cpf>
</CpfCnpj>
</IdentificacaoTomador>
<RazaoSocial>Fulano de Tal</RazaoSocial>
<Endereco>
<Endereco>Avenida Frank</Endereco>
<Numero>11</Numero>
<Bairro>Cachoeira</Bairro>
<CodigoMunicipio>2</CodigoMunicipio>
<Uf>SP</Uf>
<Cep>13280460</Cep>
</Endereco>
</Tomador>
<OptanteSimplesNacional>2</OptanteSimplesNacional>
<IncentivoFiscal>2</IncentivoFiscal>
</InfDeclaracaoPrestacaoServico>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</Signature>
</Rps>
</ListaRps>
</LoteRps>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
</Signature>
</EnviarLoteRpsSincronoEnvio>
</nfse:RecepcionarLoteRpsSincrono>
</soapenv:Body>
</soapenv:Envelope>

Tiago Carvalho

unread,
Mar 18, 2025, 7:29:22 AM3/18/25
to wsnfsecampinas
Bom dia.

Neste caso, acredito que você precisa assinar apenas o lote com referência ao ID do lote. A assinatura que está dentro do RPS não é necessária, segundo o exemplo disponível.

Também utilizo C# (.NET 6) e a classe SignedXML, e estou enfrentando problemas para assinar estes XMLs. Já tentei assinar apenas o nó, o XML inteiro, referenciar, não referenciar, e sempre acontece o mesmo erro.

Pelo que verifiquei aqui no grupo, tem mais pessoas utilizando C# e com o mesmo problema. Seria bacana quem mais teve problema relatar aqui e verificarmos estas assinaturas juntos.

E se possível, quem também quem está conseguindo assinar sem problemas, mesmo que não seja em C#, conseguir nos explicar como a assinatura é realizada, pode nos dar uma ideia do que pode estar errado.

BITFIN Tecnologia

unread,
Mar 18, 2025, 7:36:10 AM3/18/25
to wsnfsecampinas
Exato Tiago. Tenho visto isso em diversos exemplos. De qualquer forma, independente do que se faça, o problema é sempre o mesmo.

BITFIN Tecnologia

unread,
Mar 18, 2025, 7:37:33 AM3/18/25
to wsnfsecampinas
E para complementar, mesmo que omita o certificado (na requisição HTTP), o erro sempre persiste; imaginei que aqui haveria um 401, mas a mensagem é a mesma, ficando difícil diagnosticar o problema.

Tiago Carvalho

unread,
Mar 18, 2025, 7:45:22 AM3/18/25
to wsnfsecampinas
Aqui também ocorre a mesma coisa.

E o mais estranho é que se você informa no XML um CNPJ e Inscrição Municipal diferente do certificado que você está usando para assinatura, a mensagem de erro é diferente, informando que você está tentando acessar dados de outro usuário. Ou seja, de alguma maneira, ele reconhece o certificado e consegue comparar com as informações do conteúdo do XML. O problema é essa validação de assinatura.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>Erro na autenticação. / O usuário correspondente ao documento utilizado para autenticação não possui autorização para realizar o serviço para a empresa parametrizada via CNPJ e inscrição municipal do arquivo.</faultstring>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

Renan William Alves de Paula

unread,
Mar 18, 2025, 8:08:37 AM3/18/25
to wsnfsecampinas
Pessoal,

Tive bastante problema no começo com a assinatura pois eu aplicava "pretty-printer" depois de assinado, para deixar o XML formatado para os logs.
Isso inseria espaços / caracteres a mais, o que invalidava a assinatura. Se eu assinasse o XML "compactado" funcionava sem problemas. 

Vejam se o XML não está sendo formatado na saída por padrão. Lembrando que eu criei um repositório só de exemplos:

BITFIN Tecnologia

unread,
Mar 18, 2025, 12:17:37 PM3/18/25
to wsnfsecampinas
Obrigado pelo feedback William. 

Já tinha chegado no seu Github com os exemplos, e lado a lado, me parece ok. A codifição pode ser sim um problema, mas a própria string assinada é encaminhada via HTTP, apenas envolvendo no envelope SOAP. Vou continuar investigando e reporto aqui e houver algum evolução.

Tiago Carvalho

unread,
Mar 18, 2025, 12:33:08 PM3/18/25
to wsnfsecampinas
Valeu mesmo Renan!

Com o XML assinado compactado, através do Postman já consigo realizar as consultas.

Agora vou verificar como colocar ele no envelope SOAP aqui no C# de uma maneira que não perca a formatação compactada.

luciano

unread,
Mar 18, 2025, 3:05:34 PM3/18/25
to wsnfsecampinas
Estou com esse mesmo problema de assinatura no C# também, mas o engraçado é que para ambiente de Homologação não dá p erro.
Alguém já conseguiu resolver isso?

Em terça-feira, 18 de março de 2025 às 08:45:22 UTC-3, tiago.c...@senhorcontabil.com.br escreveu:
Message has been deleted

BITFIN Tecnologia

unread,
Mar 18, 2025, 6:38:47 PM3/18/25
to wsnfsecampinas
Conseguimos fazer a assinatura com sucesso. Considerem o XML abaixo que utilizamos para recepção dos lotes:

<nfse:RecepcionarLoteRpsSincrono>
    <EnviarLoteRpsSincronoEnvio>
        <LoteRps>
            ....
        </LoteRps>
    </EnviarLoteRpsSincronoEnvio>
</nfse:RecepcionarLoteRpsSincrono>

Notem que o nó raiz (<nfse:RecepcionarLoteRpsSincrono/>) não deve ser considerado durante o processo de assinatura digital. Lendo o manual de integração, ele corresponde ao "cabeçalho" que é mencionado lá. Sendo assim, apenas o conteúdo do elemento EnviarLoteRpsSincronoEnvio (incluindo sua tag de abertura e fechamento) deve ser submetido para assinatura digital. Esse elemento pode ser apenas colocado no envelope SOAP, algo mais ou menos como:

<soap><nfse:EnviarLoteRpsSincronoEnvio>{0}</nfse:EnviarLoteRpsSincronoEnvio></soap>

... onde o placeholder {0} deve ser substituído pelo conteúdo da tag  EnviarLoteRpsSincronoEnvio   assinado de acordo com a documentação (LoteRps ou InfDeclaracaoPrestacaoServico).
Reply all
Reply to author
Forward
0 new messages