cancel
Showing results for 
Search instead for 
Did you mean: 

Assinatura RPS NFS-e São Paulo

Former Member
0 Kudos

Boa tarde!

Estou com um problema para assinar as notas de serviço para o município de São Paulo.

A prefeitura retorna o erro 1206:

"Assinatura Digital do RPS incorreta - String verificada
(11095776FFFFF00000056522920140123INN00000000003001500000000000121500001201524606000199)"

Já conferimos a string enviada antes de passar pela criptografia e está idêntica a essa string que retorna. Alguém já passou por esse tipo de situação?

Muito Obrigada!

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Oi Thiago,

Sim... estão iguais e os espaços eu eliminei.

Henrique,

Estamos desenvolvendo toda a interface e o assinador também. Criamos uma UDF que no mapeamento pega a string e gera a assinatura. A minha assinatura está ficando assim:

8d1838d601fc7ee79729521ce491596f62e7344a

Estou vendo alguns exemplos de XML e o formato da assinatura parece diferente, por exemplo:

jkTucEqcj8Qkes8RalHZW+p6Zc6weeqnPabOK7IHSkyVTO9reNqpMclEh8n6nHXSPGcnsvhQx4JWx/sK26IxVTOMKp3i41/1w3OyC9SvL0VPtzrARKQMEqTf2kqwu9skHMzw5d4T/jfjYLrp5n/YAbMqKQ5zaa4qAcY0A066OAc=

Talvez esteja faltando fazer algum passo para que ela fique dessa forma acima...

Esse validador faz a validação da assinatura do lote certo? Porque ele está informando que a minha assinatura está correta mas o erro persiste. Aparentemente a assinatura do lote está ok... o que está apresentando erro é a assinatura de cada RPS.

henrique_pinto
Active Contributor
0 Kudos

E como vc desenvolveu a assinatura do lote?

Former Member
0 Kudos

A assinatura do lote é um java mapping. À princípio ela está correta... a outra mesmo que está dando erro...

0 Kudos

Aparentemente a assinatura que você está gerando é apenas o hash criptografado utilizando SHA1.

O RPS deve ser assinado utilizando o certificado digital também, que é a utilização de RSA-SHA1.

Segundo o manual:


O RPS deverá ter uma assinatura digital. Esta assinatura utilizará o mesmo certificado digital usado na assinatura da mensagem XML (item 3.2.2A), com os mesmos padrões de criptografia assimétrica RSA e algoritmo message digest SHA-1.

Para criar a assinatura deverá ser gerado um Hash (utilizando SHA1) de uma cadeia de caracteres (ASCII) com informações do RPS emitido. Este Hash deverá ser assinado utilizando RSA. A assinatura do Hash será informada na TAG Assinatura (tipo RPS apresentado no item 4.2.1).

Estranho é que para a string "11095776FFFFF00000056522920140123INN00000000003001500000000000121500001201524606000199", estou obtendo o SHA1 hash "e55c4c3fe23ea6a2530eba61cb07260675582ab2", que já é diferente do seu.

A string assinada via RSA-SHA1 realmente é um hash maior, mais parecido com o exemplo que você mostrou.

No Java dá para você fazer os dois passos de uma vez só realmente, portanto é preciso tomar cuidado para não assinar um hash de um hash realmente.

Former Member
0 Kudos

Oi Thiago,

Você tem algum exemplo de java para fazer essa criptografia e assinatura?

Obrigada!

0 Kudos

Você deve utilizar a classe java.security.Signature, com o algoritmo de assinatura "SHA1withRSA" no momento da criação da instância. Dê uma olhada na documentação dessa classe: Signature (Java Platform SE 6)


Eu utilizei o seguinte site para testar a assinatura: http://kjur.github.io/jsrsasign/sample-rsasign.html


No lado direito da tela, você preenche o valor assinado, a string não assinada e a chave pública do certificado digital e clique em "Verify this signature".


Veja o resultado no meu caso:


Se eu coloco apenas o hash criptografado (SHA1), a assinatura fica inválida:

henrique_pinto
Active Contributor
0 Kudos

Tem no link que eu postei lá em cima deveria ter postado lá em cima e esqueci...

