Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Prezados, tudo bem..

Estou desenvolvendo uma aplicação que consome a API do Integra Contador para transmissao e geração de guias da DCTFWEB..
https://apicenter.estaleiro.serpro.gov.br/documentacao/api-integra-contador/pt/sistemas/dctfweb/servicos/entregar_declaracao/
Eu consigo fazer o download do arquivo XML, mas eu nao tenho nenhuma noção de como eu consigo assinar esse arquivo XML dentro da programação..
Estou utilizando delphi Tokio.

Gostaria de ajuda de como fazer uma rotina para que o sistema leia o XML e assine com o certificado PFX, nos padroes exigidos..

Agradeço por qualquer ajuda.

Fica a dica ai para os senior desenvolver componentes para consumir essa api oficial da Receita, é muito util...

Postado
37 minutos atrás, Juliomar Marchetti disse:

só olhar os fontes do nfe ou qualquer um dfe e tem lá como assinar dai tu usa e faz seu código

Então sou mei novato, e não entendi muito bem os fontes da assinatura 

  • Moderadores
Postado
14 horas atrás, picuuai disse:

Então sou mei novato, e não entendi muito bem os fontes da assinatura 

Indiferente de ser novo ou não . programação é igual

depura o código e olha ele pedaço a pedaço e tu vai conseguir bem fácil

olha o blocoX que tem uma assinatura especifica

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado
8 minutos atrás, Juliomar Marchetti disse:

Indiferente de ser novo ou não . programação é igual

depura o código e olha ele pedaço a pedaço e tu vai conseguir bem fácil

olha o blocoX que tem uma assinatura especifica

Eu entendi o que quiz dizer, mas eu ja tentei de tudo para identificar como o sistema troca de Sha1 para Sha256 dentro da ABCRDFESLL e ate agora nao entendi..
Na assinatura da esocial por exemplo ele assina sha256 e na NFE ele assina sha1.. mas em nenhum dos eventos vc menciona que tipo de SignatureMethod ele vai usar..

 

