Ir para conteúdo
  • Cadastre-se

dev botao

Nova Biblioteca para Assinatura de XMLs baseada apenas na LibXML2


  • Este tópico foi criado há 2269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

As novas units foram enviadas para o SVN

Citar

-- ACBrDFeSSL, ACBrDFeOpenSSL, ACBrDFeWinCrypt --

[+] Adicionado novo método "TDFeSSL.ValidarHash".
   function ValidarHash( const AStringList : TStringList;
       const Digest: TSSLDgst;
       const Hash: AnsiString;
       const Assinado: Boolean =  False): Boolean; overload;
   Que permite verificar Hashs, Assinados ou não, gerados pelo comando "CalcHash"
   (por: Rafael Teno)

[+] Adicionada Unit: ACBrDFeXsLibXml2.pas, contendo nova classe para Assinatura
    e verificação de XML, usando apenas a LibXML2 (não depende da LibXMLSec).
    A classe "TDFeSSLXmlSignLibXml2", implementa os métodos de "TDFeSSLXmlSignClass":
    "Assinar", "Validar", "VerificarAssinatura"; e será instanciada quando
    TDFeSSL.SSLXmlSignClass = "xsLibXml2".
    Compatível com OpenSSL e WinCrypt, poderá usar Certificados A1 e A3.
    Eliminando em definitivo a dependencia da MSXML (TDFeSSLXmlSignMsXml)
   (por: Rafael Teno e DSA)  

 

  • Curtir 8
  • Obrigado 3

 

Link para o comentário
Compartilhar em outros sites

Rafael, boa tarde.

Primeiro parabéns para todos os envolvidos, estou fazendo testes aqui e esta me retornando o erro "nao foi possivel recuperar o "digest algorithm" do XML" percebi que a busca esta sendo feita por "/> em vez de " /> (com um espaço antes da barra) segue a unit anexo.

Grande abraço 

 

ACBrDFeSSL.pas

  • Obrigado 1

Ricardo Lopes

TECNOSOFT - Solução em Informática

www.tecnosoft.com.br

Link para o comentário
Compartilhar em outros sites

  • Consultores
14 horas atrás, Rafael Dias disse:

@ricardolopes já tinha percebido e logo vai para o svn junto de outra correção.

------- Edit-------

No SVN a correção já

Bom dia @Rafael Dias,

Testei a assinatura do Reinf (rsa-sha256) e o método GetSignDigestAlgorithm não identifica o digest do xml ( Para rsa-sha1 funcionou perfeitamente )

1. O "problema" está no "Algorithm" do "SignatureMethod" que possui url diferente entre o rsa-sha1 e o rsa-sha256.
1.1. Ao pesquisar no conteúdo por "Algorithm="http://www.w3.org/2000/09/xmldsig#", retorna a informação do "Transform" (que possui a mesma url) ao invés do "SignatureMethod"

2. Seguem exemplos de ambos os XMLs para exemplificar

2.1. rsa-sha256: Ao pesquisar por "Algorithm="http://www.w3.org/2000/09/xmldsig#" o GetSignDigestAlgorithm retorna "enveloped-signature" da linha 7 e deveria retornar "rsa-sha256" da linha 4

001 <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
002 <SignedInfo>
003 <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
004 <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
005 <Reference URI="#ID1599506670000002017120507171200001">
006 <Transforms>
007 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
008 <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
009 </Transforms>
010 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" />
011 </Reference>
012 </SignedInfo>
013 </Signature>

2.2. rsa-sha1: O GetSignDigestAlgorithm retorna "rsa-sha1" da linha 4 corretamente

001 <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
002 <SignedInfo>
003 <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
004 <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
005 <Reference URI="#NFe35171212345678901234550010000008221000008228">
006 <Transforms>
007 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
008 <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
009 </Transforms>
010 <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
011 </Reference>
012 </SignedInfo>
013 </Signature>

