Assinaturas de arquivos xml da NFe

OPA, vou testar aqui…

o trust nao vou trocar pq ja uso assim, ok?

System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", "jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

o que voce coloca no ALIAS?

VALEU!!!

troquei la

fiz assim:

System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
System.setProperty("javax.net.ssl.keyStore", "NONE");
System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-Safenetikey2032");
System.setProperty("javax.net.ssl.keyStoreAlias", "Safenetikey2032");
System.setProperty("javax.net.ssl.keyStorePassword", certPass);

deu erro denovo
no debug
deu isso

[list]
keyStore is : NONE
keyStore type is : PKCS11
keyStore provider is : SunPKCS11-Safenetikey2032
init keystore
default context init failed: java.security.NoSuchProviderException: no such prov
ider: SunPKCS11-Safenetikey2032
[/list]

o card funcionou tao bem, agora o token ta me deixando preocupado…

Este erro é tipico quando o nome dentro do .cfg esta errado.
Tente algumas alteracoes neste nome, tipo name = Card, e no provider toque por SunPKCS11Card.
Sei que passei por isso e era no nome o problema.
O que acontece no caso java.security.NoSuchProviderException é porque nao encontrou a dll.

Alencar

pessoal alguem poderia me ajudar estou usando o codigo deixado acima mais estou com um pequeno problema em resolver este erro aqui

java.lang.NullPointerException
at TratadorCertificado.getValidade(TratadorCertificado.java:82)
at TratadorCertificado.getCertificado(TratadorCertificado.java:100)
at TratadorCertificado.main(TratadorCertificado.java:159)

ja aconteceu com alguem ?

[quote=evandromib]pessoal alguem poderia me ajudar estou usando o codigo deixado acima mais estou com um pequeno problema em resolver este erro aqui

java.lang.NullPointerException
at TratadorCertificado.getValidade(TratadorCertificado.java:82)
at TratadorCertificado.getCertificado(TratadorCertificado.java:100)
at TratadorCertificado.main(TratadorCertificado.java:159)

ja aconteceu com alguem ?[/quote]

Poderia especificar qual dos codigos acima voce esta usando?
Ja debugou para ver onde da o erro exatamente?

Alencar

o codigo postado pelo tspaulino

consegui ajustar alguns erros e wargings

mais estão aparecendo estes erros aqui qdo executo ele

java.io.IOException: Keystore was tampered with, or password was incorrect
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:771)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:38)
at java.security.KeyStore.load(KeyStore.java:1185)
at TratadorCertificado.getCertificado(TratadorCertificado.java:121)
at TratadorCertificado.getCertificado(TratadorCertificado.java:121)
Caused by: java.security.UnrecoverableKeyException: Password verification failed
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:769)

fiz todas as instalações e importações referentes a os certificados será que esta faltando mais coisas ?

[quote=reinaldoaraujo]Boa tarde pessoal,

Estou tentando assinar um XML da NFe usando o código acima, já consegui efetuar a conexão com o web-server usando o código abaixo:

[b]
System.setProperty(“java.protocol.handler.pkgs”,“com.sun.net.ssl.internal.www.protocol”);
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

System.setProperty(“javax.net.ssl.keyStoreType”, “PKCS12”);
System.setProperty(“javax.net.ssl.keyStore”, verConf.getPathKeyPFX());
System.setProperty(“javax.net.ssl.keyStorePassword”, “xxxx”);

System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
System.setProperty(“javax.net.ssl.trustStore”,verConf.getPathKeyJKS());
[/b]

Alguem já conseguiu assinar um XML NFe usando somente o arquivo .pfx ??[/quote]

O path que você usa é o completo do arquivo (/Users/ze/certificado.pfx) ou relativo ao classpath (/certs/certificado.pfx)?

