Assinatura de Xml para Envio de Lote para Nfse

7 respostas
R

Amigos,

Não estou conseguindo assinar os Rps e, após, o lote do meu Xml. Assinatura esta que é necessária para processamento deste arquivo no webservice da notaCarioca.

Segue minha classe java para assinatura:
public class AssinarXML {
	/**
	 * Assina um XML de acordo com os parametros abaixo
	 * 
	 * @param caminhoKeyStore
	 *            ex: arquivo.p12
	 * @param senha
	 * @param tipoKeystore
	 *            ex: TiposKeyStore.PKCS12
	 * @param caminhoXML
	 * @param idTagParaAssinar
	 * @return
	 * @throws Exception
	 */
	public String assinarXML(String caminhoKeyStore, char[] senha,
			TiposKeyStore tipoKeystore, String caminhoXML,
			String idTagParaAssinar) throws Exception {
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setNamespaceAware(true);
		DocumentBuilder builder = dbf.newDocumentBuilder();
		Document doc = builder.parse(new FileInputStream(caminhoXML));

		KeyStore ks = KeyStore.getInstance(tipoKeystore.getValue());
		ks.load(new java.io.FileInputStream(caminhoKeyStore), senha);

		PrivateKey chavePrivada = null;
		Certificate chavePublica = null;

		Enumeration<String> enum1 = ks.aliases();

		while (enum1.hasMoreElements()) {
			String alias = enum1.nextElement();
			if (ks.isKeyEntry(alias)) {
				chavePrivada = (PrivateKey) ks.getKey(alias, senha);
				chavePublica = ks.getCertificate(alias);
			}
		}

		DOMSignContext dsc = new DOMSignContext(chavePrivada,
				doc.getDocumentElement());
		XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

		Reference ref = fac.newReference("#" + idTagParaAssinar, fac
				.newDigestMethod(DigestMethod.SHA1, null), Collections
				.singletonList(fac.newTransform(Transform.ENVELOPED,
						(TransformParameterSpec) null)), null, null);

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

		KeyInfoFactory kif = fac.getKeyInfoFactory();

		KeyValue kv = kif.newKeyValue(chavePublica.getPublicKey());
		KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv));

		XMLSignature signature = fac.newXMLSignature(si, ki);

		signature.sign(dsc);

		OutputStream os = new ByteArrayOutputStream();

		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer trans = tf.newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(os));

		return os.toString();
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		char[] senha = "231221".toCharArray();
		String caminhoKeyStore = "C:\\Documents and Settings\\rasouza\\Meus documentos\\Coppetec\\Nfse\\temp\\cets_exportado_todosOsCaminhoscomChaveprimaria.pfx";
		String caminhoXML = "C:\\dev\\rafael\\wsp\\Nfse\\WebContent\\resources\\xmlEnvio\\EnviarLoteRps.xml";
		String idTagParaAssinar = "Rps1";
		String retornoXML = new AssinarXML().assinarXML(caminhoKeyStore, senha,
				TiposKeyStore.PKCS12, caminhoXML, idTagParaAssinar);

		
		
		TratarArquivo salvar = new TratarArquivo();
			salvar.salvarEmXmlExistente(retornoXML, "EnviarLoteRpsEnvio", true);
	}

}
Classe auxiliar
package br.com.nfse.util;


public enum TiposKeyStore {
	PKCS12("PKCS12"),
	JKS("JKS"),
	CMS("CMS"),
	JCEKS("JCEKS");
	
	private String value;
	private TiposKeyStore(String value) {
        this.value = value;
    }
	public String getValue(){
		return this.value;
	}
}