3. Segue ajuste que corrigiu essa situação e assinou

function TDFeSSLXmlSignClass.GetSignDigestAlgorithm(const ConteudoXML: ansistring): TSSLDgst;
var
  HashAlg: string;
begin
  // Pesquisa por "SignatureMethod Algorithm=" para garantir que está na tag correta
  HashAlg := LowerCase(RetornarConteudoEntre(ConteudoXML, 'SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#', '"'));

  // Com a opção abaixo não é necessário mais a de cima, mas mantive a de cima como "padrão" para você o que acha
  // Caso não encontre com a url, pesquisa do final para o começo do valor até a posição de "#"
  if HashAlg = '' then
  begin
    HashAlg := LowerCase(RetornarConteudoEntre(ConteudoXML, 'SignatureMethod Algorithm="', '"'));
    HashAlg := ReverseString(RetornarConteudoEntre('!!inicio!!' + ReverseString(HashAlg), '!!inicio!!', '#'));

    if HashAlg = '' then
      raise Exception.Create('Não foi possivel recuperar o "Digest Algorithm" do XML');
  end;

  if (HashAlg = 'rsa-sha1') then
    Result := dgstSHA1
  else if (HashAlg = 'rsa-sha256') then
    Result := dgstSHA256
  else if (HashAlg = 'rsa-sha512') then
    Result := dgstSHA512
  else
    raise EACBrDFeException.Create(ACBrStr('Digest Algorithm, "'+HashAlg +'" não suportado'));
end;
 

Link para o comentário
Compartilhar em outros sites

Ola bom dia a Todos, eu fiz o seguinte eu dei update veio com o fonte corrigido porem no eSocial eu fiz alteraçao em 2 partes para que pode assinar


eu criei o GetSignDigestAlgorithm2 para nao atrapalhar o outro, qual foi a mudança :  'Algorithm="http://www.w3.org/2001/04/xmldsig-more#', '" />'));  o motivo foi que quando ele entrava na RetornarConteudoEntre a variavel HashAlg nao trazia o valor certo

 

unit ACBrDFeSSL;

function TDFeSSLXmlSignClass.GetSignDigestAlgorithm2(const ConteudoXML: ansistring): TSSLDgst;
var
  HashAlg: string;
begin
  HashAlg := LowerCase(RetornarConteudoEntre(ConteudoXML, 'Algorithm="http://www.w3.org/2001/04/xmldsig-more#', '" />'));
  if HashAlg = '' then
    raise EACBrDFeException.Create(ACBrStr('Não foi possivel recuperar o "Digest Algorithm" do XML'));

  if (HashAlg = 'rsa-sha1') then
    Result := dgstSHA1
  else if (HashAlg = 'rsa-sha256') then
    Result := dgstSHA256
  else if (HashAlg = 'rsa-sha512') then
    Result := dgstSHA512
  else
    raise EACBrDFeException.Create(ACBrStr('Digest Algorithm, "'+HashAlg +'" não suportado'));
end;

 

unit ACBrDFeXsLibXml2;

//  Digest := GetSignDigestAlgorithm(AXml);  eu troquei
  Digest := GetSignDigestAlgorithm2(AXml);

 

unit ACBreSocial;  aqui eu comentei porque eu estou usando a libCapicom com o xsLibXml2

//  if SSL.SSLXmlSignLib <> xsXmlSec then
//    raise EACBreSocialException.Create('Necessário DigestMethod Algorithm = sha256 -> SSLLib = libOpenSSL');

 

  // Configuracao Certificados  assim 
  AACBreSocial.Configuracoes.Geral.SSLLib := libCapicom;
  AACBreSocial.Configuracoes.Geral.SSLXmlSignLib := xsLibXml2;

 

o problema agora que assinatura nao é valida, alguem pode me ajuda?, tudo isso eu fiz para pode usar o certificado A3

Capturar.PNG

Att,

Renato

 

http://www.edsonbill.com

