Erro Após Atualização Java. Problema Deles ou Meu? (RESOLVIDO)

41 respostas
S

Boa Tarde Galera…

Tenho um Sistema Emissor de Nota fiscal Eletronica Funionando a Todo Vapor!

Mas ontem, em alguns clientes , começaram a dar erro ao Assinar o XML!

Seguinte Erro : javax.xml.crypto.URIReferenceException: com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID NFe52130601182484000108550010000100031012691580
Hoje após uma bateria de teste e uma noite sem dormir, descubro que o erro só acontece em maquinas que atualizaram para o JAva 7 versão 25, a atual.

Dai Como proceder? Meu Codigo está correto, pois funciona a anos.
Existe algum canal que eu possa reclamar? E se tiver acredito que sei muito superficialmente sobre o erro Para relatar o Bug!

Alguém pode me dar uma opinião?

Crio este Topico para pessoas que estão passando pelo mesmo problema!

41 Respostas

E

Este é o canal:

http://bugs.sun.com/

(Para ver que nem mexeram no sistema mesmo depois que a Oracle comprou a Sun, faz alguns anos…)

Enquanto isso (há bugs que estão abertos há mais de 10 anos), dê um jeito e teste sua aplicação com a versão mais nova do JDK…

E

https://issues.apache.org/jira/browse/SANTUARIO-312

Pelo que imagino, esse problema (que foi reportado há mais de um ano, mas não exatamente no JDK, e sim em bibliotecas que ele importa) somente começou a aparecer agora porque essas bibliotecas devem ter sido atualizadas recentemente no JDK.

S

Fala Cara… Obrigado Pela Resposta.

Ontem no meu desespero já tinha achado em topico citado acima. (Fui até a pagina 25 do Google)

E mesmo assim não deu certo.

Sobre o Update a Oracle lançou -> http://www.oracle.com/technetwork/java/javase/7u25-relnotes-1955741.html.

Estou fazendo testes em cima dessas modificações, principalmente sobre:

New property for Secure Validation of XML
To avoid potential security issues with XML signatures, a secure validation mode has been added whereby signatures that contain potentially hostile constructs are rejected and not processed.

For this purpose, the following new private property is added to the JDK:

org.jcp.xml.dsig.secureValidation
The property can be set by an application by calling the setProperty method of the javax.xml.crypto.dsig.dom.DOMValidateContext class with the name of the property above and a Boolean value.

When set to true, this property instructs the implementation to process XML signatures more securely. This will set limits on various XML signature constructs to avoid conditions such as denial of service attacks.

When not set, or set to false, the property instructs the implementation to process XML signatures according to the XML Signature specification without any special limits.

If a SecurityManager is enabled, the property is set to true by default.

Se Alguem passou pelo mesmo Erro e teve sucesso por favor me Avise… Abraços!

A

Estava com o mesmo problema e utilizando a dica do entanglement funcionou.

Apenas adicionei a seguinte linha de código após criar o objeto Document e pegar o elemento principal:

el.setIdAttribute("Id", true);

Ontem, em algumas tentativas também cheguei a adicionar o seguinte trecho, porém acredito que não mudou em nada:

System.setProperty("org.jcp.xml.dsig.secureValidation", "false");

Em todo caso, segue o método que utilizo para assinar o XML:

public static String assinaRaiz(String xml) throws Exception {   
		
		System.setProperty("org.jcp.xml.dsig.secureValidation", "false");
		
	    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();   
	    factory.setNamespaceAware(true);   
	    Document doc = factory.newDocumentBuilder().parse(   
	            new ByteArrayInputStream(xml.getBytes()));   
	  
	    doc.getDocumentElement().removeAttribute("xmlns:ns2");   
	     
	    Node element = doc.getDocumentElement().getFirstChild();
	    
	    if(element.getNodeType() != Node.ELEMENT_NODE){	    	
	    	element = element.getNextSibling();	    	
	    }	    	
	    	
	    Element el = (Element) element;
	    
	    String id = el.getAttribute("Id"); 
	    
	    el.setIdAttribute("Id", true);   
	  
	    // Create a DOM XMLSignatureFactory that will be used to   
	    // generate the enveloped signature.   
	    XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");   
	  
	    // Create a Reference to the enveloped document (in this case,   
	    // you are signing the whole document, so a URI of "" signifies   
	    // that, and also specify the SHA1 digest algorithm and   
	    // the ENVELOPED Transform.   
	    ArrayList transformList = new ArrayList();   
	    TransformParameterSpec tps = null;   
	    Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,   
	            tps);   
	    Transform c14NTransform = fac.newTransform(   
	            "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);   
	  
	    transformList.add(envelopedTransform);   
	    transformList.add(c14NTransform);   
	  
	    // Load the KeyStore and get the signing key and certificate.   
	  
	    Token.inicializarToken();
	    Token tk = Token.getInstance();    
	  
	    X509Certificate cert = tk.getCertificate();   
	  
	    // Create the KeyInfo containing the X509Data.   
	    KeyInfoFactory kif = fac.getKeyInfoFactory();   
	    List x509Content = new ArrayList();  
	    x509Content.add(cert);   
	    X509Data xd = kif.newX509Data(x509Content);   
	    KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));;   
	  
	    // Create a DOM XMLSignatureFactory that will be used to   
	    // generate the enveloped signature.   
	  
	    Reference ref = fac.newReference("#" + id, fac.newDigestMethod(   
	            DigestMethod.SHA1, null), transformList, null, null);   
	  
	    // Create the SignedInfo.   
	    SignedInfo si = fac   
	            .newSignedInfo(fac.newCanonicalizationMethod(   
	                    CanonicalizationMethod.INCLUSIVE,   
	                    (C14NMethodParameterSpec) null), fac   
	                    .newSignatureMethod(SignatureMethod.RSA_SHA1, null),   
	                    Collections.singletonList(ref));   
	  
	    // Create the XMLSignature, but don't sign it yet.   
	    XMLSignature signature = fac.newXMLSignature(si, ki);   
	  
	    // Marshal, generate, and sign the enveloped signature.   
	    // Create a DOMSignContext and specify the RSA PrivateKey and   
	    // location of the resulting XMLSignature's parent element.   
	    DOMSignContext dsc = new DOMSignContext(tk.getPrivateKeyFromToken(), doc   
	            .getDocumentElement());   
	    signature.sign(dsc); 
	  
	    // Output the resulting document.   
	    ByteArrayOutputStream os = new ByteArrayOutputStream();   
	    TransformerFactory tf = TransformerFactory.newInstance();   
	    Transformer trans = tf.newTransformer();   
	    trans.transform(new DOMSource(doc), new StreamResult(os));
	    
	    return os.toString();   
	}

Após a assinatura, tive problemas para enviar o XML ao SEFAZ, sendo necessário diminuir o nível de segurança no Painel de Controle do Java de meu cliente.

Espero que ajude.

S

Opa… Vou testar com suas dicas, e retorno Aqui!

E só a nivel de curiosidade o problema não foi assim tão incomum…

Imagino Quantas pessoas que utilizam o Emissor gratuito de São paulo vão ter dor de cabeça…

S

Realmente Era isso mesmo. Mais eu me esbarrei no case sensitive! Havia colocado “ID”.

Obrigado a Todos!

M

Muito bem.

Funcionou.

Apenas Com " el.setIdAttribute(“Id”, true); "

C

Mesmo colocando o codigo abaixo continuo com o mesmo problema
Instalei JDK 7u25
coloquei meu projeto para utilizar ela no NetBeans
mas nada.

el.setIdAttribute("Id", true);
S

POr favor coloque o Codigo Que vc usa para Assinar!

L

Bom dia, ainda continuo com o erro mesmo após inserir as duas linhas sitadas acima.

Alguém tem outra sugestão?

S

Posta seu cod ue… dai olhamos!

L

Segue trecho de assinatura

