Boa tarde,
Estou tendo problemas na criação da Assinatura Digital da NF-e em um servidor AIX, com JDK 6 e TomCat 6.0.32.
Na hora de gerar a Assinatura está dando o seguinte erro:
Caused by: java.lang.UnsupportedOperationException: Internal Error
at com.ibm.xml.crypto.dsig.dom.transform.Enveloped.transform(Enveloped.java:80)
at org.jcp.xml.dsig.internal.dom.DOMTransform.transform(Unknown Source)
at org.jcp.xml.dsig.internal.dom.DOMReference.transform(Unknown Source)
at org.jcp.xml.dsig.internal.dom.DOMReference.digest(Unknown Source)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(Unknown Source)
at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(Unknown Source)
at br.com.elucid.wstrade.nfe.assinatura.Assinatura.assinar(Assinatura.java:279)
... 16 more
Segue abaixo o código da Assinatura:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.security.KeyStore;
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.jcp.xml.dsig.internal.dom.XMLDSigRI;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class Assinatura{
private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
private static final String XML_SIGNATURE_TYPE = "DOM";
public String assinar(String xml){
String retorno = null;
try{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document docs = builder.parse(new ByteArrayInputStream(xml.getBytes()));
NodeList elements = docs.getElementsByTagName("infNFe");
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
XMLSignatureFactory fac = XMLSignatureFactory.getInstance(XML_SIGNATURE_TYPE, new XMLDSigRI());
TransformParameterSpec tps = null;
Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
ArrayList transformList = new ArrayList();
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
DigestMethod dm = fac.newDigestMethod(DigestMethod.SHA1, null);
Reference ref = fac.newReference("#" + id, dm, transformList, null, null);
CanonicalizationMethod cm = fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null);
SignatureMethod sm = fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null);
SignedInfo si = fac.newSignedInfo(cm, sm, Collections.singletonList(ref));
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream("path");
char[] senha = "password".toCharArray();
ks.load(fis, senha);
fis.close();
Enumeration aliasesEnum = null;
aliasesEnum = ks.aliases();
String alias = "";
while(aliasesEnum.hasMoreElements()){
alias = (String) aliasesEnum.nextElement();
if(ks.isKeyEntry(alias)){
break;
}
}
KeyStore.Entry entry = null;
KeyStore.PasswordProtection kspp = new KeyStore.PasswordProtection(senha);
entry = ks.getEntry(alias, kspp);
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) entry;
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 = null;
ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());
doc = dbf.newDocumentBuilder().parse(bais);
bais.close();
Node node = doc.getElementsByTagName("NFe").item(0);
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), node);
XMLSignature signature = fac.newXMLSignature(si, ki);
signature.sign(dsc);
OutputStream os = new ByteArrayOutputStream();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = null;
trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
retorno = os.toString();
os.close();
}catch(Exception e){
e.printStackTrace();
}
return retorno;
}
}
O erro está ocorrendo na chamada da linha 116 “signature.sign(dsc);”
Alguém sabe como resolver este problema?
Obrigado
Fernando Hirata Alexandre