Ir para conteúdo
  • Cadastre-se

dev botao

Assinar XML Dctfweb


Ver Solução Respondido por picuuai,
  • Este tópico foi criado há 210 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

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...

Link para o comentário
Compartilhar em outros sites

  • Moderadores
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_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

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;

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
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
Link para o comentário
Compartilhar em outros sites

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..

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Solution

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');

Link para o comentário
Compartilhar em outros sites

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