public String assinar(int tipo, String xml) throws NFEException  {
		java.lang.System.setProperty("org.jcp.xml.dsig.secureValidation", "false");
		// tipo
		// '1' - NFE
		// '2' - CANCELAMENTO
		// '3' - INUTILIZACAO
		// '4' - EVENTO / Carta de correção eletrônica
		// '5' - EVENTO / Manifestação do Destinatário
		// '6' - EVENTO / Download da NFe
		// '7' - EVENTO / Consulta da NFe
		String tag = "";
		String xsd = "";
		if(tipo == 1) {
			tag = "infNFe";
			//xsd = xsdEnvNFe; //só é feita a validação do lote
		} else if (tipo == 2 || tipo == 4 || tipo == 5 || tipo == 6 || tipo == 7) {
			tag = "infEvento";
			if(tipo == 2){
				xsd = xsdCancNFe;
			}else if(tipo == 4){
				xsd = xsdEnvCCe;
			}else if(tipo == 5){
				xsd = xsdManDest;
			}
		} else if (tipo == 3) {
			tag = "infInut";
			xsd = xsdInutNFe;
		} 
		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(false);
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document docs = builder.parse(new StringBufferInputStream(xml));
			
			// Obtem elemento do documento a ser assinado, será criado uma
			// REFERENCE para o mesmo
			Node element = docs.getDocumentElement().getFirstChild();
		    if(element.getNodeType() != Node.ELEMENT_NODE){	    	
		    	element = element.getNextSibling();	    	
		    }	    	
		    Element el = (Element) element;
		    
			String id = el.getAttribute("Id");		    
		    el.setIdAttribute("Id", true);

			//System.out.println(id);
			
			// Create a DOM XMLSignatureFactory that will be used to
			// generate the enveloped signature.
			String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
			XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
			//XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
			
			// Create a Reference to the enveloped document (in this case,
			// you are signing the whole document, so a URI of "" signifies
			// that, and also specify the SHA1 digest algorithm and
			// the ENVELOPED Transform.
			ArrayList<Transform> transformList = new ArrayList<Transform>();
			TransformParameterSpec tps = null;
			Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,tps);
			Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
			transformList.add(envelopedTransform);
			transformList.add(c14NTransform);

			// Load the KeyStore and get the signing key and certificate.  
			KeyStore ks = null;
			if (certTipo.equals("PKCS11")) { //A3  
				Provider p = new sun.security.pkcs11.SunPKCS11(parametros.getProperty("nfe.certificado.token"));  
				Security.addProvider(p);  
				ks = KeyStore.getInstance("PKCS11");  
				ks.load(null, parametros.getProperty("nfe.certificado.pass").toCharArray());  
			} else { //A1
				System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");  
				Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
				ks = KeyStore.getInstance("PKCS12");  
				ks.load(
						new FileInputStream(parametros.getProperty("nfe.certificado.pfx")),
						parametros.getProperty("nfe.certificado.pass").toCharArray()
				);  
			}

			KeyStore.PrivateKeyEntry keyEntry = null;  
			Enumeration<String> aliasesEnum = ks.aliases();  
			while (aliasesEnum.hasMoreElements())   
			{  
				String alias = (String) aliasesEnum.nextElement();  
				if (ks.isKeyEntry(alias))   
				{  
					keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(parametros.getProperty("nfe.certificado.pass").toCharArray()));
					break;
				}  
			}  
			X509Certificate cert = (X509Certificate) keyEntry.getCertificate();  

			// Create the KeyInfo containing the X509Data.
			KeyInfoFactory kif = fac.getKeyInfoFactory();
			List<X509Certificate> x509Content = new ArrayList<X509Certificate>();
			// x509Content.add(cert.getSubjectX500Principal().getName());

			x509Content.add(cert);
			X509Data xd = kif.newX509Data(x509Content);
			KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

			// Instantiate the document to be signed.
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			Document doc = dbf.newDocumentBuilder().parse(new StringBufferInputStream(xml));
			
			Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
			// Create the SignedInfo.
			SignedInfo si = fac
			.newSignedInfo(fac.newCanonicalizationMethod(
					CanonicalizationMethod.INCLUSIVE,
					(C14NMethodParameterSpec) null), fac
					.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
					Collections.singletonList(ref)); 
		    
			
			// Create the XMLSignature, but don't sign it yet.
			XMLSignature signature = fac.newXMLSignature(si, ki);

			// Create a DOMSignContext and specify the RSA PrivateKey and
			// location of the resulting XMLSignature's parent element.
			DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
						
			// Marshal, generate, and sign the enveloped signature.
			signature.sign(dsc);

			// Output the resulting document.
			//OutputStream os = new FileOutputStream(caminhoXmlNovo);
			StringWriter sw = new StringWriter();
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(doc), new StreamResult(sw));

			// Find Signature element.
			NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");

			if (nl.getLength() == 0) {
				throw new NFEException("Cannot find Signature element");
			}
			// Create a DOMValidateContext and specify a KeySelector and document
			// context.
			DOMValidateContext valContext = new DOMValidateContext( new X509KeySelector(ks), nl.item(0));
			// Unmarshal the XMLSignature.
			XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
			// Validate the XMLSignature.
			boolean coreValidity = signatures.validate(valContext);
			// Check core validation status.
			if (coreValidity == false)
				throw new Exception("Assinatura inválida.");

			String retorno = sw.toString();
			
			if (tipo != 1)
				validaXML(retorno, xsd);
			
			System.out.println("XML assinado: " + retorno);
			return retorno;
		
		} catch (Exception e) {
			e.printStackTrace();
			throw new NFEException(e.getMessage());
		}
		
	}
S

Tire o Comentario e me passe o Resultado da Linha

46       //System.out.println(id);

E em debug veja se passa da linha:

127            signature.sign(dsc);

E nos Passe os Erros!

L

Na linha:

46       //System.out.println(id);

Retorna a tag Id correta

E o erro é justamente na linha: 127 signature.sign(dsc);

Não passa dela, ao executar o servidor e efetuar a chamada o erro é apresentado nesta linha.

S

samuk:

E nos Passe os Erros!

L

Retorno do println:

Erro apresentado ao chamar o servidor:

S
Cara. Tudo Perfeito mesmo. Muito estranho... Pega meu cod, adpte ele no seu contexto e teste! Se quiser manter seu codigo, vá substituindo linha por linha! Se quiser resolver troca tudo... Ao meu ver, só essa parte é relevante a este erro! Aguardo retorno.
private void assinarNFe(String tipo ,XMLSignatureFactory fac, ArrayList<Transform> transformList, PrivateKey privateKey, KeyInfo ki, Document document, int indexNFe) throws Exception {
		if (EVENTO.equals(tipo)) {  
		elements = document.getElementsByTagName("infEvento"); 
        }else{  
		elements = document.getElementsByTagName("infNFe");
        }
		org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(indexNFe);
		String id = el.getAttribute("Id");
		
		el.setIdAttribute("Id", true);

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

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

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

		DOMSignContext dsc = new DOMSignContext(privateKey, document.getDocumentElement().getElementsByTagName(tipo).item(indexNFe));
		
		dsc.setBaseURI("ok");
		
		signature.sign(dsc);
	}
L
DOMSignContext dsc = new DOMSignContext(privateKey, document.getDocumentElement().getElementsByTagName(tipo).item(indexNFe));
Essa foi a unica diferença que apresenta do seu código para o meu em relação a seu comentário.
Ao meu ver, só essa parte é relevante a este erro!

O restante do meu código creio que no seu faça antes da chamada do método assinar. Porem essa alteração também não surtiu efeito.

Segue versão que estou utilizando do java:

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing)

