[RESOLVIDO] Assinatura do pedido de cancelamento da NF-e

0 respostas
javer
Alguém teria um exemplo da assinatura do pedido de cancelamento da NF-e. Meu XML está assim:
<?xml version="1.0" encoding="UTF-8" ?>
<CancNFe versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe">     
    <infCanc Id="ID35100902767116000186550010000266291010733080" >         
        <tpAmb>2</tpAmb>         
        <xServ>CANCELAR</xServ>         
        <chNFe>35100902767116000186550010000266291010733080</chNFe>         
        <nProt>837479588686</nProt>         
        <xJust>CLIENTE CANCELOU O SERVIÇO/COMPRA</xJust>     
    </infCanc>
</CancNFe>

Não estou sabendo pegar o elemento que vai ser assinado, o manual diz que é o ID do infCanc, mas como?

Essa parte do código eu usei o mesmo que assino a nota.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xmlCanc.getBytes("UTF8")));

        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

        ArrayList transformList = new ArrayList();
        TransformParameterSpec tps = null;
        Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
        Transform c14NTransform = fac.newTransform(NFe.C14N_TRANSFORM_METHOD, tps);

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

        KeyStore ks = KeyStore.getInstance(NFe.TIPO_KEYSTORE_A3); // PKCS11
        ks.load(null, Global.SENHA_CERTIFICADO_EMITENTE.toCharArray());

        KeyStore.PrivateKeyEntry pkEntry = null;
        Enumeration aliasesEnum = ks.aliases();
        PrivateKey privateKey = null;
        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(Global.SENHA_CERTIFICADO_EMITENTE.toCharArray()));

        pkEntry = keyEntry; 
        privateKey = pkEntry.getPrivateKey();

        X509Certificate cert = (X509Certificate) pkEntry.getCertificate();

        KeyInfoFactory kif = fac.getKeyInfoFactory();
        List x509Content = new ArrayList();
        x509Content.add(cert);

        X509Data xd = kif.newX509Data(x509Content);
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
...
Agora essa parte está tudo errado:
...
        NodeList elements = doc.getElementsByTagName("CancNFe");
        Element el = (Element) elements.item(0);
        String id = el.getAttribute("Id");
        Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);

        // Cria a informacao da assinatura
        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);

        Node node = doc.getDocumentElement().getElementsByTagName("CancNFe").item(0);
        DOMSignContext dsc = new DOMSignContext(privateKey, node);
        signature.sign(dsc);
Resolvi graças a este post
Criado 24 de setembro de 2010
Respostas 0
Participantes 1