http://desenvolvimentonfse.forumeiros.com/t118-resolvido1206-assinatura-digital-do-rps-incorreta-sp

Answers (6)

Answers (6)

former_member641772
Discoverer
0 Kudos

Boa Tarde Pessoal,
Estou tendo problema ao assinar a TAG <Assinatura> da Prefeitura SP.. NFS-e

Alguém passou por isso? Poderiam ajudar?

Erro de retorno:

"<Codigo>1206</Codigo> <Descricao>Assinatura Digital do RPS incorreta - String verificada (35224363A 00000000003620210317TNS00000000110000000000000000000001406283839247000123)</Descricao> ".

Obrigada!

Former Member
0 Kudos

Olá Senhores!

Conseguimos fazer funcionar na última sexta-feira. Realmente o problema era no java que estava fazendo a assinatura de cada RPS. Criamos uma UDF com o seguinte código:

  String senhaCertificado = <senha>;
  InitialContext ctx = null;
  String signedElement = null;
 
  AbstractTrace trace;
  trace = container.getTrace();

  try {
   ctx = new InitialContext();
  
    Object o = null;
       o = ctx.lookup("keystore");
      
       KeystoreManager manager = (KeystoreManager) o;
     String keyStorageView = <view>;
      
       java.security.KeyStore keyStore = manager.getKeystore(keyStorageView);
         
       String alias = <entry>;
       KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, new KeyStore.PasswordProtection(senhaCertificado.toCharArray()));
       PrivateKey pk = keyEntry.getPrivateKey();
       Signature dsa = Signature.getInstance("SHA1withRSA");
       dsa.initSign(pk);
       dsa.update(a.getBytes());
       signedElement = new BASE64Encoder().encode(dsa.sign());

  } catch (Exception e) {
   trace.addWarning("Erro na assinatura:"+e.getMessage());
  }
  return signedElement;

Estamos com problemas para testar pois o webservice da prefeitura não retorna todas as informações mas vou abrir uma nova discussão para isso.

Muito Obrigada pela ajuda de todos!

Former Member
0 Kudos

Ola Maria Gabriela tudo bem?

A sua UDF serve para assinar os lote e a RPS da nota de serviço?

Pois dentro do lote devera ter a rps já assinada correto?

obrigado

abs

Former Member
0 Kudos

Oi Gabriela, tudo bem?

Legal você ter conseguido solucionar o problema com uma UDF. Única restrição que vejo é ter que deixar a senha do certificado "solta" no código, mas deve haver uma solução para evitar isso.

Uma dúvida: você precisou de algum procedimento para a utilizar a com.sap.aii.security.lib na UDF? Já tentei utilizar aqui no PI 7.3 pra utilizar a classe KeyStoreManager e tive a mensagem que a classe não foi encontrada. Se você tiver alguma dica, será bem-vinda.

Former Member
0 Kudos

Olá Luis,

Aqui estamos tentando assinar através da UDF no PI 7.3 e estamos tendo o mesmo problema, já importamos a library no Archives Used, porém não obtivemos sucesso até agora. Tentamos contato com a Maria para entender se realmente funcionou através de UDF, mas sem sucesso, já que no post ela comenta Java Mapping e UDF.

Former Member
0 Kudos

Olá Andercley

Acabamos resolvendo utilizar os módulos de assinatura digital do ABAP (classe CL_SEC_SXML_DSIGNATURE).  Conseguimos assinar o string de assinatura, e depois disso assinamos todo o XML, e funcionou. Se você estiver fazendo a integração entre um sistema ABAP e PI, é uma possibilidade a ser considerada.

Former Member
0 Kudos

Ola Luis, estou utilizando a mesma classe para assinar, mas quando chega na prefeitura da erro de assinatura, estamos passando o xml como string para o proxy, se vc tiver como passar os parâmentros que utilizou vai ajudar bastante.

@Andercley Carlos esta no mesmo projeto que eu.

Obrigado

METHOD zii_si_proxy_sign_rps_in1~si_proxy_sign_rps_in.