Segue código alterado
public String assinar(int tipo, String xml) throws NFEException  {
		java.lang.System.setProperty("org.jcp.xml.dsig.secureValidation", "false");
		// tipo
		// '1' - NFE
		// '2' - CANCELAMENTO
		// '3' - INUTILIZACAO
		// '4' - EVENTO / Carta de correção eletrônica
		// '5' - EVENTO / Manifestação do Destinatário
		// '6' - EVENTO / Download da NFe
		// '7' - EVENTO / Consulta da NFe
		String tag = "";
		String xsd = "";
		if(tipo == 1) {
			tag = "infNFe";
			//xsd = xsdEnvNFe; //só é feita a validação do lote
		} else if (tipo == 2 || tipo == 4 || tipo == 5 || tipo == 6 || tipo == 7) {
			tag = "infEvento";
			if(tipo == 2){
				xsd = xsdCancNFe;
			}else if(tipo == 4){
				xsd = xsdEnvCCe;
			}else if(tipo == 5){
				xsd = xsdManDest;
			}
		} else if (tipo == 3) {
			tag = "infInut";
			xsd = xsdInutNFe;
		} 
		try {
			
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(false);
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document docs = builder.parse(new StringBufferInputStream(xml));
			
			// Obtem elemento do documento a ser assinado, será criado uma
			// REFERENCE para o mesmo
			NodeList elements = docs.getElementsByTagName(tag);
			Element el = (Element) elements.item(0);
			String id = el.getAttribute("Id");
			//System.out.println(id);
			el.setIdAttribute("Id", true);
			
			// Create a DOM XMLSignatureFactory that will be used to
			// generate the enveloped signature.
			String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
			XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
			//XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
			
			// Create a Reference to the enveloped document (in this case,
			// you are signing the whole document, so a URI of "" signifies
			// that, and also specify the SHA1 digest algorithm and
			// the ENVELOPED Transform.
			ArrayList<Transform> transformList = new ArrayList<Transform>();
			TransformParameterSpec tps = null;
			Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,tps);
			Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
			transformList.add(envelopedTransform);
			transformList.add(c14NTransform);

			Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
			// Create the SignedInfo.
			SignedInfo si = fac
			.newSignedInfo(fac.newCanonicalizationMethod(
					CanonicalizationMethod.INCLUSIVE,
					(C14NMethodParameterSpec) null), fac
					.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
					Collections.singletonList(ref));

			// Load the KeyStore and get the signing key and certificate.  
			KeyStore ks = null;
			if (certTipo.equals("PKCS11")) { //A3  
				Provider p = new sun.security.pkcs11.SunPKCS11(parametros.getProperty("nfe.certificado.token"));  
				Security.addProvider(p);  
				ks = KeyStore.getInstance("PKCS11");  
				ks.load(null, parametros.getProperty("nfe.certificado.pass").toCharArray());  
			} else { //A1
				System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");  
				Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
				ks = KeyStore.getInstance("PKCS12");  
				ks.load(
						new FileInputStream(parametros.getProperty("nfe.certificado.pfx")),
						parametros.getProperty("nfe.certificado.pass").toCharArray()
				);  
			}

			KeyStore.PrivateKeyEntry keyEntry = null;  
			Enumeration<String> aliasesEnum = ks.aliases();  
			while (aliasesEnum.hasMoreElements())   
			{  
				String alias = (String) aliasesEnum.nextElement();  
				if (ks.isKeyEntry(alias))   
				{  
					keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(parametros.getProperty("nfe.certificado.pass").toCharArray()));
					break;
				}  
			}  
			X509Certificate cert = (X509Certificate) keyEntry.getCertificate();  

			// Create the KeyInfo containing the X509Data.
			KeyInfoFactory kif = fac.getKeyInfoFactory();
			List<X509Certificate> x509Content = new ArrayList<X509Certificate>();
			// x509Content.add(cert.getSubjectX500Principal().getName());

			x509Content.add(cert);
			X509Data xd = kif.newX509Data(x509Content);
			KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

			// Instantiate the document to be signed.
			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
			dbf.setNamespaceAware(true);
			Document doc = dbf.newDocumentBuilder().parse(new StringBufferInputStream(xml));
			
			// Create a DOMSignContext and specify the RSA PrivateKey and
			// location of the resulting XMLSignature's parent element.
			/**DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());**/
			DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), 
					doc.getDocumentElement().getElementsByTagName(tag).item(0));
			dsc.setBaseURI("ok");

			// Create the XMLSignature, but don't sign it yet.
			XMLSignature signature = fac.newXMLSignature(si, ki);

			// Marshal, generate, and sign the enveloped signature.
			signature.sign(dsc);

			// Output the resulting document.
			//OutputStream os = new FileOutputStream(caminhoXmlNovo);
			StringWriter sw = new StringWriter();
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(doc), new StreamResult(sw));

			// Find Signature element.
			NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");

			if (nl.getLength() == 0) {
				throw new NFEException("Cannot find Signature element");
			}
			// Create a DOMValidateContext and specify a KeySelector and document
			// context.
			DOMValidateContext valContext = new DOMValidateContext( new X509KeySelector(ks), nl.item(0));
			// Unmarshal the XMLSignature.
			XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
			// Validate the XMLSignature.
			boolean coreValidity = signatures.validate(valContext);
			// Check core validation status.
			if (coreValidity == false)
				throw new Exception("Assinatura inválida.");

			String retorno = sw.toString();
			
			if (tipo != 1)
				validaXML(retorno, xsd);
			
			System.out.println("XML assinado: " + retorno);
			return retorno;
		
		} catch (Exception e) {
			e.printStackTrace();
			throw new NFEException(e.getMessage());
		}
		
	}
S

Que isso eim… Estranho d+!
FAz o limpa ai… Desistala tudo refente a java! E instala a ultima versão.
Dai alteranos seu eclipse tbm…

Tentou Instalar em outra maquina?!

L

Como é no servidor da empresa (Conecto via TS) não tenho a possibilidade de desinstalar tudo do java, senão paro todo o desenvolvimento.
Vou verificar com os superiores a possibilidade de iniciar o servidor em outra máquina.
No servidor está instalado duas versões do Java a 7 update 25 e a 6 update 33, mas creio que não seja esse o problema. Vou verificar a possibilidade de deixar apenas uma versão instalada.

Grato até o momento, e qualquer novidade ou a instalação em outra maquina não resolver, volto a comentar por aqui.

C

Pessoal, estou com o mesmo problema, mas no CT-e. No caso, estou rodando no Mac (Java 6 u51), mas a mensagem de erro é exatamente a mesma. Já adicionei as linhas mencionadas, e nada.

Alguma idéia?

Obrigado

S

Cinglez Boa Tarde.

Não como como vc gerencia suas assinaturas, mas eu possuo um metodo para cada uma: Envio , Evento, cancelamento, inutilização… etc.

Dai tive que colocar essa propriedade em cada metodo!

Talvez seja isso o pq de funcionar nas outras funçoes e nesta não!

Verifique se isso acontece com vc tbm, e se não coloque seu codigo da assinatura para verificarmos!

C

Obrigado pelo retorno. Na verdade funcionava e parou de funcionar após o upgrade do java. O código é

package cte.xmlSigner;

import java.io.File;
import java.io.FileInputStream;
import java.io.StringReader;

import java.io.StringWriter;

import java.security.KeyStore;
import java.security.Provider;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.util.Enumeration;

import javax.xml.parsers.DocumentBuilder;

import org.w3c.dom.Node;

import org.xml.sax.InputSource;

public class cteXmlSigner{
    
    
    private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
    
    private static final String PROVIDER_CLASS_NAME = "org.jcp.xml.dsig.internal.dom.XMLDSigRI";
    private static final String PROVIDER_NAME = "jsr105Provider";
        
    public String cteAssinar(String xmlFile, String tipo, String certPath, String certPasswd) throws Exception
    {
    // tipo
    // 'CTE' - CTE  
    // 'CAN' - CANCELAMENTO
    // 'INU' - INUTILIZACAO
    //

      String tag = "";
    
      if(tipo.equals("CTE"))
        tag = "infCte";
      else if (tipo.equals("CAN"))
        tag = "infCanc";
      else if (tipo.equals("INU"))
        tag = "infInut";
      
//      System.setProperty("org.jcp.xml.dsig.secureValidation", "false"); 
    
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(false);
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document docs = builder.parse(new InputSource(new StringReader(xmlFile)));
      
      NodeList elements = docs.getElementsByTagName(tag);
      Element el = (Element) elements.item(0);

      String id = el.getAttribute("Id");
      
      el.setIdAttribute("Id", true);
      
      String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
      XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
    
      ArrayList transformList = new ArrayList();
      TransformParameterSpec tps = null;
      Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,tps);
      Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
      transformList.add(envelopedTransform);
      transformList.add(c14NTransform);
    
      Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
    