Link para o comentário
Compartilhar em outros sites

blz vou testar aqui @Rafael Dias valeu pela dica

 

eu troquei aqui, e mesmo assim a assinatura continua  sem validade

 

Código Retorno: 201
Mensagem: Lote processado com sucesso.
ideEmpregador
 - TpInsc: 0
 - NrInsc: 18454737
ideTransmissor
 - TpInsc: tiCNPJ
 - NrInsc: 18454737000140
dadosRecepcaoLote
 - dhRecepcao: 05/12/2017 09:35:23
 - versaoAplicativoRecepcao: 0.1.0-A0243
 - protocoloEnvio: 1.2.201712.0000000000000227425
Processamento
 - cdResposta: 405
 - descResposta: Assinatura inválida.
 - versaoAplicProcLote: 6.0.0-A2456
 - dhProcessamento: 05/12/2017 09:35:23
Recibo
 - nrRecibo: 
 - hash: 
Ocorrencias
 Ocorrencia 0
   Código:142
   Descrição: Assinatura do evento inválida. Ações Sugeridas: Verificar se houve alteração do evento após a assinatura. Verificar a validade da assinatura.
   Tipo: 1
   Localização:/eSocial/Signature
 

Att,

Renato

 

http://www.edsonbill.com

Link para o comentário
Compartilhar em outros sites

Bom dia.

já tem um tempo que existe as configurações, nos meus teste configurei conforme a imagem abaixo e funcionou perfeitamente para transmissão de NF-e, o nosso pessoal aqui esta testando outros documentos NFC-e, MDF-e, Manifestação, Eventos, etc....

cfg.png

  • Curtir 1
  • Obrigado 1

Ricardo Lopes

TECNOSOFT - Solução em Informática

www.tecnosoft.com.br

Link para o comentário
Compartilhar em outros sites

15 minutos atrás, ricardolopes disse:

Bom dia.

já tem um tempo que existe as configurações, nos meus teste configurei conforme a imagem abaixo e funcionou perfeitamente para transmissão de NF-e, o nosso pessoal aqui esta testando outros documentos NFC-e, MDF-e, Manifestação, Eventos, etc....

cfg.png

Então para utilizar esta nova forma de assinatura e poder testar basta alterar  "SSLXmlSignLib" para "xsLibXml2" ?  no caso utilizo "xsMsXml"

Link para o comentário
Compartilhar em outros sites

  • Consultores

 

2 horas atrás, Rafael Dias disse:

@Renato Rubinho

Vou estar fazendo alterações para pode usar nos dois casos.

@RenatoE

Não use capicom use o wincrypt capicom não é compativel, apenas Wincrypt e Openssl.

Wincrypt funciona com certificados A1 e A3.

OpenSSL apenas com A1. 

Boa tarde @Rafael Dias,

A versão do ACBrDFeSSL.pas que foi para o SVN precisa de mais um ajuste, pois as urls tem mais uma diferença além do "-more"

rsa-sha256

<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
 

rsa-sha1

<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Consultores
1 hora atrás, RenatoE disse:

@Renato Rubinho alguma novidade do A3 no eSocial? eu consigo usar o eSocial no A1

Por desencargo, atualize as dlls das pastas abaixo no System32 / SysWow64 da sua máquina

\lib7\ACBr\DLLs\XMLSec
\lib7\ACBr\DLLs\OpenSSL\0.9.8.14

Nos meus testes com o Reinf, funcionou com as seguintes configurações:

image.png.b040faa0315ae27ede49da9731c1b001.png

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

  • Consultores
15 horas atrás, RenatoE disse:

@Renato Rubinho tem como você disponibilizar este exemplo para mim fazendo favor.

Bom dia,

Segue o demo.

Lembrando que este demo está em desenvolvimento, servirá para você poder testar a assinatura mas os fontes do Reinf não estão finalizados.

DEMO.rar

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2269 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.