ola
estou tendo problemas com a assinatura da nfe. (estou usando o codigo daqui http://www.guj.com.br/posts/list/30/83758.java)
eu envio o xml de lote vai tranquilo,ai qdo vou consultar
me retorma a seguinte msg: “Rejeição: Certificado Assinatura inválido”. estou consumindo o ws do PR
Agora eu queria saber… eu estou usando o certificado .pfx para fazer essa assinatura.
Tenho que fazer alguma coisa a mais com o certificado? apenas com o pfx da para fazer a assinatura normalmente??

abraço

[quote=alves.Felipe]ola
estou tendo problemas com a assinatura da nfe. (estou usando o codigo daqui http://www.guj.com.br/posts/list/30/83758.java)
eu envio o xml de lote vai tranquilo,ai qdo vou consultar
me retorma a seguinte msg: “Rejeição: Certificado Assinatura inválido”. estou consumindo o ws do PR
Agora eu queria saber… eu estou usando o certificado .pfx para fazer essa assinatura.
Tenho que fazer alguma coisa a mais com o certificado? apenas com o pfx da para fazer a assinatura normalmente??

abraço[/quote]

Tive este problema e era espacos entre palavras, tipo assim: “palavra palavra”.
O problema é os dois espacos (ou mais) entre palavras. Só pode ter um.

Alencar

Bom dia, somente com o pfx é o suficiente para assinar a nfe, para transmitir precisa de mais alguns certificados,
antes de enviar valide a NFe/Lote no site
http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx
ai voce vai ter certeza se há algo de errado na

abraço

f-schmitt, esse foi o retorno…

Resultado da Validação do Schema e Conferência da Assinatura: 

PARSER XML: OK 
TIPO DE MENSAGEM: Lote NF-e 
SCHEMA: OK 
ASSINATURA XML: 
   Validando NOTA #1 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #2 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #3 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #4 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #5 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #6 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #7 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #8 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #9 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #10 do Lote NF-e: Assinatura ***INVÁLIDA*** 
   Validando NOTA #11 do Lote NF-e: Assinatura ***INVÁLIDA*** 

para transmitir vai tranquilo…
o problema é a assinatura mesmo… pior que agora não tenho nem ideia do que pode ser…
o seu assinador vc fez com base nos códigos ja postados aqui no forum?

[quote=philler][quote=alves.Felipe]ola
estou tendo problemas com a assinatura da nfe. (estou usando o codigo daqui http://www.guj.com.br/posts/list/30/83758.java)
eu envio o xml de lote vai tranquilo,ai qdo vou consultar
me retorma a seguinte msg: “Rejeição: Certificado Assinatura inválido”. estou consumindo o ws do PR
Agora eu queria saber… eu estou usando o certificado .pfx para fazer essa assinatura.
Tenho que fazer alguma coisa a mais com o certificado? apenas com o pfx da para fazer a assinatura normalmente??

abraço[/quote]

Tive este problema e era espacos entre palavras, tipo assim: “palavra palavra”.
O problema é os dois espacos (ou mais) entre palavras. Só pode ter um.

Alencar[/quote]

vou verificar isso tb…
mas como o f-schmitt disse para eu testar no sefaz / rs… e me retorno aquela msg… sera que ainda assim pode ser os espaços em branco?!

valeo

é, seu assinador está com problemas

poste seu xml ou me manda no email

nao, desenvolvi o assinardor aqui…

eu estou trabalhando com 1 nfe por lote, mto mais simples de controlar e não há vantagem nenhuma em fazer varias notas por lote…

Discordo do amigo. O lote é uma ferramenta muito valiosa quando se trata de faturamento
antecipado ao embarque (programado).
Vejamos: o faturista tem 20 pedidos para embarque as 15h.
Emite todas as notas no ERP e gera apenas um lote com todas elas.
Recebe apenas um retorno do lote e emite apenas uma vez todas as DANFES.

Vejam que, quando menciono “apenas uma vez” quero dizer em um só comando e nao
um comando por nota do lote. Isso é ganho de tempo com certeza.

Alencar

nesse cado voce coloca seu erp aos moldes da nfe, mas no nosso caso temos a carga que faz exatamente o que voce explicou…

e se uma dessas 20 notas for denegada ou algo errado, acho (claro que é minha opiniao) controlar o envio e o retorno de cada lote…

no meu caso não fica muito viavel criar um lote por nf…
philler, eu até achei uma String que tinha 2 espaços em branco… mas não é isso o problema não…

f-schmitt, tem mandei o xml e meu assinador por email… blz…

o problema que eu estava tendo é que depois de assinar o xml eu o gravava , e nessa hora eu alterava o xml… por isso
ficava errado a assinatura…
agora eu gravo eu não altero nada. mas antes de gravar eu transformo o Document para string e consumo o WS…
e agora foi… :slight_smile:

mas valeo pela força f-schmitt e philler …

Aproveitando o topico aqui, bom aqui estou eu tentando assinar uma NFe, peguei uns codigo aqui do forum, mexi pouca coisa só pra fazer um teste e to recebendo um erro:

javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: java.lang.NullPointerException
        at org.jcp.xml.dsig.internal.dom.DOMReference.dereference(DOMReference.java:352)
        at org.jcp.xml.dsig.internal.dom.DOMReference.digest(DOMReference.java:278)
        at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.digestReference(DOMXMLSignature.java:447)
        at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.sign(DOMXMLSignature.java:343)

O erro acontece nesta linha:

        DOMSignContext dsc = new DOMSignContext(privateKey, doc.getDocumentElement().getElementsByTagName("NFe").item(i));
        signature.sign(dsc);  //<=== Erro acontece nesta linha

e Eis todo o codigo que peguei aqui mesmo no GUJ.

public static String assinarEnviNFe(String xml, String certificado, String keyStorePass) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        // Document docs = builder.parse(new File(
        // "c:/xml/430802017886010001735500000000010000030371-nfe.xml"));
        Document doc = factory.newDocumentBuilder().parse(
                new ByteArrayInputStream(xml.getBytes()));

        // Create a DOM XMLSignatureFactory that will be used to
        // generate the enveloped signature.
        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");

        // 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.
        KeyStore ks = KeyStore.getInstance("PKCS12");     //MUDEI AQUI PRA PEGAR DIRETO O PFX
        FileInputStream fis = new FileInputStream(certificado);
        //load the keystore
        ks.load(fis, keyStorePass.toCharArray());
        String alias = ks.aliases().nextElement();

        KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(keyStorePass.toCharArray()));

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

        // Create the KeyInfo containing the X509Data.
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        List<Serializable> x509Content = new ArrayList<Serializable>();
        x509Content.add(cert.getSubjectX500Principal().getName());
        x509Content.add(cert);
        X509Data xd = kif.newX509Data(x509Content);
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));

        for (int i = 0; i < doc.getDocumentElement().getElementsByTagName("NFe").getLength(); i++) {
            assinarNFE(fac, transformList, keyEntry.getPrivateKey(), ki, doc, i);
        }
        // Output the resulting document.
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));
        return os.toString();
    }

    private static void assinarNFE(XMLSignatureFactory fac,
            ArrayList transformList, PrivateKey privateKey, KeyInfo ki,
            Document doc, int i) throws Exception {

        // Obtem elemento do documento a ser assinado, será criado uma
        // REFERENCE para o mesmo
        NodeList elements = doc.getElementsByTagName("infNFe");
        Element el = (Element) elements.item(i);
        String id = el.getAttribute("Id");

        // doc.getDocumentElement().removeAttribute("xmlns:ns2");
        // ((Element)
        // doc.getDocumentElement().getElementsByTagName("NFe").item(0))
        // .setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");

        // 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));

        // Create the XMLSignature, but don't sign it yet.
        XMLSignature signature = fac.newXMLSignature(si, ki);

        // Marshal, generate, and sign the enveloped signature.
        // Create a DOMSignContext and specify the RSA PrivateKey and
        // location of the resulting XMLSignature's parent element.
        DOMSignContext dsc = new DOMSignContext(privateKey, doc.getDocumentElement().getElementsByTagName("NFe").item(i));
        signature.sign(dsc);

    }

Uma coisa que mudei foi pegar direto o PFX, ao inves do JKS, to tentando fazer assim, sem criar JKS, seguindo o que o thingol disse aqui: http://www.guj.com.br/posts/list/15/87934.java

To meio perdido aqui com essa assinatura, alguem passou por isso?

olá, no seu XML tem um node chamado ?