Meu xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EnviarLoteRpsEnvio xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.abrasf.org.br/ABRASF/arquivos/nfse.xsd">
    <LoteRps Id="Lote1">
        <NumeroLote>1</NumeroLote>
        <Cnpj>72060999000175</Cnpj>
        <InscricaoMunicipal>01119923</InscricaoMunicipal>
        <QuantidadeRps>2</QuantidadeRps>
        <ListaRps>
            <Rps>
                <InfRps Id="Rps1">
                    <IdentificacaoRps>
                        <Numero>9</Numero>
                        <Serie>00001</Serie>
                        <Tipo>1</Tipo>
                    </IdentificacaoRps>
                    <DataEmissao>2013-02-19T13:00:00</DataEmissao>
                    <NaturezaOperacao>1</NaturezaOperacao>
                    <OptanteSimplesNacional>2</OptanteSimplesNacional>
                    <IncentivadorCultural>2</IncentivadorCultural>
                    <Status>1</Status>
                    <Servico>
                        <Valores>
                            <ValorServicos>1000.00</ValorServicos>
                            <ValorDeducoes>0</ValorDeducoes>
                            <ValorPis>10.00</ValorPis>
                            <ValorCofins>10.00</ValorCofins>
                            <ValorInss>10.00</ValorInss>
                            <ValorIr>10.00</ValorIr>
                            <ValorCsll>10.00</ValorCsll>
                            <IssRetido>2</IssRetido>
                            <ValorIss>10.00</ValorIss>
                            <OutrasRetencoes>10.00</OutrasRetencoes>
                            <Aliquota>0.05</Aliquota>
                            <DescontoIncondicionado>10.00</DescontoIncondicionado>
                            <DescontoCondicionado>10.00</DescontoCondicionado>
                        </Valores>
                        <ItemListaServico>0102</ItemListaServico>
                        <CodigoTributacaoMunicipio>010201</CodigoTributacaoMunicipio>
                        <Discriminacao>Teste</Discriminacao>
                        <CodigoMunicipio>3304557</CodigoMunicipio>
                    </Servico>
                    <Prestador>
                        <Cnpj>72060999000175</Cnpj>
                        <InscricaoMunicipal>01119923</InscricaoMunicipal>
                    </Prestador>
                    <Tomador>
                        <IdentificacaoTomador>
                            <CpfCnpj>
                                <Cnpj>99999999000191</Cnpj>
                            </CpfCnpj>
                        </IdentificacaoTomador>
                        <RazaoSocial>INSCRICAO DE TESTE</RazaoSocial>
                        <Endereco>
                            <Endereco>AV RIO BRANCO</Endereco>
                            <Numero>1234</Numero>
                            <Complemento>SALA 1001 E 1002</Complemento>
                            <Bairro>CENTRO</Bairro>
                            <CodigoMunicipio>3304557</CodigoMunicipio>
                            <Uf>RJ</Uf>
                            <Cep>20040001</Cep>
                        </Endereco>
                    </Tomador>
                </InfRps>
            </Rps>
            <Rps>
                <InfRps Id="Rps2">
                    <IdentificacaoRps>
                        <Numero>10</Numero>
                        <Serie>00001</Serie>
                        <Tipo>1</Tipo>
                    </IdentificacaoRps>
                    <DataEmissao>2013-02-19T13:05:00</DataEmissao>
                    <NaturezaOperacao>1</NaturezaOperacao>
                    <OptanteSimplesNacional>2</OptanteSimplesNacional>
                    <IncentivadorCultural>2</IncentivadorCultural>
                    <Status>1</Status>
                    <Servico>
                        <Valores>
                            <ValorServicos>1000.00</ValorServicos>
                            <ValorDeducoes>0</ValorDeducoes>
                            <ValorPis>10.00</ValorPis>
                            <ValorCofins>10.00</ValorCofins>
                            <ValorInss>10.00</ValorInss>
                            <ValorIr>10.00</ValorIr>
                            <ValorCsll>10.00</ValorCsll>
                            <IssRetido>2</IssRetido>
                            <ValorIss>10.00</ValorIss>
                            <OutrasRetencoes>10.00</OutrasRetencoes>
                            <Aliquota>0.05</Aliquota>
                            <DescontoIncondicionado>10.00</DescontoIncondicionado>
                            <DescontoCondicionado>10.00</DescontoCondicionado>
                        </Valores>
                        <ItemListaServico>0102</ItemListaServico>
                        <CodigoTributacaoMunicipio>010201</CodigoTributacaoMunicipio>
                        <Discriminacao>TESTE</Discriminacao>
                        <CodigoMunicipio>3304557</CodigoMunicipio>
                    </Servico>
                    <Prestador>
                        <Cnpj>72060999000175</Cnpj>
                        <InscricaoMunicipal>01119923</InscricaoMunicipal>
                    </Prestador>
                    <Tomador>
                        <IdentificacaoTomador>
                            <CpfCnpj>
                                <Cnpj>99999990000191</Cnpj>
                            </CpfCnpj>
                        </IdentificacaoTomador>
                        <RazaoSocial>INSCRICAO DE TESTE2</RazaoSocial>
                        <Endereco>
                            <Endereco>AV RIO BRANCO</Endereco>
                            <Numero>1235</Numero>
                            <Complemento>SALA 2002 E 2005</Complemento>
                            <Bairro>CENTRO</Bairro>
                            <CodigoMunicipio>3304557</CodigoMunicipio>
                            <Uf>RJ</Uf>
                            <Cep>20040001</Cep>
                        </Endereco>
                    </Tomador>
                </InfRps>
            </Rps>
        </ListaRps>
    </LoteRps>
