Assinatura de Xml para Envio de Lote para Nfse

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:

[code]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);
}

}[/code]

Classe auxiliar

[code]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;
}

}
[/code]

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

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

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

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?

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!

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.

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.

@alsuch Você precisa colocar

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