*** **** INSERT IMPLEMENTATION HERE **** ***

  DATA   lr_xml_helper TYPE REF TO cl_secxml_helper.

  DATA:  lf_result  TYPE xstring,

         lf_bindata TYPE xstring,

         lf_bfile64 TYPE string,

         lo_object  TYPE REF TO cl_sec_sxml_dsignature,

  gf_psect TYPE psecontext,

  gf_xha   TYPE sec_xml_dsig_hash,

  gf_xtyp  TYPE sec_xml_dsig_type,

  gf_xtra  TYPE sec_xml_dsig_transform,

  gf_xc14  TYPE sec_xml_dsig_canonicalization,

  gf_xmet  TYPE sec_xml_dsig_method,

  gf_xhash TYPE ssfhash,

  gf_xid   TYPE string,

  gf_xel   TYPE string,

  gf_xdsig TYPE string,

  gf_rfuri TYPE abap_bool,

  gf_pseap TYPE ssfappl,

  gf_xkinf TYPE abap_bool,

  gf_xnsp  TYPE string,

  lf_mac_key TYPE xstring.

*gf_psect TYPE psecontext.

  gf_psect = 'SSFA'.

  gf_xtyp  = 'ENV'.

  gf_xtra  = 'ENV'.

  gf_xc14  = 'IN'.

  gf_xha   = 'SHA1'.

*  gf_xid   = 'EnviarLoteRpsEnvio'.

  gf_xel   = 'EnviarLoteRpsEnvio'.

*  gf_xhash = 'SHA1'.

*  gf_xmet  = 'RSA'.

  gf_pseap = 'ZNFE02'.

*  data  lr_xml_helper TYPE REF TO cl_secxml_helper.

  DATA: xlf_result TYPE xstring,

        lf_bin TYPE string.

  lf_bin = input-mt_sgin_proxy_in-row-xml.

  CREATE OBJECT lr_xml_helper.

*    lr_xml_helper->display( data = lf_result mime_type = 'text/xml'). "#EC NOTEXT

  lr_xml_helper->string_2_utf8( EXPORTING

                                   if_input = lf_bin

*                                  IMPORTING

                                 RECEIVING

                                    ef_output = xlf_result ).

  lf_bindata = xlf_result.

  lo_object = cl_sec_sxml_dsignature=>create_reader_instance(

                  if_input        = lf_bindata

                  if_input_base64 = lf_bfile64 ).

  lo_object->m_pse_context              = gf_psect.

  lo_object->m_signature_type           = gf_xtyp.

  lo_object->m_signature_transformation = gf_xtra.

  lo_object->m_canonicalization         = gf_xc14.

  lo_object->m_signature_ns_prefix      = gf_xdsig.

  lo_object->m_signature_id             = gf_xid.

  lo_object->m_dsig_hash_algorithm      = gf_xha.

  lo_object->m_ssf_hash_algorithm       = gf_xhash.

  lo_object->m_dsig_method              = gf_xmet.

  lo_object->set_attributes( if_element_name = gf_xel

                             if_attribute_namespace = gf_xnsp ).

  lo_object->sign_xml(

      EXPORTING

        if_ssf_app       = gf_pseap

        if_add_keyinfo   = gf_xkinf

        if_add_keyinfo_ex = gf_xkinf

        if_signer_mackey  = lf_mac_key

      IMPORTING

*        ef_signature_xml = lf_result ).

        ef_signed_xml    = lf_result ).

  CREATE OBJECT lr_xml_helper.

  lr_xml_helper->utf8_2_string( EXPORTING

                                   if_input = lf_result

*                                  IMPORTING

                                 RECEIVING

                                    ef_output = lf_bin ).

  output-mt_sgin_proxy_in_response-signed_xml = lf_bin.

ENDMETHOD.

Former Member
0 Kudos

Olá Wesley

´Qual o erro que a prefeitura retorna, e como você está montando este XML? O valor dentro da tag "Assinatura" tem que estar assinado também para São Paulo. A menos que você já esteja recebendo ele assinado no seu parâmetro de entrada(input-mt_sgin_proxy_in-row-xml), você terá que manipular este parâmetro, encontrar o valor da tag, assiná-lo, e substituir o valor da tag pelo campo assinado.

Se isto está sendo feito, no resto eu não vejo necessidade dos seguintes parâmetros:

        if_add_keyinfo_ex = gf_xkinf

        if_signer_mackey  = lf_mac_key