      SignedInfo si = fac
      .newSignedInfo(fac.newCanonicalizationMethod(
      CanonicalizationMethod.INCLUSIVE,
      (C14NMethodParameterSpec) null), fac
      .newSignatureMethod(SignatureMethod.RSA_SHA1, null),
      Collections.singletonList(ref));
    
      KeyStore ks = KeyStore.getInstance("PKCS12");
      ks.load(new FileInputStream(certPath), certPasswd.toCharArray());
      Enumeration aliasesEnum = ks.aliases();
      String alias = "";
      while (aliasesEnum.hasMoreElements()) {
        alias = (String) aliasesEnum.nextElement();
        if (ks.isKeyEntry(alias)) {
        break;
        }
      }
    
      KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(certPasswd.toCharArray()));
    
      X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
    
      KeyInfoFactory kif = fac.getKeyInfoFactory();
      List x509Content = new ArrayList();
    
      x509Content.add(cert);
      X509Data xd = kif.newX509Data(x509Content);
      KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
    

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      dbf.setNamespaceAware(true);
      Document doc = dbf.newDocumentBuilder().parse(new InputSource(new StringReader(xmlFile)));


      DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
    
      XMLSignature signature = fac.newXMLSignature(si, ki);
    
      signature.sign(dsc);
    
      
      StringWriter stringWriter = new StringWriter(); 
      Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
      transformer.transform(new DOMSource(doc), new StreamResult(stringWriter)); 
      String signedXml = stringWriter.toString();
      
      NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
    
      if (nl.getLength() == 0) {
      throw new Exception("Cannot find Signature element");
      }

      DOMValidateContext valContext = new DOMValidateContext( new X509KeySelector(ks), nl.item(0));

      XMLSignature signatures = fac.unmarshalXMLSignature(valContext);

      boolean coreValidity = signatures.validate(valContext);

      if (coreValidity == false) {
        return "Falha na Assinatura!";
      } else {
        return signedXml;
      }
    }


}

Obrigado

S

Coisa feia cara!

Edita isso ai e coloca como "[code]"

nem perco tempo decifrando isso ai...

C
samuk:
Coisa feia cara!

Edita isso ai e coloca como "[code]"

nem perco tempo decifrando isso ai...

Falha minha, na verdade nem sabia como fazer... rsrs

Obrigado!

S

Primeiro… a TAg certa não seria : “infEvento”

Troque isso:

135 DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
Por isso…

135 DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement().getElementsByTagName(tag));

C

Obrigado pela resposta. Tentei o que você sugeriu, mas recebo ao compilar:

Error(142,30): cannot find constructor DOMSignContext(java.security.PrivateKey,org.w3c.dom.NodeList)

A classe que estou importanto é:

import javax.xml.crypto.dsig.dom.DOMSignContext;

Mais uma vez obrigado

S

Ta certo eu que dei bobeira…
Faz assim: DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement().getElementsByTagName(tag).item(0));

O getElementsByTagName(tag) Traz uma lista de elementos, mas vc só precisa do elemento Especifico. Que Acredito ser o primeiro.

Tenta ai!

C

É, meu amigo, infelizmente não adiantou não. Na verdade, quando faço

NodeList elements = docs.getElementsByTagName(tag);
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");

eu consigo exibir a String id, ele consegue pegar o elemento. Mas a mensagem de erro persiste. Não há algo de estranho no fato da mensagem colocar ID em maiúscula? O atributo na verdade é “Id”, mas a mensagem vem:

Cannot resolve element with ID 1

Realmente por enquanto teremos que manter nossos clients no 7u21 para continuar funcionando, o problema é minha estação de trabalho, que é Mac e não é simples fazer o downgrade.

Mais alguma idéia?

Abs

C

Resolvido!

O problema era um furo no código. Para assinar, era criada uma nova instância do documento, ao invés de utilizar a que havia sido colocado o atributo Id. Por isso na hora de assinar, o atributo não era encontrado.

Agora está funcionando.

Obrigado pela ajuda.

J

Bom dia,

Estou tendo o mesmo problema com assinatura, porém o meu sistema efetua a assinatura de qualquer tipo de documentos. Tentei efetuar a solução sugerida por vocês porém o programa sempre dispara um NOT_FOUND_ERR.

Segue o código que utilizo para efetuar assinatura:

public void sign(String uri, InputStream in, CadeiaCertificados cadeia, KeyPair kp, OutputStream out) throws GeneralSecurityException, ParserConfigurationException, MarshalException, XMLSignatureException, TransformerException, IOException, SAXException {
		
		doc = dbf.newDocumentBuilder().parse(in);

		//		NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
		signatureCount = System.currentTimeMillis();
		
		refs.clear();
		objs.clear();
		
		List<Transform> transformList = new ArrayList<Transform>();
		transformList.add(fac.newTransform(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (TransformParameterSpec) null));
		transformList.add(fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null));
		
		refs.add(fac.newReference(uri, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null));
		
		this.generateSigningProperties(cadeia);
		
		
		// Create the SignedInfo
		si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,(C14NMethodParameterSpec) null),fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),refs);
		
		// Create the XMLSignature (but don't sign it yet)
		//signature = fac.newXMLSignature(si, this.generateKeyInfo(cadeia));
		signature = fac.newXMLSignature(si, this.generateKeyInfo(cadeia), objs, "assinatura"+signatureCount, null);
		
		// Create a DOMSignContext and specify the DSA PrivateKey for signing
		// and the document location of the XMLSignature		
		DOMSignContext dsc = new DOMSignContext(kp.getPrivate(), doc.getDocumentElement());
		dsc.putNamespacePrefix(XMLSignature.XMLNS,xmlSignaturePrefix);
		dsc.putNamespacePrefix(xadesNamespace, xadesPrefix);

		// Lastly, generate the enveloping signature using the PrivateKey
		java.lang.System.setProperty("org.jcp.xml.dsig.secureValidation", "false");  
		signature.sign(dsc);
		java.lang.System.setProperty("org.jcp.xml.dsig.secureValidation", "true");  
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer trans = tf.newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(out));
		
	}

A exception retornada é:

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

C

Você tentou logo após

doc = dbf.newDocumentBuilder().parse(in);

colocar algo do tipo

NodeList elements = doc.getElementsByTagName(tag);
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
el.setIdAttribute("Id", true);

onde tag é a tag a ser assinada? É como funcionou para mim.

G

Galera, Vocês são ninjas.
Tentei de tudo aqui e ainda não encontrei a resolução desse problema.
Segue o meu código, agradeço muito se puderem me ajudar.

Obrigado

private void assinar(String arquivoXML, String arquivoCertificado,
            String password, String operacao) throws Exception {

        /*
         * operacao 
         * '1' - NFE 
         * '2' - CANCELAMENTO 
         * '3' - INUTILIZACAO
         */

        String tag = "";
        String alias = null;
        KeyStore.PrivateKeyEntry keyEntry;
        switch (operacao) {
            case "1":
                tag = "infNFe";
                break;
            case "2":
                tag = "infEvento";
                break;
            case "3":
                tag = "infInut";
                break;
        }

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(false);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document docs = builder.parse(new File(arquivoXML));

        NodeList elements = docs.getElementsByTagName(tag);

        Element el = (Element) elements.item(0);
        
        String id = el.getAttribute("Id");
        el.setIdAttribute("Id", true); 

        // Cria um DOM do tipo XMLSignatureFactory que será utilizado
        // para gerar a assinatura envelopada (enveloped signature)
        String providerName = System.getProperty(PROVIDER_NAME,
                PROVIDER_CLASS_NAME);

        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM",
                (Provider) Class.forName(providerName).newInstance());

        // Define os algoritmos de transformação
        ArrayList transformList = new ArrayList();
        TransformParameterSpec tps = null;
        Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,
                tps);
        Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
        transformList.add(envelopedTransform);
        transformList.add(c14NTransform);

        // Cria o objeto Reference
        Reference ref = fac.newReference("#" + id, fac.newDigestMethod(
                DigestMethod.SHA1, null), transformList, null, null);

        // Cria o elemento SignedInfo
        SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(
                CanonicalizationMethod.INCLUSIVE,
                (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                Collections.singletonList(ref));

        //verifica o tipo de certificado
        KeyStore ks = null;
        if (certificado.getTipo().equalsIgnoreCase("a1")) {

            // Carrega o KeyStore e obtem a chave do certificado
            ks = KeyStore.getInstance("PKCS12");
            ks.load(new FileInputStream(arquivoCertificado), password.toCharArray());
            Enumeration aliasesEnum = ks.aliases();
            while (aliasesEnum.hasMoreElements()) {
                alias = (String) aliasesEnum.nextElement();
                if (ks.isKeyEntry(alias)) {
                    break;
                }
            }

            if (alias.isEmpty()) {
                throw new Exception(" Alias não reconhecido!");
            }

            keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(password.toCharArray()));

        } else {

        }



