[ERRO] NF-e Assinatura no AIX

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

Pelo que parece, seu processo de assinatura funciona.
Acho que o erro está relacionado ao XML. Verifique se a estrutura está correta.
Coloque o XML neste endereço, que faz a validação: http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx .
Verifique também se a senha e o caminho onde se encontra o certificado estão ok.

[quote=cinei]Pelo que parece, seu processo de assinatura funciona.
Acho que o erro está relacionado ao XML. Verifique se a estrutura está correta.
Coloque o XML neste endereço, que faz a validação: http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx .
Verifique também se a senha e o caminho onde se encontra o certificado estão ok.[/quote]

Cinei,

Na verdade descobri o erro.

O jre 6.0 do AIX é feito pela IBM, e não pela Sun. O da IBM não possui as packages sun.security., com.sun.net. e com.sun.crypto.*.

Assim, a assinatura não consegue encontrar o Provider certo para assinatura em RSA.

Só não sei como resolver este problema.

Fernando Hirata Alexandre