Assim como eu atribuiria a propriedade  lo_object->m_signature_reference_uri  = '<none>', pois a prefeitura de SP não utiliza uma tag de referência na assinatura.

Tente observar estes pontos. No resto, a assinatura e parâmetros são semelhantes à NFE.

Former Member
0 Kudos

Ola Luis, na verdade estou fazendo para as prefeituras de Canoas, Paulinia, 3 Corações,  Aparecida GO e Feria de Santana, a regra pelo que entendi de cada prefeitura para assinar de um jeito, uns assina a partir da tag RPS outras da EnviarLoteRpsEnvio, o programa esta assinando ,mas as prefeituras não aprovam.

Talvez a forma que estou mandando o arquivo para o assinador ou os parametros, vou aletrar os que vc passou deve estar fazendo diferença.

eu entro com um xml em string usando a função Return as XML do PI 7.3 a partir da tag que quero assinar no map e envio para esse proxy.

tem uma tag keyinfo que o valor do certificado da empresa, o se programa chegou a retornar essa tag?

obrigado por sua ajuda.

abs

Former Member
0 Kudos

Wesley

Como você está tratando várias prefeituras, sugiro abrir outro tópico para debater o tema e evitar a confusão.

Mas, de toda a forma, cada prefeitura tem sua regra. Há prefeituras que trabalham como a assinatura simples como da NF-e. Por outro lado, há prefeituras com regras mais complexas, com assinatura do RPS e do lote, como Belo Horizonte, por exemplo. Para estes casos, onde você precisa assinar novamente um XML já assinado, a SAP fez algumas alterações nas classes que tratam a questão de assinatura digital. Se for o caso, você pode conferir o programa SECXML_SIGN_SIGNED_XML. Para casos de assinaturas simples, pode ser feito o teste com o programa SECXML_DSIGNATURE.

O tema não é fácil dado a falta de padrão e pouca documentação das prefeituras, mas espero que você consiga resolver o problema.

renatobertizini
Explorer
0 Kudos

Boa tarde Wesley,

Estou com o mesmo problema de assinatura que você descreve nessa parte do chamado.

Estou realizando a assinatura do XML internamente no SAP para prefeituras, porém usando SSLC ao invés de SSFA, mas o certificado é o correto.

Você poderia me dizer o que estava gerando o erro de assinatura inválida?

Obrigado,

Renato Bertizini

Former Member
0 Kudos

Bom dia, eu assinei usando   gf_psect = 'SSFA'.., mas foi para as prefeituras que esta no post.

para qual prefeitura vc esta desenvolvendo?

abs

renatobertizini
Explorer
0 Kudos

Bom dia,

Estou assinando para prefeitura de São Paulo e ele me "Assinatura difere do calculado".

Pelo que vi, o SSFC ou SSFA trabalham da mesma maneira, mas por via das dúvidas, no SSFA que vc utilizava para assinar, havia apenas o certificado do CNPJ final?

Obrigado,

Renato Bertizini

Former Member
0 Kudos

Olá Maria

Por favor dê um feedback a thread qualificando as respostas que lhe foram dadas.

Grato

Eduardo Chagas

0 Kudos

Maria, com as respostas acima, sua pergunta não foi respondida?

henrique_pinto
Active Contributor
0 Kudos

Vc está desenvolvendo na mao essa interface?

E a assinatura digital tb?

Pesquisando no Google, me parece que um erro comum é que o pessoal que desenvolve a assinatura na mao acaba assinando duas vezes sem querer o hash, veja o que o manual fala no item 4.3.2. Envio de RPS, na sessão Observação: Assinatura Adicional.

Ele fala:


ATENÇÃO! Na maioria das linguagens de programação, os passos 3 e 4 são feitos através de uma única função. Verifique a documentação de sua linguagem para evitar assinar um hash de um hash.

Link: http://nfpaulistana.prefeitura.sp.gov.br/arquivos/manual/NFe_Web_Service_v2.3.pdf

Tente validar sua assinatura tb nesse serviço da Receita:

https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATBHE/assinadoc/ValidadorAssinaturas.app/valida.as...

0 Kudos

Certifique-se de que os valores das tags dos RPS(s) estão iguais as da string assinada.

Verifique se as tags de valores não contêm espaços em branco, se tiver, elimine-os.

Abraço.