Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

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

 

Postado

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

  • Consultores
Postado
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;
 

Postado

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

Postado

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

Postado

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

  • Membro Pro Verificado
Postado
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"

Fabio Franzini

LogPNG - 160.png

  • Consultores
Postado

 

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
Postado

@RenatoE o ACBrESocial ainda não esta finalizado e como o Renato Rubinho falou o Reinf esta funcionando e o eSocial usa o mesmo metodo de assinatura então vamos esperar a finalização do componente para ver se o erro ainda vai persistir.

  • Curtir 2

 

  • Consultores
Postado
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
  • Membro Pro Verificado
Postado

Ola, boa tarde a todos, testei a utilização da "xsLibXml2" até aqui não obtive nenhum problema, a unica observação feita, foi que , de modo geral esta demorando um tempo bem maior que quando utilizava "xsMsXml" , devo considerar isto como um comportamento normal ? 

 

 

Fabio Franzini

LogPNG - 160.png

  • Este tópico foi criado há 3059 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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...