function TDFeSSL.Assinar(const ConteudoXML, docElement, infElement: String;
  const SignatureNode: String; const SelectionNamespaces: String; const IdSignature: String;
  const IdAttr: String 😞 String;
Var
  XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois: String;
  Assinado: Boolean;
begin
  // Nota: ConteudoXML, DEVE estar em UTF8 //
  // Lendo Header antes de assinar, Se Header não for UTF8 não usa... //
  if XmlEhUTF8(ConteudoXML) then
    DeclaracaoXMLAntes := ObtemDeclaracaoXML(ConteudoXML)
  else
    DeclaracaoXMLAntes := '';

  Assinado := False;

  if Assigned(FAntesDeAssinar) then
  begin
    XmlAss := ConteudoXML;
    FAntesDeAssinar( XmlAss, docElement, infElement, SignatureNode,
                     SelectionNamespaces, IdSignature);
    Assinado := (XmlAss <> ConteudoXML);
  end;

  if not Assinado then
  begin
    XmlAss := FSSLXmlSignClass.Assinar( ConteudoXML, docElement, infElement,
                                        SignatureNode, SelectionNamespaces,
                                        IdSignature, IdAttr);

    // Verificando se modificou o Header do XML assinado, e voltando para o anterior //
    if (DeclaracaoXMLAntes <> '') then
    begin
      DeclaracaoXMLDepois := ObtemDeclaracaoXML(XmlAss);

      if (DeclaracaoXMLDepois = '') then
        XmlAss := DeclaracaoXMLAntes + XmlAss
      else if (DeclaracaoXMLAntes <> DeclaracaoXMLDepois) then
        XmlAss := StringReplace(XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois, []);
    end;
  end;

  Result := XmlAss;
end;

  • 2 semanas depois ...
Postado (editado)
Em 25/08/2023 at 09:41, picuuai disse:

Eu entendi o que quiz dizer, mas eu ja tentei de tudo para identificar como o sistema troca de Sha1 para Sha256 dentro da ABCRDFESLL e ate agora nao entendi..
Na assinatura da esocial por exemplo ele assina sha256 e na NFE ele assina sha1.. mas em nenhum dos eventos vc menciona que tipo de SignatureMethod ele vai usar..

 

function TDFeSSL.Assinar(const ConteudoXML, docElement, infElement: String;
  const SignatureNode: String; const SelectionNamespaces: String; const IdSignature: String;
  const IdAttr: String 😞 String;
Var
  XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois: String;
  Assinado: Boolean;
begin
  // Nota: ConteudoXML, DEVE estar em UTF8 //
  // Lendo Header antes de assinar, Se Header não for UTF8 não usa... //
  if XmlEhUTF8(ConteudoXML) then
    DeclaracaoXMLAntes := ObtemDeclaracaoXML(ConteudoXML)
  else
    DeclaracaoXMLAntes := '';

  Assinado := False;

  if Assigned(FAntesDeAssinar) then
  begin
    XmlAss := ConteudoXML;
    FAntesDeAssinar( XmlAss, docElement, infElement, SignatureNode,
                     SelectionNamespaces, IdSignature);
    Assinado := (XmlAss <> ConteudoXML);
  end;

  if not Assinado then
  begin
    XmlAss := FSSLXmlSignClass.Assinar( ConteudoXML, docElement, infElement,
                                        SignatureNode, SelectionNamespaces,
                                        IdSignature, IdAttr);

    // Verificando se modificou o Header do XML assinado, e voltando para o anterior //
    if (DeclaracaoXMLAntes <> '') then
    begin
      DeclaracaoXMLDepois := ObtemDeclaracaoXML(XmlAss);

      if (DeclaracaoXMLDepois = '') then
        XmlAss := DeclaracaoXMLAntes + XmlAss
      else if (DeclaracaoXMLAntes <> DeclaracaoXMLDepois) then
        XmlAss := StringReplace(XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois, []);
    end;
  end;

  Result := XmlAss;
end;

Obrigado..

Eu achei esse codigo aqui na internet que ajudou bastante na assinatura..

procedure Tfrmdctf.AssinarXml(const ElementoFinal:String);
var SSL : TDFeSSL;
    XMLUTF8, XMLAssinado : String;
begin
  SSL := TDFeSSL.Create;
  try
    SSL.SSLCryptLib     := cryWinCrypt;
    SSL.SSLXmlSignLib   := xsLibXml2;
    SSL.ArquivoPFX      := integra.caminhocertificado;
    SSL.Senha           := '******';
    SSl.CarregarCertificado;
    XMLUTF8 := memo3.Lines.Text;
    XMLAssinado := SSL.Assinar(XMLUTF8, ElementoFinal, '');
    memo4.Lines.Text:= XMLAssinado;
  finally
    SSL.free;
  end;
end;

 

So tem uma diferença, o arquivo esta com Sha1 e teria que ser Sha256, como faço para mudar esse tipo de assinatura..?

Editado por picuuai
Postado
Em 06/09/2023 at 16:46, picuuai disse:

Obrigado..

Eu achei esse codigo aqui na internet que ajudou bastante na assinatura..

procedure Tfrmdctf.AssinarXml(const ElementoFinal:String);
var SSL : TDFeSSL;
    XMLUTF8, XMLAssinado : String;
begin
  SSL := TDFeSSL.Create;
  try
    SSL.SSLCryptLib     := cryWinCrypt;
    SSL.SSLXmlSignLib   := xsLibXml2;
    SSL.ArquivoPFX      := integra.caminhocertificado;
    SSL.Senha           := '******';
    SSl.CarregarCertificado;
    XMLUTF8 := memo3.Lines.Text;
    XMLAssinado := SSL.Assinar(XMLUTF8, ElementoFinal, '');
    memo4.Lines.Text:= XMLAssinado;
  finally
    SSL.free;
  end;
end;

 

So tem uma diferença, o arquivo esta com Sha1 e teria que ser Sha256, como faço para mudar esse tipo de assinatura..?

Alguem sabe como mudar a sha? e tambem no meu codigo ele nao esta aparecendo a reference = url esta vazia..  e eu precisava referenciar o conteudododocumento..

Postado (editado)

Prezados..

Alguma coisa eu ja consegui resolver sobre a assinatura do XML com o codigo abaixo...

procedure Tfrmdctf.AssinarXml(const ElementoFinal:String);
var SSL : TDFeSSL;
    XMLUTF8, XMLAssinado : String;
begin
  SSL := TDFeSSL.Create;
  try
    SSL.SSLCryptLib     := cryWinCrypt;
    SSL.SSLXmlSignLib   := xsLibXml2;
    SSL.ArquivoPFX      := integra.caminhocertificado;
    SSL.Senha           := '33711196';
    SSl.CarregarCertificado;
    XMLUTF8 := memo3.Lines.Text;
    XMLAssinado := SSL.Assinar(XMLUTF8, ElementoFinal, '');
    memo4.Lines.Text:= XMLAssinado;
  finally
    SSL.free;
  end;
end;

 

Preciso resolver outras 2 coias..
1) a assinatura tem ser em SHA256 e esta em SHA1, como mudar isso?
2) eu preciso na reference colocar o a referencia do conteudodadeclaracao do xml anexo.. como faço isso, pois esta saindo vazio?

manual técnico
https://apicenter.estaleiro.serpro.gov.br/documentacao/api-integra-contador/pt/sistemas/dctfweb/servicos/entregar_declaracao/

arquivo.xml arquivo_assinado.xml

Editado por picuuai
complementando informação
  • 3 semanas depois ...
  • Solution
Postado

Prezados, achei a solução, obrigado pela ajuda @italo

procedure Tfrmdctf.AssinarXml(const ElementoFinal:String);
var SSL : TDFeSSL;
    XMLUTF8, XMLAssinado : String;
begin
  SSL := TDFeSSL.Create;
  try
    SSL.SSLDgst := dgstSHA256; // esse paramentro muda o tipo de assinatura SHA
    SSL.SSLCryptLib     := cryWinCrypt;
    SSL.SSLXmlSignLib   := xsLibXml2;
    SSL.ArquivoPFX      := integra.caminhocertificado;
    SSL.Senha           := '33711196';
    SSl.CarregarCertificado;
    XMLUTF8 := memo3.Lines.Text;
    XMLAssinado := SSL.Assinar(XMLUTF8, ElementoFinal, '', '','','','id'); // o parametro idattr coloca o conteudo (id) do elemento dentro da reference na assinatura
    memo4.Lines.Text:= XMLAssinado;
  finally
    SSL.free;
    PANEL2.Caption:='PROBLEMAS AO ASSINAR XML.';
  end;
  PANEL2.Caption:='XML ASSINADO COM SUCESSO.';

para chamar a funcao

AssinarXml('ConteudoDeclaracao');

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