Estou com o seguinte problema :
Tenho que assinar cada RPS e o Lote todo que vou mandar para o WEB Service da Prefeitura de Altamira. Eu faco isso da seguinte forma:
-
Primeiro dou Marschal no Objeto contendo os Rps`s que serão convertidos em Nota Fiscal Eletronica (gera o arquivo EnviarLoteRpsEnvio.xml em anexo) :
contextM = JAXBContext.newInstance(EnviarLoteRpsEnvio.class); Marshaller marshallerEnvio = contextM.createMarshaller(); marshallerEnvio.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE); marshallerEnvio.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); File enviarLoteRpsEnvio = new File("EnviarLoteRpsEnvio.xml"); marshallerEnvio.marshal(loteEnvioRps, enviarLoteRpsEnvio);
-
Depois chamo o metodo que assina cada RPS do lote e gera o Arquivo RpsAssinado.xml, em anexo:
Assinador.assinarInfRps(“senhaKeyStore”, “ArqKeyStore”, “EnviarLoteRpsEnvio.xml”, “RpsAssinado.xml”);
Trecho do RpsAssinado.xml:
…
esxNQ3xXnwvXVChdfNifEegC8ho=
… -
Depois chamo metodo que assina o Lote e gera o Arquivo LoteRpsAssinado.xml:
Assinador.assinarLote(“senhaKeyStore”, “ArqKeyStore”, “RpsAssinado.xml”, “LoteRpsAssinado.xml”);
Trecho do LoteRpsAssinado.xml:
…
hD08vv96lmjqLCC8D7LmThx98OE=
… -
Depois chamao o metodo que validada se o arquivo foi corretamente assinado digitalmente. O resultado para este procedimento retorna true, ou seja, o xml foi assinado coreetamente.:
Assinador.validarAssinatura(“LoteRpsAssinado.xml”, “ArqKeyStore”, “senhaKeyStore”); -
Apos a verificão da validação do Arquivo LoteRpsAssinado.xml é realizao UnMarshaller dele, coforme comando abaixo:
File enviarLoteRpsAssinado = new File(“LoteRpsAssinado.xml”);
EnviarLoteRpsEnvio loteEnvioRps = (EnviarLoteRpsEnvio) unMarshallerEnvio.unmarshal( new StreamSource(enviarLoteRpsAssinado), EnviarLoteRpsEnvio.class ).getValue(); -
e depois enviado para o webService
WSNfsdV001 servico = new WSNfsdV001Service().getWSNfsdV001Port();
EnviarLoteRpsResposta r = servico.recepcionarLoteRps(loteEnvioRps );
O problema é que depois que executo o comando Unmarshaller e mando para o Web Service, o Web Service da um comando Marsheller para validar as assinaturas e tem como resposta que as assinaturas no arquivo xml esta INVALIDA.
Verifiquei que o arquivo gerado pelo Marshaller sobre objeto loteEnvioRps(enviado para o Web Service) há uma troca do elemento por ns2:Signature, isso ocorre em todos os elementos filhos deste elemento (por exemplo por ns2:KeyInfo).Trecho do arquivo gerado pelo Marshaller sobre objeto loteEnvioRps:
ns2:Signature
ns2:SignedInfo
<ns2:CanonicalizationMethod
Algorithm=“http://www.w3.org/TR/2001/REC-xml-c14n-20010315” />
<ns2:SignatureMethod Algorithm=“http://www.w3.org/2000/09/xmldsig#rsa-sha1” />
<ns2:Reference URI="">
ns2:Transforms
<ns2:Transform
Algorithm=“http://www.w3.org/2000/09/xmldsig#enveloped-signature” />
<ns2:Transform Algorithm=“http://www.w3.org/TR/2001/REC-xml-c14n-20010315” />
</ns2:Transforms>
<ns2:DigestMethod Algorithm=“http://www.w3.org/2000/09/xmldsig#sha1” />
ns2:DigestValuehD08vv96lmjqLCC8D7LmThx98OE=</ns2:DigestValue>
</ns2:Reference>
</ns2:SignedInfo>
Por favor, quem tem alguma luz para solucionar este problema me ajudem.
Muito Obrigado.