Boa tarde a todos, sou novato em programação Java, porém, nas linguagens que utilizo tenho dificuldade para assinar um xml no padrão nfe, então, descobri um código Java que faz isso, só que a pessoa que deixou este código não colocou os imports necessários, utilizei a tecla control, shift e "o" do eclipse, mas não obtive sucesso segue abaixo o código.
(aponta o erro na linha que contém o objeto APPSET).
Pergunta
jo_user
Boa tarde a todos, sou novato em programação Java, porém, nas linguagens que utilizo tenho dificuldade para assinar um xml no padrão nfe, então, descobri um código Java que faz isso, só que a pessoa que deixou este código não colocou os imports necessários, utilizei a tecla control, shift e "o" do eclipse, mas não obtive sucesso segue abaixo o código.
(aponta o erro na linha que contém o objeto APPSET).
Obrigado pela atenção.
at. Josué
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
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.DocumentBuilder;
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 com.sun.xml.internal.bind.Util;
public class AssinaXML {
public static void main(String[] args) {
System.out.println(signature("D:\\temp\\nfe.xml", "d:\\temp\\xxx.xml","infNFe"));
}
public static String signature(String xmlFileName, String xmlResponseName,
String idNode) {
try {
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File(xmlFileName));
// Create a DOM XMLSignatureFactory that will be used to
// generate the enveloped signature.
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 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.
char[] pin =
Util.undoHexCodified(APPSet.getProperty("pin")).toCharArray();
/*aponta o erro na linha acima o objeto APPSET.
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
new FileInputStream(new File(APPSet.getProperty("certificado")));
/*aponta o erro na linha acima o objeto APPSET.
ks.load(fis, pin);
KeyStore.PrivateKeyEntry pkEntry = null;
Enumeration aliasesEnum = ks.aliases();
PrivateKey privateKey = null;
while (aliasesEnum.hasMoreElements()) {
String alias = (String)aliasesEnum.nextElement();
System.out.println(alias);
if (ks.isKeyEntry(alias)) {
pkEntry =
(KeyStore.PrivateKeyEntry)ks.getEntry(alias, new KeyStore.PasswordProtection(pin));
privateKey = pkEntry.getPrivateKey();
break;
}
}
X509Certificate cert = (X509Certificate)pkEntry.getCertificate();
// Create the KeyInfo containing the X509Data.
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo que = kif.newKeyInfo(Collections.singletonList(xd));
assinarXML(fac, transformList, privateKey, que, doc, idNode);
// Output the resulting document.
ByteArrayOutputStream os = new ByteArrayOutputStream();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
File fout = new File(xmlResponseName);
FileOutputStream out = new FileOutputStream(fout);
try {
out.write(os.toByteArray());
} catch (Exception e) {
}
//return os.toString();
return "ok";
} catch (Exception e) {
e.printStackTrace();
return e.toString();
}
}
private static void assinarXML(XMLSignatureFactory fac,
ArrayList transformList,
PrivateKey privateKey, KeyInfo que,
Document doc,
String idNode) throws Exception {
// Obtem elemento do documento a ser assinado, será criado uma REFERENCE para o mesmo
NodeList elements = doc.getElementsByTagName(idNode);
Element el = (Element)elements.item(0);
String id = el.getAttribute("Id");
// 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));
XMLSignature signature = fac.newXMLSignature(si, que);
DOMSignContext dsc =
new DOMSignContext(privateKey, doc.getDocumentElement());
signature.sign(dsc);
}
}
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.