Jump to content

Embarcadero Conference 2019

22/10 - Visite o Stand do ACBr
Saiba mais

Nova Loja Oficial
loja.projetoacbr.com.br
Ajude o projeto a crescer, com estilo

Comprar

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

João Paulo Müller

Erro assinatura Cancelamento Joinville (ISSJoinville) OpenSSL

Recommended Posts

Olá Pessoal, 

Estou obtendo o erro strdup function failed ao realizar a assinatura do pedido de cancelamento utilizando XmlSec .

Testando com msXml consigo realizar o pedido de cancelamento e funciona perfeitamente.

Pelo que pude conferir a estrutura do XML está correta, conforme o exemplo disponibilizado pelo provedor, inclusive o atributo Id. 

Segue em anexo os XML de exemplo, cancelamento autorizado(msXml) e cancelamento com erro (XmlSec) .

Caso alguém tiver alguma sugestão fico agradecido.

Exemplo Cancelamento.xml Cancelamento erro assinatura.XML Cancelamento Autorizado.xml

Share this post


Link to post
Share on other sites

Voltei a analisar essa situação e consegui autorizar o cancelamento, no entanto, gostaria de trocar uma ideia para ver a forma correta de resolver essa situação, pois da forma que fiz foi apenas um teste.

1) ALTERADO ARQUIVO ISSJoinville.ini

[Cancelar]
IncluiEncodingCab=0
IncluiEncodingDados=0
DocElemento=Pedido
InfElemento=InfPedidoCancelamento //Adicionei esta linha 
Texto1=<soapenv:Envelope xmlns="%NameSpace%/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
Texto2=<soapenv:Body>
Texto3=%DadosMsg%
Texto4=</soapenv:Body>
Texto5=</soapenv:Envelope>

Suspeitei que o erro strdup function failed ocorria pelo fato de não ter o <!DOCTYPE Teste> no XML, portanto inclui o InfElemento para ser adicionado o DOCTYPE, coforme  o metodo de assinatura (TDFeSSLXmlSignXmlSec.Assinar)

/*cDTD é a constante do DOCTYPE*/ 
if InfElement <> '' then
  begin
    IdAttr_temp := IfEmptyThen(IdAttr, 'Id');

    DTD := StringReplace(cDTD, '&infElement&', InfElement, []);
    DTD := StringReplace(DTD, '&IdAttribute&', IdAttr_temp, []);

    AXml := InserirDTD(AXml, DTD);
  end;

Resolveu o erro strdup function failed, porém, o WS estava retornando erro de assinatura.

Analisando o XML assinado pude verificar que a TAG de assinatura estava sendo colocado no local errado, estava sendo inserida dentro da tag <CancelarNfseEnvio>, porém deveria ser dentro da TAG <Pedido> (docElement).

OBS: Em anexo consta o XML com a assinatura na TAG correta e a assinatura sendo inserida na TAG incorreta.

Ao depurar mais a fundo as rotinas encontrei a função XmlSecSign, onde verifica se já existe a TAG de assinatura no XML, caso contrario cria uma nova.

Na função para criar o node de assinatura (AdicionarNode) é encontrado o elemento para ser inserido a assinatura através do parâmetro docElement.

function TDFeSSLXmlSignLibXml2.AdicionarNode(var aDoc: xmlDocPtr;
  const ConteudoXML: String; docElement: String): xmlNodePtr;
Var
  NewNode, DocNode: xmlNodePtr;
  memDoc: xmlDocPtr;
  NewNodeXml, vdocElement: String;
begin
{$IFNDEF COMPILER23_UP}
  Result := nil;
{$ENDIF}
  NewNode := nil;
  memDoc := nil;
  try
    NewNodeXml := '<a>' + ConteudoXML + '</a>';
    memDoc := xmlReadMemory(PAnsiChar(AnsiString(NewNodeXml)), Length(NewNodeXml), nil, nil, 0);
    NewNode := xmlDocCopyNode(xmlDocGetRootElement(memDoc), aDoc.doc, 1);
    DocNode := xmlDocGetRootElement(aDoc);

    { Se docElement possui prefixo o mesmo tem que ser removido }
    vdocElement := copy(docElement, Pos(':', docElement) + 1, Length(docElement));

    if (vdocElement <> '') then
      DocNode := LibXmlLookUpNode(DocNode, vdocElement);

    if (DocNode = nil) then
      raise EACBrDFeException.Create(cErrElementsNotFound);

    Result := xmlAddChildList(DocNode, NewNode.children);
  finally
    if NewNode <> nil then
    begin
      NewNode.children := nil;
      NewNode.last := nil;
      xmlFreeNode(NewNode);
    end;

    if (memDoc <> nil) then
      xmlFreeDoc(memDoc);
  end;
end;

O erro esta ocorrendo pois na chamada da função AdicionarNode não é passado o docElement (Pedido), por este motivo é inserido a tag de assinatura na TAG <CancelarNfseEnvio> ao invés da tag <Pedido>.

SignNode := LibXmlFindSignatureNode(aDoc, SignatureNode, SelectionNamespaces, infElement);
if (SignNode = nil) then
  SignNode := AdicionarNode(aDoc, SignatureElement(URI, True, IdSignature, FpDFeSSL.SSLDgst));

Para fazer um teste alterei o ultimo parâmetro da função passando o DocElement (Pedido) que seria a TAG onde a assinatura deveria ser inserida.

SignNode := AdicionarNode(aDoc, SignatureElement(URI, True, IdSignature, FpDFeSSL.SSLDgst),'Pedido');

Dessa forma conseguir autorizar o cancelamento, porém tenho total certeza que não é a forma certa de resolver, gostaria de uma sugestão dos entendidos no assunto, estou tentando o possível aqui.

 

Grato!

XML Com assinatura no local errado.xml XML assinatura no local certo.xml

Share this post


Link to post
Share on other sites

Boa tarde João,

Já passei para o pessoal analisar a sua alteração no que diz respeito a unit.

Deste já muito obrigado pela colaboração.

Uma pergunta: porque você ainda usa o XsXmlSeg em vez de XsLibXml2?

  • Like 1

Consultor SAC ACBr Italo Jurisato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Share this post


Link to post
Share on other sites

Bom dia, 

Certo Italo, Obrigado!

Referente a Lib, estou mantendo a Sec pois nos demais módulo do sistema é utilizado essa lib.

Na verdade não fui muito a fundo ainda para entender a diferença entre as duas e possivelmente realizar a migração.

Para utilizar a Xml2 preciso alterar apenas as Dlls da aplicação? Quais seriam as vantagens da xml2?

Edited by João Paulo Müller

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...