//        KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(password.toCharArray()));
//        KeyStore.PrivateKeyEntry keyEntry = Certificado.getPrivateKey();

        // Instancia um certificado do tipo X509
        X509Certificate cert = (X509Certificate) keyEntry.getCertificate();

        // Cria o elemente KeyInfo contendo a X509Data.
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        List<X509Certificate> x509Content = new ArrayList<>();
        x509Content.add(cert);
        X509Data xd = kif.newX509Data(x509Content);
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

        // Instancia o documento que será assinado
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);

        Document doc = dbf.newDocumentBuilder().parse(
                new FileInputStream(arquivoXML));

        // Cria o DOMSignContext especificando a chave e o nó pai
        DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), 
                tag.equals("infEvento") ? doc.getElementsByTagName("evento").item(0) : doc.getDocumentElement());

        // Cria a XMLSignature, mas não assina ainda
        XMLSignature signature = fac.newXMLSignature(si, ki);

        // Empacota (marshal), gera e assina
        signature.sign(dsc);

        // Arquivo novo assinado
        OutputStream os = new FileOutputStream(arquivoXML);
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));


        // Encontra o elemente Signature
        NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,
                "Signature");

        if (nl.getLength() == 0) {
            throw new Exception("Não foi possível encontrar o elemente Signature");
        }

        // Cria um DOMValidateContext
        DOMValidateContext valContext = new DOMValidateContext(
                new X509KeySelector(ks), nl.item(0));

        // Dsempacota (unmarshal) a XMLSignature
        XMLSignature signatures = fac.unmarshalXMLSignature(valContext);

        // Valida a XMLSignature.
        boolean coreValidity = signatures.validate(valContext);

        // Checa o status da validação
        if (!coreValidity) {
            throw new Exception("Falha na Assinatura!");
        }
    }

Muito obrigado

C

Cara, é o mesmo problema que eu tinha. Vc passa o ID para “docs” e depois assina “doc”. É outra instância. Por isso não funciona. Igualzinho eu tinha feito no início…

M

Mandando a mensagem só para informar que no meu caso a linha: el.setIdAttribute(“Id”, true); também funcionou!

Trabalho na Alezzia que usa um ERP Open Source chamado Adempiere e tive exatamente o mesmo problema.

Obrigado a todos pela contribuição!

G

Tudo certo galera.
Esta tudo funcionando comigo também!

A

Estou tendo o mesmo erro reportado pelo outros usuário de cannot resolve element ID
Segue o código se alguém puder ajudar

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class AssinarXMLsCertfificadoA1 {

	private static final String INFINUT = "infInut";
	private static final String INFCANC = "infCanc";
	private static final String RPS = "tipos:Rps";

	private PrivateKey privateKey;
	private KeyInfo keyInfo;

	public static void main(String[] args) {
		try {
			String caminhoDoCertificadoDoCliente = "A:\\4835438.pfx";
			String senhaDoCertificadoDoCliente = "senha123";
			AssinarXMLsCertfificadoA1 assinarXMLsCertfificadoA1 = new AssinarXMLsCertfificadoA1();

			/**
			 * Assinando o XML de Lote da NF-e fileEnviNFe = Caminho do Arquivo
			 * XML (EnviNFe) gerado;
			 */
			info("");
			String fileEnviNFe = "C:\\Users\\Administrador\\Desktop\\LOTE_1_000099.xml";
			String xmlEnviNFe = lerXML(fileEnviNFe);
			String xmlEnviNFeAssinado = assinarXMLsCertfificadoA1
					.assinaEnviNFe(xmlEnviNFe, caminhoDoCertificadoDoCliente,
							senhaDoCertificadoDoCliente);
			info("XML EnviNFe Assinado: " + xmlEnviNFeAssinado);

			/**
			 * Assinando o XML de Cancelamento da NF-e fileCancNFe = Caminho do
			 * Arquivo XML (CancNFe) gerado;
			 */
			/*info("");
			String fileCancNFe = "caminho do /xmlCancNFe.xml";
			String xmlCancNFe = lerXML(fileCancNFe);
			String xmlCancNFeAssinado = assinarXMLsCertfificadoA1
					.assinaCancNFe(xmlCancNFe, caminhoDoCertificadoDoCliente,
							senhaDoCertificadoDoCliente);
			info("XML CancNFe Assinado: " + xmlCancNFeAssinado);*/

			/**
			 * Assinando o XML de Inutilizacao da NF-e fileInutNFe = Caminho do
			 * Arquivo XML (InutNFe) gerado;
			 */
			/*info("");
			String fileInutNFe = "Caminho do /xmlInutNFe.xml";
			String xmlInutNFe = lerXML(fileInutNFe);
			String xmlInutNFeAssinado = assinarXMLsCertfificadoA1
					.assinaInutNFe(xmlInutNFe, caminhoDoCertificadoDoCliente,
							senhaDoCertificadoDoCliente);
			info("XML InutNFe Assinado: " + xmlInutNFeAssinado);*/

		} catch (Exception e) {
			error("| " + e.toString());
		}
	}

	/**
	 * Assinatura do XML de Envio de Lote da NF-e utilizando Certificado Digital
	 * A1.
	 * 
	 * @param xml
	 * @param certificado
	 * @param senha
	 * @return
	 * @throws Exception
	 */
	public String assinaEnviNFe(String xml, String certificado, String senha)
			throws Exception {
		
		Document document = documentFactory(xml);
		
		XMLSignatureFactory signatureFactory = XMLSignatureFactory
				.getInstance("DOM");
		ArrayList<Transform> transformList = signatureFactory(signatureFactory);
		loadCertificates(certificado, senha, signatureFactory);

		for (int i = 0; i < document.getDocumentElement()
				.getElementsByTagName(RPS).getLength(); i++) {
			System.out.println("For");
			assinarNFe(signatureFactory, transformList, privateKey, keyInfo,
					document, i);
		}

		return outputXML(document);
	}

	/**
	 * Assintaruda do XML de Cancelamento da NF-e utilizando Certificado Digital
	 * A1.
	 * 
	 * @param xml
	 * @param certificado
	 * @param senha
	 * @return
	 * @throws Exception
	 */
	public String assinaCancNFe(String xml, String certificado, String senha)
			throws Exception {
		return assinaCancelametoInutilizacao(xml, certificado, senha, INFCANC);
	}

	/**
	 * Assinatura do XML de Inutilizacao de sequenciais da NF-e utilizando
	 * Certificado Digital A1.
	 * 
	 * @param xml
	 * @param certificado
	 * @param senha
	 * @return
	 * @throws Exception
	 */
	public String assinaInutNFe(String xml, String certificado, String senha)
			throws Exception {
		return assinaCancelametoInutilizacao(xml, certificado, senha, INFINUT);
	}

	private void assinarNFe(XMLSignatureFactory fac,
			ArrayList<Transform> transformList, PrivateKey privateKey,
			KeyInfo ki, Document document, int indexNFe) throws Exception {

		NodeList elements = document.getElementsByTagName("tipos:InfRps");
		org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(indexNFe);
		String id = el.getAttribute("Id");

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

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

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

		DOMSignContext dsc = new DOMSignContext(privateKey, document
				.getDocumentElement().getElementsByTagName(RPS).item(indexNFe));
		 
		signature.sign(dsc);
		System.out.println("TESTE "+signature);
	}

	private String assinaCancelametoInutilizacao(String xml,
			String certificado, String senha, String tagCancInut)
			throws Exception {
		Document document = documentFactory(xml);

		XMLSignatureFactory signatureFactory = XMLSignatureFactory
				.getInstance("DOM");
		ArrayList<Transform> transformList = signatureFactory(signatureFactory);
		loadCertificates(certificado, senha, signatureFactory);

		NodeList elements = document.getElementsByTagName(tagCancInut);
		org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(0);
		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,
				document.getFirstChild());
		signature.sign(dsc);

		return outputXML(document);
	}

	private ArrayList<Transform> signatureFactory(
			XMLSignatureFactory signatureFactory)
			throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
		ArrayList<Transform> transformList = new ArrayList<Transform>();
		TransformParameterSpec tps = null;
		Transform envelopedTransform = signatureFactory.newTransform(
				Transform.ENVELOPED, tps);
		Transform c14NTransform = signatureFactory.newTransform(
				"http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

		transformList.add(envelopedTransform);
		transformList.add(c14NTransform);
		return transformList;
	}

	private Document documentFactory(String xml) throws SAXException,
			IOException, ParserConfigurationException {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		Document document = factory.newDocumentBuilder().parse(
				new ByteArrayInputStream(xml.getBytes()));
		return document;
	}

	private void loadCertificates(String certificado, String senha,
			XMLSignatureFactory signatureFactory) throws Exception {

		InputStream entrada = new FileInputStream(certificado);
		KeyStore ks = KeyStore.getInstance("PKCS12");
		try {
			ks.load(entrada, senha.toCharArray());
		} catch (IOException e) {
			throw new Exception(
					"Senha do Certificado Digital incorreta ou Certificado inválido.");
		}

		KeyStore.PrivateKeyEntry pkEntry = null;
		Enumeration<String> aliasesEnum = ks.aliases();
		while (aliasesEnum.hasMoreElements()) {
			String alias = (String) aliasesEnum.nextElement();
			if (ks.isKeyEntry(alias)) {
				pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
						new KeyStore.PasswordProtection(senha.toCharArray()));
				privateKey = pkEntry.getPrivateKey();
				break;
			}
		}

		X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
		info("SubjectDN: " + cert.getSubjectDN().toString());

		KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
		List<X509Certificate> x509Content = new ArrayList<X509Certificate>();

		x509Content.add(cert);
		X509Data x509Data = keyInfoFactory.newX509Data(x509Content);
		keyInfo = keyInfoFactory
				.newKeyInfo(Collections.singletonList(x509Data));
	}

	private String outputXML(Document doc) throws TransformerException {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer trans = tf.newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(os));
		String xml = os.toString();
		if ((xml != null) && (!"".equals(xml))) {
			xml = xml.replaceAll("\\r\\n", "");
			xml = xml.replaceAll(" standalone=\"no\"", "");
		}
		return xml;
	}

	private static String lerXML(String fileXML) throws IOException {
		String linha = "";
		StringBuilder xml = new StringBuilder();

		BufferedReader in = new BufferedReader(new InputStreamReader(
				new FileInputStream(fileXML)));
		while ((linha = in.readLine()) != null) {
			xml.append(linha);
		}
		in.close();

		return xml.toString();
	}

	/**
	 * Log ERROR.
	 * 
	 * @param error
	 */
	private static void error(String error) {
		System.out.println("| ERROR: " + error);
	}

	/**
	 * Log INFO.
	 * 
	 * @param info
	 */
	private static void info(String info) {
		System.out.println("| INFO: " + info);
	}

}
C

