Assinaturas NFS-e São Paulo

Boa tarde.

Acho q mtos aqui devem ter passado apuros pra assinar essa NFs-e. O “fale conosco” deles é tosco e não estou conseguindo assinar com o que encontrei na internet.

Hoje estou fazendo assim:

  • pra gerar a chave privada a partir de um certificado A1:

[code] KeyStore ks = KeyStore.getInstance(“PKCS12”);
ks.load(new FileInputStream(localPFX), senha.toCharArray());

        Enumeration aliasesEnum = ks.aliases();

        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(senha.toCharArray()));[/code]
  • Pra gerar as assinaturas:

[code]try {
XMLSignatureFactory fac = XMLSignatureFactory.getInstance(“DOM”);

        Reference ref = fac.newReference(referencia.isEmpty() ? "" : ("#" + referencia),
                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));

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

        DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());

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

        signature.sign(dsc);

        StringWriter fos = new StringWriter();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();

        trans.transform(new DOMSource(doc), new StreamResult(fos));

        return doc;
    } catch (TransformerException ex) {
        Logger.getLogger(Signature2.class.getName()).log(Level.SEVERE, null, ex);
    } catch (MarshalException ex) {
        Logger.getLogger(Signature2.class.getName()).log(Level.SEVERE, null, ex);
    } catch (XMLSignatureException ex) {
        Logger.getLogger(Signature2.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(Signature2.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvalidAlgorithmParameterException ex) {
        Logger.getLogger(Signature2.class.getName()).log(Level.SEVERE, null, ex);
    }[/code]

Este metodo me retorna o xml assinado com as seguintes tags:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> <Reference URI="#20609680SSSSS00000000000520110929TNN00000000020000000000000001000000000100017668792848"> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>Fwp+SMuwalFeUHPWEB2FZ6bIOIE=</DigestValue> </Reference> </SignedInfo> <SignatureValue>fndRp6Mp4RnClRBoD2ox0GwXQtArIR6l/75DA6O/0kOMKzqZuQAEl8j6LyzMo4eqTxiXMa2JepiW 2wW04TNH9c289LPa5YWMAk4jni4sC3kYqku9rzC5rGwB+X88HC/vagqttNry87/B5yAgl56erzWc cOsUasfNy9U+cdFz4D8=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIGITCCBQmgAwIBAgIIDQjZz8Fd7ecwDQYJKoZIhvcNAQEFBQAwTDELMAkGA1UEBhMCQlIxEzAR BgNVBAoTCklDUC1CcmFzaWwxKDAmBgNVBAMTH1NFUkFTQSBDZXJ0aWZpY2Fkb3JhIERpZ2l0YWwg djEwHhcNMTEwNzEyMTU0ODA0WhcNMTIwNzExMTU0ODA0WjCB5jELMAkGA1UEBhMCQlIxEzARBgNV BAoTCklDUC1CcmFzaWwxFDASBgNVBAsTCyhFTSBCUkFOQ08pMRgwFgYDVQQLEw8wMDAwMDEwMDE5 NjkyNDcxFDASBgNVBAsTCyhFTSBCUkFOQ08pMRQwEgYDVQQLEwsoRU0gQlJBTkNPKTEUMBIGA1UE CxMLKEVNIEJSQU5DTykxFDASBgNVBAsTCyhFTSBCUkFOQ08pMRQwEgYDVQQLEwsoRU0gQlJBTkNP KTEkMCIGA1UEAxMbSFlVTkRBSSBDQU9BIERPIEJSQVNJTCBMVERBMIGfMA0GCSqGSIb3DQEBAQUA A4GNADCBiQKBgQDHC81tgSAB9O0dn47nn1T6Ub0eWgsJ0mLp7NsuQWopYBLIgP2RYninT0CfJLnS pKTPY3sKkRGTJEGYcPy5PHHtfaierGqNjhv0Zl+11zyhK18jUvwVD6OnUr8dOEXsPvJJ6WBGC9K2 kgnIHhuq676eXCqzs/7VIhk4gXIWOVzdJQIDAQABo4IC7jCCAuowDgYDVR0PAQH/BAQDAgXgMB0G A1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBS3YKhb+bKmrgDtdOvVSsmW aGb1XDCBsQYDVR0RBIGpMIGmgRZWSVRPUkVEU09OQENBT0EuQ09NLkJSoD4GBWBMAQMEoDUTMzAz MTAxOTcwMjYxMjEzMjY4NjcwMDAwMDAwMDAwMDAwMDAwMDAxNDM0ODIzOVNTUCBTUKAYBgVgTAED AqAPEw1FTE9JIENBUk5FSVJPoBkGBWBMAQMDoBATDjAzNTE4NzMyMDAwMTY2oBcGBWBMAQMHoA4T DDAwMDAwMDAwMDAwMDBXBgNVHSAEUDBOMEwGBmBMAQIBBjBCMEAGCCsGAQUFBwIBFjRodHRwOi8v d3d3LmNlcnRpZmljYWRvZGlnaXRhbC5jb20uYnIvcmVwb3NpdG9yaW8vZHBjMIHwBgNVHR8Egegw geUwSaBHoEWGQ2h0dHA6Ly93d3cuY2VydGlmaWNhZG9kaWdpdGFsLmNvbS5ici9yZXBvc2l0b3Jp by9sY3Ivc2VyYXNhY2R2MS5jcmwwQ6BBoD+GPWh0dHA6Ly9sY3IuY2VydGlmaWNhZG9zLmNvbS5i ci9yZXBvc2l0b3Jpby9sY3Ivc2VyYXNhY2R2MS5jcmwwU6BRoE+GTWh0dHA6Ly9yZXBvc2l0b3Jp by5pY3BicmFzaWwuZ292LmJyL2xjci9TZXJhc2EvcmVwb3NpdG9yaW8vbGNyL3NlcmFzYWNkdjEu Y3JsMIGXBggrBgEFBQcBAQSBijCBhzBHBggrBgEFBQcwAoY7aHR0cDovL3d3dy5jZXJ0aWZpY2Fk b2RpZ2l0YWwuY29tLmJyL2NhZGVpYXMvc2VyYXNhY2R2MS5wN2IwPAYIKwYBBQUHMAGGMGh0dHA6 Ly9vY3NwLmNlcnRpZmljYWRvZGlnaXRhbC5jb20uYnIvc2VyYXNhY2R2MTANBgkqhkiG9w0BAQUF AAOCAQEASgPEtRJZX2SKFvxZiWMxT5s2+Xn/h8GP0g5wDGbwOL41k4w4SAw7OO9opVzo4faLjei8 DydumeI9AY1pTDW/W+InPgOI/zmLM+5n9tmPybzZftHZL2EUUpxnUcRBhy8hf2qbnHsP0pevGtXr kCpLJfSTKXJ26W0Hs9GkQYL4NYlaIfHaKb+97irMellSBfTrZZAOopNZHFPmftNUzy47U7ajDGon DSyNzwZYbe8MarDNyqsttb+3KJMCi1EzFXrGJZABJ/Xm6xFwjuhRlTKS7CCVzMLjv7QlmrylwZFK FsyA2LkMmce5Ii/Qaj6ZqgAqHsG/oZS/uA3EoH0y8zmXtw==</X509Certificate> </X509Data> </KeyInfo> </Signature>

A NFs-e de SP deve ter todas as RPS assinadas (tag ) esta assinatura deve obedecer o seguinte criterio:

Com base no trecho da mensagem XML apresentada, montamos a seguinte string de caracteres: “31000000OL03 00000000000120070103TNN00000000205000000000000050000002658100013167474254” Note que o valor dos serviços (R$ 20.500,00) foi transformado em 2050000, o valor de deduções (R$ 5.000,00) foi transformado em 500000. Também foi acrescentado à série do RPS um espaço em branco à direita para preencher as 5 posições. 2º - Converta a cadeia de caracteres ASCII para bytes. 3º - Gere o HASH (array de bytes) utilizando SHA1. 4º - Assine o HASH (array de bytes) utilizando RSA-SHA1.

Alem das RPS o arquivo XML todo deve ser assinado.

Bom, como estou fazendo hoje:

  • Assinatura RPS: gero a string com os valores que eles pedem, apos fazer isto insiro uma tag no xml com este valor e mando assinar o xml passando a string como referencia. O retorno não é o esperado, trato o xml pegando o valor contido na tag jogo dentro de uma tag e elimino o elemento do documento.

  • Assinatura do documento: mando assinar passando todo o xml, e sem passar uma referencia.

O erro que o web service do governo me retorna é:

<?xml version="1.0" encoding="UTF-8"?><RetornoEnvioLoteRPS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.prefeitura.sp.gov.br/nfe"><Cabecalho Versao="1" xmlns=""><Sucesso>false</Sucesso></Cabecalho><Erro xmlns=""><Codigo>1057</Codigo><Descricao>Rejeição: Assinatura difere do calculado.</Descricao></Erro></RetornoEnvioLoteRPS>

Alguem, por favor, sabe o que eu posso estar fazendo de errado ?
Obrigado.

Algum texto do seu XML possui algum caractere especial?

Na NF-e eles costumam dar uma baita dor de cabeça.

Dá uma olhada nesse tópico, tem várias coisas sobre o NF-e, talvez possa te ajudar http://www.guj.com.br/java/72325-nfe---nota-fiscal-eletronica

zorem eu li algo sobre isto de caracteres especiais, espaços no meio das tags, enter.

tirei tudo isso… e ainda assim continua o erro.

estou com o mesmo problema para SP, alguem ja implementou solução para este tipo de assinatura ? todos exemplos que consegui na net estão me retornando o mesmo erro: assinatura difere do calculado.

Não precisa mais amigos, ja consegui(+ uma vez sem a ajuda de vocês), obrigado a todos que não me ajudaram pela centésima vez aqui no guj, mesmo assim a a noite posto o código aqui, abraços.

bom dia. Já gero a nota o xml, mas para cidades que nao precisam do arquivo assinado, preciso agora assinar o arquivo, será que você poderia me ajudar?

Senhores estou com problemas na assinatura da NFS-e algum de vocês conseguiu solucionar este problema?

Bom dia aix, sei que o post é antigo, mas poderia postar a solução que você encontrou para este problema. Estou com um problema bem parecido:

Bem. peguei um exemplo pela net para assinatura de NFS-e, com leitor de cartão, já consegui fazer a leitura do cartão, e, inclusive assinar os RPS e o lote, mas, ainda sim a assinatura não está correta, analisando com o mesmo xml so que assinado por outra app, a assinatura dos RPS estão correta mas a do Lote, especificamente as tags DigestValue e SignatureValue não estão batendo, o que faz ser invalido a assinatura, conforme validei no site da receita.

Boa tarde, sei que o post é antigo, mas alguém aqui está tendo implementar o envio de notas de serviço via webservice com a reforma tributaria?