</EnviarLoteRpsEnvio>

Alguém pode me ajudar?

Abraço

7 Respostas

B

Cara já tentou entrar em contato com os desenvolvedores do webservice?

Trabalhei com nfe e geralmente as empresas pecavam por não ler nossas definições de como deve ser o XML. Eles devem disponibilizar algo do tipo explicando como deve ser o XML, se tiver no formato certo não tem pq da erro.

Geralmente esses erros estão no arquivo xml mesmo, falta de atributo obrigatório ou atributo colocado no lugar errado.

[]'s

R

bastides!

Enviei 12 emails, liguei várias vezes, mas sobre WS só “resolvem” por email…até agora não recebi nenhuma resposta.
Na documentação deles, é informado que a assinatura do xml é opcional, porém quando consulta o lote recebo a informação que preciso da assinatura, mas não sei como fazer…tenho um exemplo de VB, mas não sei como passá-lo para java…to tentando desde hj de manhã!

Obrigado por responder!

WebService com certificado é carne de pescoço!rsrs

R

http://www.javac.com.br/jc/posts/list/106-nfe-assinatura-dos-xmls-de-envio-de-lote-cancelamento-e-inutilizacao-certificado-a1.page

Esse link aí não te ajuda?

R

Sasaki,

Conheço o fórum javac, peguei esta classe, tentei adaptá-la(já que está para o modelo Nfe), mas dá NullPointer…

Neste classe que postei já consigo assinar, mas deveria utilizar a classe X509 tbm, mas não sei implementá-la, assim como assinar os rps’s e depois todo o lote (3 assinaturas).

Vlw pela resposta!

F

Boa tarde raffamz, você conseguiu fazer os ajustes do exemplo postado no javac para NFE para NFS-e?
Se puderes me dar uma ajuda, estou tentando seguir seu exemplo postado aqui.

A

Ola,

Estou tentando utilizar seu código, com pequenas modificações, e estou tendo o seguinte problema:

javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID Rps1

Sabe me dizer porque isso acontece? Já pesquisei bastante mas até agora não encontrei a causa do problema.

F

@alsuch Você precisa colocar

Element infRps = (Element) rps.getElementsByTagName(“InfRps”).item(0);
infRps.setIdAttribute(“id”, true);

Criado 20 de fevereiro de 2013
Ultima resposta 26 de dez. de 2015
Respostas 7
Participantes 6