Ressusitanto esse topico.
Apos esse tempo algum de vcs conseguiram assinar as NFe e CTe com a nova versao do java 7 25 ??

A

Eu consegui assinar a NFSe com o código:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;

import javax.xml.crypto.MarshalException;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureException;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class Assinador {

	private PrivateKey privateKey;
	private KeyInfo keyInfo;

	private Document document;
	private XMLSignatureFactory signatureFactory;
	private ArrayList<Transform> transformList;
	private NodeList elements;
	private org.w3c.dom.Element el;
	private Reference ref;
	private SignedInfo si;
	private XMLSignature signature;
	private DOMSignContext dsc;

	private static final String RPS = "tipos:Rps";
	private static final String EnviarLoteRpsEnvio = "LoteRps";

	public static String lerXML(String fileXML) throws IOException {
		String linha = "";
		StringBuilder xml = new StringBuilder();

		BufferedReader in = new BufferedReader(new InputStreamReader(
				new FileInputStream(fileXML), "ISO-8859-1"));
		while ((linha = in.readLine()) != null) {
			xml.append(linha);
		}
		in.close();
		
		return xml.toString();
	}

	private String outputXML(Document doc) throws TransformerException {
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		TransformerFactory tf = TransformerFactory.newInstance();
		Transformer trans = tf.newTransformer();
		trans.transform(new DOMSource(doc), new StreamResult(os));
		String xml = os.toString();
		if ((xml != null) && (!"".equals(xml))) {
			xml = xml.replaceAll("\\r\\n", "");
			xml = xml.replaceAll(" standalone=\"no\"", "");
		}
		return xml;
	}

	private void loadCertificates(String certificado, String senha,
			XMLSignatureFactory signatureFactory) throws Exception {

		InputStream entrada = new FileInputStream(certificado);
		KeyStore ks = KeyStore.getInstance("PKCS12");
		try {
			ks.load(entrada, senha.toCharArray());
		} catch (IOException e) {
			throw new Exception(
					"Senha do Certificado Digital incorreta ou Certificado inválido.");
		}

		KeyStore.PrivateKeyEntry pkEntry = null;
		Enumeration<String> aliasesEnum = ks.aliases();
		while (aliasesEnum.hasMoreElements()) {
			String alias = (String) aliasesEnum.nextElement();
			if (ks.isKeyEntry(alias)) {
				pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
						new KeyStore.PasswordProtection(senha.toCharArray()));
				privateKey = pkEntry.getPrivateKey();
				break;
			}
		}

		X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
		// info("SubjectDN: " + cert.getSubjectDN().toString());

		KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
		List<X509Certificate> x509Content = new ArrayList<X509Certificate>();

		x509Content.add(cert);
		X509Data x509Data = keyInfoFactory.newX509Data(x509Content);
		keyInfo = keyInfoFactory
				.newKeyInfo(Collections.singletonList(x509Data));
	}

	private Document documentFactory(String xml) throws SAXException,
			IOException, ParserConfigurationException {
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		factory.setNamespaceAware(true);
		Document document = factory.newDocumentBuilder().parse(
				new ByteArrayInputStream(xml.getBytes()));

		return document;
	}
	
	
	
	private ArrayList<Transform> signatureFactory(
			XMLSignatureFactory signatureFactory)
			throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
		ArrayList<Transform> transformList = new ArrayList<Transform>();
		TransformParameterSpec tps = null;
		Transform envelopedTransform = signatureFactory.newTransform(
				Transform.ENVELOPED, tps);
		Transform c14NTransform = signatureFactory.newTransform(
				"http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

		transformList.add(envelopedTransform);
		transformList.add(c14NTransform);
		return transformList;
	}

	public void assinaLoteRpsNFSe(String tipo, XMLSignatureFactory fac,
			ArrayList<Transform> transformList, PrivateKey privateKey,
			KeyInfo ki, Document document, int indexNFe)
			throws NoSuchAlgorithmException,
			InvalidAlgorithmParameterException, MarshalException,
			XMLSignatureException, javax.xml.crypto.MarshalException {
		if (tipo.equals(Assinador.EnviarLoteRpsEnvio)) {
			this.elements = this.document.getDocumentElement()
					.getElementsByTagName("LoteRps");
		}
		if (tipo.equals(Assinador.RPS)) {
			this.elements = this.document.getElementsByTagName("tipos:InfRps");
		}

		this.el = (org.w3c.dom.Element) this.elements.item(indexNFe);
		String id = el.getAttribute("Id");
		el.setIdAttribute("Id", true);
		this.ref = fac.newReference("#" + id,
				fac.newDigestMethod(DigestMethod.SHA1, null), transformList,
				null, null);
		this.si = fac
				.newSignedInfo(fac.newCanonicalizationMethod(
						CanonicalizationMethod.INCLUSIVE,
						(C14NMethodParameterSpec) null), fac
						.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
						Collections.singletonList(ref));
		this.signature = fac.newXMLSignature(si, ki);
		this.dsc = new DOMSignContext(privateKey,
		/*
		 * document.getDocumentElement().getElementsByTagName(tipo).item(indexNFe
		 * )
		 */this.document.getFirstChild());
		this.signature.sign(this.dsc);
	}

	public void assinaInfRpsNFSe(String tipo, XMLSignatureFactory fac,
			ArrayList<Transform> transformList, PrivateKey privateKey,
			KeyInfo ki, Document document, int indexNFe)
			throws NoSuchAlgorithmException,
			InvalidAlgorithmParameterException, MarshalException,
			XMLSignatureException, javax.xml.crypto.MarshalException {
		if (tipo.equals(Assinador.EnviarLoteRpsEnvio)) {
			this.elements = this.document.getDocumentElement()
					.getElementsByTagName("LoteRps");
		}
		if (tipo.equals(Assinador.RPS)) {
			this.elements = this.document.getElementsByTagName("tipos:InfRps");
		}

		this.el = (org.w3c.dom.Element) this.elements.item(indexNFe);
		String id = el.getAttribute("Id");
		el.setIdAttribute("Id", true);
		this.ref = fac.newReference("#" + id,
				fac.newDigestMethod(DigestMethod.SHA1, null), transformList,
				null, null);
		this.si = fac
				.newSignedInfo(fac.newCanonicalizationMethod(
						CanonicalizationMethod.INCLUSIVE,
						(C14NMethodParameterSpec) null), fac
						.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
						Collections.singletonList(ref));
		this.signature = fac.newXMLSignature(si, ki);
		this.dsc = new DOMSignContext(privateKey, document.getDocumentElement()
				.getElementsByTagName(tipo).item(indexNFe));
		this.signature.sign(this.dsc);
	}

	public String assinaXML(String acao, String xml, String certificado,
			String senha) throws Exception {
		if (acao.equals("NFSe")) {
			return assinaNFSe(xml, certificado, senha, 0);
		}

		return null;
	}

	public String assinaNFSe(String xml, String certificado, String senha,
			int indexNFe) throws Exception {
		
		this.document = documentFactory(xml);
		this.signatureFactory = XMLSignatureFactory.getInstance("DOM");
		this.transformList = signatureFactory(this.signatureFactory);
		loadCertificates(certificado, senha, this.signatureFactory);

		assinaLoteRpsNFSe(Assinador.EnviarLoteRpsEnvio, this.signatureFactory,
				this.transformList, this.privateKey, this.keyInfo,
				this.document, 0);

		for (int i = 0; i < this.document.getDocumentElement()
				.getElementsByTagName(Assinador.RPS).getLength(); i++) {
			assinaInfRpsNFSe(Assinador.RPS, this.signatureFactory,
					this.transformList, this.privateKey, this.keyInfo,
					this.document, i);
		}
		return outputXML(this.document);
	}

}

