on 01-28-2014 7:14 PM
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!
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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:
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
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!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
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.
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.
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.
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.
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
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.
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
Olá Maria
Por favor dê um feedback a thread qualificando as respostas que lhe foram dadas.
Grato
Eduardo Chagas
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Maria, com as respostas acima, sua pergunta não foi respondida?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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:
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
15 | |
3 | |
2 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.