eae camaradas, eu denovo, agora descobri que minha assinatura ta faltando uma tag, se alguem puder me ajudar agradeço, na validação acusa que falta a seguinte tag essa que coloco em negrito, essa realmente não consta na minha assinatura, mas sim nos xml nf-e de exemplo dareceita
abaixo lanço o cod. que uso pra assianr, saiu daqui mesmo do guj, são 2 classes obrigado.
package nfe.signature;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.UnrecoverableEntryException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
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.parsers.ParserConfigurationException;
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 org.xml.sax.SAXException;
public class AssinaXML {
public static String keyStoreP12 = "PKCS12";
public static String keyStoreJKS = "JKS";
public static Reference ref = null;
public static SignedInfo si = null;
public static XMLSignature signature = null;
public static DOMSignContext dsc = null;
private String certificadoArquivo = "";
private String certificadoSenha = "";
private String arquivoEntrada = "";
private String arquivoSaida = "";
private String keyStore = "";
public AssinaXML(String arquivoCertificado, String senhaCertificado,
String arquivoEntradaXML, String arquivoSaidaXML, String keyStore){
this.certificadoArquivo = arquivoCertificado;
this.certificadoSenha = senhaCertificado;
this.arquivoEntrada = arquivoEntradaXML;
this.arquivoSaida = arquivoSaidaXML;
this.keyStore = keyStore;
}
public static XMLSignature getSignature() {
return signature;
}
public static void setSignature(XMLSignature signature) {
AssinaXML.signature = signature;
}
public String getCertificadoArquivo() {
return certificadoArquivo;
}
public void setCertificadoArquivo(String certificadoArquivo) {
this.certificadoArquivo = certificadoArquivo;
}
public String getCertificadoSenha() {
return certificadoSenha;
}
public void setCertificadoSenha(String certificadoSenha) {
this.certificadoSenha = certificadoSenha;
}
public String getArquivoEntrada() {
return arquivoEntrada;
}
public void setArquivoEntrada(String arquivoEntrada) {
this.arquivoEntrada = arquivoEntrada;
}
public String getArquivoSaida() {
return arquivoSaida;
}
public void setArquivoSaida(String arquivoSaida) {
this.arquivoSaida = arquivoSaida;
}
public String getKeyStore() {
return keyStore;
}
public void setKeyStore(String keyStore) {
this.keyStore = keyStore;
}
@SuppressWarnings("unchecked")
public void colocaCertificado(){
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
try {
KeyStore ks = KeyStore.getInstance(getKeyStore());
ks.load(new FileInputStream(getCertificadoArquivo()), getCertificadoSenha().toCharArray());
KeyStore.PrivateKeyEntry keyEntry = null;
for(Enumeration e = ks.aliases(); e.hasMoreElements();){
keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry((String) e.nextElement(),
new KeyStore.PasswordProtection(getCertificadoSenha().toCharArray()));
}
X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
KeyInfoFactory kif = fac.getKeyInfoFactory();
ArrayList 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 FileInputStream(getArquivoEntrada()));
dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
assinatura(fac, x509Content, keyEntry.getPrivateKey(), ki, doc);
OutputStream os = new FileOutputStream(getArquivoSaida());
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0){
throw new Exception("Nao encontrou elemento (TAG) Signature!!!");
}
DOMValidateContext valContext = new DOMValidateContext(new X509KeySelector(), nl.item(0));
XMLSignature signature1 = fac.unmarshalXMLSignature(valContext);
boolean coreValidity = signature1.validate(valContext);
if (coreValidity == false) {
System.err.println("Signature failed core validation");
boolean sv = signature.getSignatureValue().validate(valContext);
System.out.println("signature validation status: " + sv);
if (sv == false) {
Iterator i = signature.getSignedInfo().getReferences().iterator();
for (int j=0; i.hasNext(); j++) {
boolean refValid = ((Reference) i.next()).validate(valContext);
System.out.println("ref["+j+"] validity status: " + refValid);
}
}
}
else {
System.out.println("Signature passed core validation");
}
valContext.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE);
XMLSignature signaturex = fac.unmarshalXMLSignature(valContext);
@SuppressWarnings("unused")
boolean coreValidityx = signaturex.validate(valContext);
Iterator i = signature.getSignedInfo().getReferences().iterator();
for (int j=0; i.hasNext(); j++) {
@SuppressWarnings("unused")
InputStream is = ((Reference) i.next()).getDigestInputStream();
}
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (UnrecoverableEntryException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private static void assinatura(XMLSignatureFactory fac,
ArrayList transformList,
PrivateKey privateKey,
KeyInfo ki,
Document doc
) throws Exception {
NodeList elements = doc.getElementsByTagName("infNFe");
Element el = (org.w3c.dom.Element) elements.item(0);
String id = el.getAttribute("Id");
ref = fac.newReference("#" + id, fac.newDigestMethod(
DigestMethod.SHA1, null),
Collections.singletonList (
fac.newTransform(Transform.ENVELOPED,
(TransformParameterSpec) null)), null, null);
si = fac.newSignedInfo(fac.newCanonicalizationMethod(
CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null),
fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
Collections.singletonList(ref));
DOMSignContext dsc = new DOMSignContext(privateKey,doc.getElementsByTagName("NFe").item(0));
signature = fac.newXMLSignature(si, ki);
signature.sign(dsc);
}
public static void main(String[] args) {
AssinaXML ax3 = new AssinaXML("src/nfe/resources/Associacao.pfx", "associacao",
"src/nfe/resources/NF-e.xml",
"src/nfe/resources/assinadas/NF-e.xml", AssinaXML.keyStoreP12);
ax3.colocaCertificado();
}
}
package nfe.signature;
import java.security.Key;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.Iterator;
import javax.xml.crypto.AlgorithmMethod;
import javax.xml.crypto.KeySelector;
import javax.xml.crypto.KeySelectorException;
import javax.xml.crypto.KeySelectorResult;
import javax.xml.crypto.XMLCryptoContext;
import javax.xml.crypto.XMLStructure;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.X509Data;
public class X509KeySelector extends KeySelector {
@SuppressWarnings("unchecked")
public KeySelectorResult select(KeyInfo keyInfo,
KeySelector.Purpose purpose,
AlgorithmMethod method,
XMLCryptoContext context)
throws KeySelectorException {
Iterator ki = keyInfo.getContent().iterator();
while (ki.hasNext()) {
XMLStructure info = (XMLStructure) ki.next();
if (!(info instanceof X509Data))
continue;
X509Data x509Data = (X509Data) info;
Iterator xi = x509Data.getContent().iterator();
while (xi.hasNext()) {
Object o = xi.next();
if (!(o instanceof X509Certificate))
continue;
final PublicKey key = ((X509Certificate)o).getPublicKey();
// Make sure the algorithm is compatible
// with the method.
if (algEquals(method.getAlgorithm(), key.getAlgorithm())) {
return new KeySelectorResult() {
public Key getKey() { return key; }
};
}
}
}
throw new KeySelectorException("No key found!");
}
static boolean algEquals(String algURI, String algName) {
if ((algName.equalsIgnoreCase("DSA") &&
algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) ||
(algName.equalsIgnoreCase("RSA") &&
algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1))) {
return true;
} else {
return false;
}
}
}