Tente adaptar para seu caso já que o original assinava NFe.
Qualquer dúvida posta ai que nós ajudamos.

B

opa!
Estou tendo retorno de "assinatura invalida"

Consegui assinar, mas não está valido, estou usando este codigo: Metodo de web service que estou fazendo: nfeRecepcaoEventos( para a manifestação de destinatário)
package br.com.controles.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 *
 * @author Accipiens
 */
public class AssinarXml {

    private static final String INFEVENTO = "infEvento";
    private static final String EVENTO = "evento";
    private static final String ENVEVENTO = "envEvento";

    private PrivateKey privateKey;
    private KeyInfo keyInfo;

    public String assinaEnvEvento(String xml, String certificado, String senha) throws Exception {
        Document document = documentFactory(xml);
        XMLSignatureFactory signatureFactory = XMLSignatureFactory.getInstance("DOM");
       ArrayList<Transform> transformList = signatureFactory(signatureFactory);
        loadCertificates(certificado, senha, signatureFactory);

        for (int i = 0; i < document.getDocumentElement().getElementsByTagName(INFEVENTO).getLength(); i++) {
            assinar(signatureFactory, transformList, privateKey, keyInfo, document, i);
        }
        return outputXML(document);
    }

    private void assinar(XMLSignatureFactory fac,
            ArrayList<Transform> transformList, PrivateKey privateKey,
            KeyInfo ki, Document document, int index) throws Exception {
        NodeList elements = null;

        elements = document.getElementsByTagName(INFEVENTO);
        org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(index);
        String id = el.getAttribute("Id");  
        el.setIdAttribute("Id", true); 
  
        System.out.println("INDEX "+index);
        Reference ref = fac.newReference("#" + id,
                fac.newDigestMethod(DigestMethod.SHA1, null), transformList,
                null, null);

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

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

        DOMSignContext dsc = new DOMSignContext(privateKey,
                document.getDocumentElement().getElementsByTagName(INFEVENTO).item(index));
        signature.sign(dsc);
    }

    public ArrayList<Transform> signatureFactory(
            XMLSignatureFactory signatureFactory)
            throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
        ArrayList<Transform> transformList = new ArrayList<Transform>();
        TransformParameterSpec tps = null;
        Transform envelopedTransform = signatureFactory.newTransform(
                Transform.ENVELOPED, tps);
        Transform c14NTransform = signatureFactory.newTransform(
                "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);

        transformList.add(envelopedTransform);
        transformList.add(c14NTransform);
        return transformList;
    }

    public Document documentFactory(String xml) throws SAXException,
            IOException, ParserConfigurationException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        Document document = factory.newDocumentBuilder().parse(
                new ByteArrayInputStream(xml.getBytes()));
        return document;
    }

    public void loadCertificates(String certificado, String senha,
            XMLSignatureFactory signatureFactory) throws Exception {

        InputStream entrada = new FileInputStream(certificado);
        KeyStore ks = KeyStore.getInstance("pkcs12");
        try {
            ks.load(entrada, senha.toCharArray());
        } catch (IOException e) {
            throw new Exception("Senha do Certificado Digital incorreta ou Certificado inválido.");
        }

        KeyStore.PrivateKeyEntry pkEntry = null;
        Enumeration<String> aliasesEnum = ks.aliases();
        while (aliasesEnum.hasMoreElements()) {
            String alias = (String) aliasesEnum.nextElement();
            if (ks.isKeyEntry(alias)) {
                pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
                        new KeyStore.PasswordProtection(senha.toCharArray()));
                privateKey = pkEntry.getPrivateKey();
                break;
            }
        }

        X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
        info("SubjectDN: " + cert.getSubjectDN().toString());

        KeyInfoFactory keyInfoFactory = signatureFactory.getKeyInfoFactory();
        List<X509Certificate> x509Content = new ArrayList<X509Certificate>();

        x509Content.add(cert);
        X509Data x509Data = keyInfoFactory.newX509Data(x509Content);
        keyInfo = keyInfoFactory.newKeyInfo(Collections.singletonList(x509Data));
    }

    public String outputXML(Document doc) throws TransformerException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));
        String xml = os.toString();
        if ((xml != null) && (!"".equals(xml))) {
            xml = xml.replaceAll("\\r\\n", "");
            xml = xml.replaceAll(" standalone=\"no\"", "");
        }
        return xml;
    }

    public static String lerXML(String fileXML) throws IOException {
        String linha = "";
        StringBuilder xml = new StringBuilder();

        BufferedReader in = new BufferedReader(new InputStreamReader(
                new FileInputStream(fileXML)));
        while ((linha = in.readLine()) != null) {
            xml.append(linha);
        }
        in.close();

        return xml.toString();
    }

    /**
     * Log ERROR.
     *
     * @param error
     */
    public static void error(String error) {
        System.out.println("| ERROR: " + error);
    }

    /**
     * Log INFO.
     *
     * @param info
     */
    public static void info(String info) {
        System.out.println("| INFO: " + info);
    }

   
    }
}

e para executar a função estou fazendo isso:

