Assinar arquivo XML utilizando o certificado do e-CNPJ

10 respostas
A

Boa tarde. Estamos desenvolvendo uma aplicação para o e-Financeiro (http://sped.rfb.gov.br/pagina/show/1499). Uma destas etapas consiste em pegar o certificado do cartão e-cnpj e assinar um arquivo XML.
Estou utilizando o código abaixo:

for (int pos = 0; pos < qtde; pos++) {
                Element el = (Element) elements.item(pos);
                String id = el.getAttribute("id");

                Reference ref = signatureFactory.newReference("#" + id,
                        signatureFactory.newDigestMethod(DigestMethod.SHA1, null), transformList,
                        null, null);

                SignedInfo si = signatureFactory.newSignedInfo(signatureFactory.newCanonicalizationMethod(
                        CanonicalizationMethod.INCLUSIVE,
                        (C14NMethodParameterSpec) null), 
                        signatureFactory.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                        Collections.singletonList(ref));

                XMLSignature signature = signatureFactory.newXMLSignature(si, keyInfo);

                DOMSignContext dsc = new DOMSignContext(privateKey, el.getParentNode());

                signature.sign(dsc);
            }

Quando utilizo o método signature.sign(dsc) , aparece um janela para o preenchimento da senha (é implementação do próprio e-CNPJ. O arquivo é assinado, mas ao submeter a Receita o site indica que a assinatura está inválida. Como vi que algumas pessoas do fórum também estão desenvolvendo aplicações para o e-Financeira, eu estou pedindo alguma ajuda.
Muito obrigado.

10 Respostas

A

Boa tarde.
Eu continuo recebendo o erro MS0017 (Erro na assinatura) da receita. Comparando o meu hash com o exemplo da receita, vi uma diferença: o da receita tem uma linha e o meu hash é uma coluna de caracteres:

BgNVBAoTCklDUC1CcmFzaWwxNjA0BgNVBAsTLVNlY3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFs … (mais N caracteres)

BgNVBAoTCklDUC1CcmFzaWwxNjA0BgNVBAsTLVNlY3JldGFyaWEgZGEgUmVjZWl0YSBGZWRlcmFs
IGRvIEJyYXNpbCAtIFJGQjEZMBcGA1UEAxMQQUMgU0VSQVNBIFJGQiB2MjAeFw0xNDExMjcxMTM1
MDBaFw0xNzExMjYxMTM1MDBaMIHyMQswCQYDVQQGEwJCUjELMAkGA1UECBMCUkoxFzAVBgNVBAcT
DlJJTyBERSBKQU5FSVJPMRMwEQYDVQQKEwpJQ1AtQnJhc2lsMTYwNAYDVQQLEy1TZWNyZXRhcmlh
… (mais N caracteres)

Existe algum padrão ?

W

Olá,
Estou fazendo uma poc para o e-Financeira em .NET e tive o mesmo problema no retorno da receita. O meu problema estava relacionado ao ambiente de testes da Receita, quando enviamos um teste para produção o erro mudou, não foi mais a assinatura inválida.
Outro ponto que eu não vi no seu código é a conversão da assinatura para base64.
abs.

A

Obrigado, Wpascucci.
Estou validando meus arquivos pelo link de Upload Manual do SPED, trocando o atributo tpAmb para 2. Foi esse o teste que você fez ?
Com relação a Base64 outros desenvolvedores .NET me passaram essa dica, mas pelo que eu vi no java não precisaria fazer isso.

mirrah

Bom dia André,

se você remover as quebras de linha, funciona?

[]s

Rafael Oliveira

A

Bom dia, mirrah.
Mesmo removendo as quebras, continuo recebendo o erro MS0017.

A

Boa tarde.
Desde ontem o site da receita parou retornar os meus arquivos com o erro MS0017 (Assinatura inválida) e passou a retornar o erro MS1030 (Erro na estrutura da solicitação.The value of the ‘Algorithm’ attribute does not equal its fixed value). E eu não fiz alteração nenhuma. Tanto que eu peguei arquivos antigos e o tratamento do erro agora é diferente.
Percebi que os arquivos de retorno agora vem com o Algoritmo rsa-sha256 e não o rsa-sha1.
Vocês tiveram um problema parecido ?

W

Da uma olhada a receita mudou o algoritmo.

Prezados declarantes da e-Financeira,

No intuito de conferir segurança adicional da informação, o algoritmo de assinatura dos eventos da e-Financeira foi alterado para o SHA-2, em substituição ao SHA-1. A partir de 11/04/2016, só serão recebidos pelo sistema arquivos assinados utilizando o novo algoritmo. As orientações acerca do novo padrão estão publicadas na versão 1.0.2 do Manual de Preenchimento.

Atendendo a pedidos de alguns contribuintes, também será disponibilizado, na seção de Download (Projetos>>e-Financeira>>Download), um arquivo .zip contendo um exemplo de código em .NET para assinatura dos eventos, já contemplando a alteração do algoritmo para SHA-2. Trata-se de um insumo para desenvolvedores de TI, quando da elaboração de rotinas em seus sistemas próprios para assinatura dos eventos da e-Financeira. Ressaltamos que não será fornecido suporte nem realizada atualização ao código em questão, tendo em vista que se trata apenas de um exemplo para demonstrar a forma como devem ser assinados os arquivos enviados.

A

Obrigado, Wpascucci1. Provavelmente eles estavam mudando o ambiente de produção enquanto eu estava realizando os meus testes. E prova que não era só eu que estava com problemas na assinatura.
Você conseguiu enviar os arquivos pro ambiente de produção ?

W

Então cara eu mandei manualmente e o problema de assinatura inválida não ocorreu, deu um erro na estrutura do id, mas ai quando tentei mandar novamente eles mudaram o algoritmo e tomei o novo erro, agora estou estruturando para testar novamente.

A

O erro que vc recebeu foi usando o endereço https://efinanc.receita.fazenda.gov.br/WsEFinanceira/WsRecepcao.asmx ? Eu tive um problema de Id porque nesse endereço eles ainda estão usando a versão 1.0.0. No ambiente pre-prod já estão usando a versão 1.0.1

Criado 24 de março de 2016
Ultima resposta 15 de abr. de 2016
Respostas 10
Participantes 3