Problema - Assinatura Digital XML de NFe

0 respostas
R

Olá pessoal,

Estou desenvolvendo uma aplicação Java para assinar arquivos XML de NFe. Sei que isso já foi discutido aqui em outros tópicos, mais mesmo consultando-os não consegui resolver meu problema.

Meu arquivo XML está sendo assinado, no entanto na seção Transforms da Assinatura digital, está aparecendo somente um transform (isso dá erro ao validar a NFe).

Exemplo:

<Transforms>
  <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
  </Transforms>

Enquanto o correto seria:

<Transforms>
  <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> 
  <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> 
  </Transforms>

O meu código de gerar assinatura está abaixo: Peço que me falem o que está errado, se possível me dê um exemplo, pois meu Java é meio básico ainda…

Codigo de Assinatura:

//DECLARAÇÃO / INSTANCIAÇÃO DAS VARIÁVEIS  
        
        String input        =   args [ 0 ];
        String certificado  =   args [ 1 ];
        String cert_alias   =   args [ 2 ];
        String cert_pass    =   args [ 3 ];
        String cert_X509    =   args [ 4 ];
   String providerName = System.getProperty("jsr105Provider",
       "org.jcp.xml.dsig.internal.dom.XMLDSigRI");

   XMLSignatureFactory fac =
       XMLSignatureFactory.getInstance("DOM",
       (Provider) Class.forName(providerName).newInstance());
   
          DocumentBuilderFactory dbf =
           DocumentBuilderFactory.newInstance();
       dbf.setNamespaceAware(true);
       Document doc = 
           dbf.newDocumentBuilder().
           parse(new FileInputStream(input));

   // OBTEM O ID DA NOTA FISCAL QUE SERÁ ASSINADA
         
         NodeList elements = doc.getElementsByTagName("infNFe");
         Element el = (Element) elements.item(i);
         String id = el.getAttribute("Id");
   
   
   Reference ref =
       fac.newReference("#" + id,
           fac.newDigestMethod(DigestMethod.SHA1, null),
               Collections.singletonList(
                   fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec)null)), 
           null, null);

       SignedInfo si = fac.newSignedInfo
           (fac.newCanonicalizationMethod
             (CanonicalizationMethod.INCLUSIVE, 
                (C14NMethodParameterSpec) null), 
            fac.newSignatureMethod(SignatureMethod.RSA_SHA1, 
                null),
            Collections.singletonList(ref));
            
     
        PrivateKey privateKey = null;
        privateKey = KeyStoreInfo.getPrivateKeyFromFile(certificado,cert_alias,cert_pass);
     
     
   
        KeyInfo ki = null; 
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        FileInputStream fis = new FileInputStream(cert_X509);
        java.security.cert.Certificate cert = cf.generateCertificate(fis);
        fis.close();
        X509Data x509d = kif.newX509Data (Collections.singletonList(cert));
        ki = kif.newKeyInfo(Collections.singletonList(x509d));


        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(512);
        KeyPair kp = kpg.generateKeyPair();

       DOMSignContext dsc = new DOMSignContext
        (kp.getPrivate(), doc.getDocumentElement());

       XMLSignature signature = fac.newXMLSignature(si, ki);
          signature.sign(dsc);

       TransformerFactory tf = TransformerFactory.newInstance();
       Transformer trans = tf.newTransformer();
       trans.transform(
           new DOMSource(doc),
           new StreamResult(
               new FileOutputStream(output))); 
        
               
       }
          
  }

qualquer ajuda é bem vinda! estou desesperado e ficando careca!

Criado 10 de junho de 2008
Respostas 0
Participantes 1