String xmlEnviNFe = AssinarXml.lerXML(caminhoArqXml);
        String xmlEnviNFeAssinado = assinarxml.assinaEnvEvento(xmlEnviNFe,
                caminhoDoCertificadoDoCliente,
                senhaDoCertificadoDoCliente);
        AssinarXml.info("XML EnviNFe Assinado: " + xmlEnviNFeAssinado);

Esté é o xml com a assinatura invalida(mas assinado):

<?xml version="1.0" encoding="UTF-8"?>
<envEvento xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.00">
    <idLote>1</idLote>
    <evento versao="1.00">
        <infEvento Id="ID2102104314019301500600291455020000024141127099561901">
            <cOrgao>43</cOrgao>
            <tpAmb>1</tpAmb>
            <CNPJ>06044680000121</CNPJ>
            <chNFe>43140193015006002914550200000241411270995619</chNFe>
            <dhEvento>2014-01-10T15:41:02-02:00</dhEvento>
            <tpEvento>210210</tpEvento>
            <nSeqEvento>1</nSeqEvento>
            <verEvento>1.00</verEvento>
            <detEvento versao="1.00">
                <descEvento>Ciencia da Operacao</descEvento>
            </detEvento>
        </infEvento>
    </evento>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
            <Reference URI="#ID2102104314019301500600291455020000024141127099561901">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                    <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <DigestValue>jGiw4TTvrO+jjx3RTehIMEtRfRI=</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>NJQn2Mii+lH23qCcamu1ggj2H1h62Yb6hdrCUT2/uO4m1YqRI3MZkqndW/RNTO+if9DLstxEHsDTM1yxSA+fwm/ElEy5Ao9tfsG+ODH9+zQ1wbQrr88tnWkMuFFQK+HW3lbo/sX0UY+yHTXnyzzl5KZxPjHwwv8x+SEJby1B0AcHf/QLCjHhL/HHME5fKwMa+XT+g/GYoB5N9fw6WquME8qLl+ZdubSNOFm8BPTQ+hHvQYti2zsDzH9NEHokeVhiIitVVRC1ZNMcffPEyXl5GMTn9Ic+xh6R6VwmZ9+uw8Q0USQsvT2lqM96008PH+pnPKJ0vcslFkWBjY0jg6VMyg==</SignatureValue>
        <KeyInfo>
    <X509Data>
        <X509Certificate>MIIHHjCCBQagAwIBAgIIWqoK72LB5AwwDQYJKoZIhvcNAQELBQAwXTELMAkGA1UEBhMCQlIxEzARBgNVBAoMCklDUC1CcmFzaWwxIDAeBgNVBAsMF0NhaXhhIEVjb25vbWljYSBGZWRlcmFsMRcwFQYDVQQDDA5BQyBDQUlYQSBQSiB2MjAeFw0xMzExMjYxNzMyMDNaFw0xNDExMjYxNzMyMDNaMIGgMQswCQYDVQQGEwJCUjETMBEGA1UECgwKSUNQLUJyYXNpbDEgMB4GA1UECwwXQ2FpeGEgRWNvbm9taWNhIEZlZGVyYWwxFzAVBgNVBAsMDkFDIENBSVhBIFBKIHYyMUEwPwYDVQQDDDhBQ0NJUElFTlMgU0lTVEVNQVMgREUgSU5GT1JNQVRJQ0EgTFREQSAtIEVQUDo0OTM0NzI4NDA2ODCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJ0U7lfT3xhZ6XQVeGBl4puSHUHy0v0qA33OHcPfGMTQgWVi/UBmoAsuJT80Xc3Y++/+/IzN0i/1kYaZc7HJDDN42P5c1V1Ccn7/bgbDOEvH3woLVhMjlQTha1zWOWhvGYYLWq4WBhZORoLRxJKx52OquuJgqxY4CtQuXeEIojDEJr7nEv2m1lUtUzzhhigNgLP0lPtM42iQ4nvyCcv+O5iFWQuWtFOy/lBRt5qKX2V9zdVNmIw/7nH4HR5lnpqEPcTXTkT4GJ/yj//qXldZhchu1Z0jVzElcSaFyTj2N9DkTSJCbz/hNU5UqjiZFsmNKQfOSC1v9kFcAai9uZAzbOECAwEAAaOCApwwggKYMA4GA1UdDwEB/wQEAwIF4DApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisGAQQBgjcUAgIwHQYDVR0OBBYEFHfLXWoVreC2WRBR6Xn3rmSJQBQzMB8GA1UdIwQYMBaAFE9NDQGcamnbcAmk3jOu9nySnjXCMIGeBgNVHREEgZYwgZOgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwoD4GBWBMAQMEoDUEMzIyMDUxOTY5NDkzNDcyODQwNjgwMDAwMDAwMDAwMDAwMDAwNDYzNzk3MTc2NURFVFJSU6AZBgVgTAEDA6AQBA4wNjA0NDY4MDAwMDEyMaAdBgVgTAEDAqAUBBJMRUFORFJPIFNBTEVTIExBUkEwZgYDVR0gBF8wXTBbBgZgTAECAQkwUTBPBggrBgEFBQcCARZDaHR0cDovL2NlcnRpZmljYWRvZGlnaXRhbC5jYWl4YS5nb3YuYnIvZG9jdW1lbnRvcy9kcGNhYy1jYWl4YXBqLnBkZjCBuQYDVR0fBIGxMIGuMC2gK6AphidodHRwOi8vbGNyLmNhaXhhLmdvdi5ici9hY2NhaXhhcGp2Mi5jcmwwLqAsoCqGKGh0dHA6Ly9sY3IyLmNhaXhhLmdvdi5ici9hY2NhaXhhcGp2Mi5jcmwwTaBLoEmGR2h0dHA6Ly9yZXBvc2l0b3Jpby5pY3BicmFzaWwuZ292LmJyL2xjci9DQUlYQS9BQ0NBSVhBUEovYWNjYWl4YXBqdjIuY3JsMFYGCCsGAQUFBwEBBEowSDBGBggrBgEFBQcwAoY6aHR0cDovL2NlcnRpZmljYWRvZGlnaXRhbC5jYWl4YS5nb3YuYnIvYWlhL2FjY2FpeGFwanYyLnA3YjANBgkqhkiG9w0BAQsFAAOCAgEAU3hblHSuGa3dooITD9Im8B8iDGcpPf7rd0nck/w64NaRbZ82/qf1PbpXr1HmaMWGO9nf2gavPR2AyrBAlQmJNCSoNZv7QuQH3sUwqQoHIOnoPQi3enrwaasWoMtHZP9hhMvqTicrRa2Xu/y49ZkJFXlsyuBMtT9MmwVh7f8gL6Mv/lgij9H+fZdV9Co3itpoX3JYZAEkve2ihnUTLANJxgZrO/vjGNuQz9rQgFj9ba/CGIA7AObn7uZKcopwACoHVXSL3Uvq/d3xntNUW2oVTbAH+if4GQK+sVm+BLtYdJoYkq9zYU23918V51nLW60vvGlaJexZ0dbBWw33AlUKOd76sZz28SK4oRscUkPpsCTJs8OAE2nzpqHGG/JBWKoiwagSBzTtgzVFJKM75ad+vy67sQuWrHJVDbS3YUbJjXByBHwFfJh0xm4Fr7BUkj6Fe0udf25zPZJ72pXKy/yXl52c29zntvDxc9geBrJOGydnWhrKjmGmFSOGESNJ4QQ0VddeR9XrqYij3zvjGl+W8z3AYgH3/tpbyOSxO7jfbbyBSTugf6+dFvJvirgbyTflDEIegiJuZ/zrQmwlC4GWvlb5OU+4qxB0LW6blns4Ey/gDjRHX5OXOQjGnrVxvsvSZyVlmJ48BcrpMpE636MMM1AVcjXtlTgJUojyTNoshtc=</X509Certificate>
    </X509Data>
        </KeyInfo>
    </Signature>
</envEvento>
I

Pessoal, e como fazer pra assinar sem Id ?

Se não informo Id dá erro de referência!

Existe casos como nfse que não tem id.

Criado 20 de junho de 2013
Ultima resposta 24 de mai. de 2014
Respostas 41
Participantes 13