Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2019
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 174
Poder: 12
elcharlie Va por buen camino
Hola a todos, haber si alguien me puede echar una mano con la firma del XML, os pongo el código fuente que yo uso, pero por lo visto esta mal, al enviarlos me da error "Ticketbai exige que la firma sea Xades/Epes.

Código Delphi [-]
rocedure TFrmMain.ButtonFirmarXMLClick(Sender: TObject);
var
  ArchivoDestino: String;
  ArchivoDestinoBase64: String;
  F : TFileStream;
  Out_Stream: TFileStream;
  Out_Stream_64: TStringList;
  TempFile: TStreamWriter;
  MS: TMemoryStream;

  XML_Doc : ElXMLDOMDocument;
  XML_Refs : TElXMLReferenceList;
  XML_RefDocu : TElXMLReference;

  XML_Signer : TElXMLSigner;
  XML_XAdES : TElXAdESSigner;
  XML_KeyData : TElXMLKeyInfoX509Data;

  Cert : TElX509Certificate;
  XML_Nodo : TElXMLDOMNode;
  XML_Doc_Base64: String;
  Encoder : TIdEncoderMime;
  
  Buf: ByteArray;
const
  SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256';
  POLITICA_PDF = 'oid:/1.2.4.0.9.4.5';
  POLITICA_FIRMA = 'Policy description';
  REF_DOCU_ID = 'xmldsig-c8adb119-5083-474b-becb-995f4e506e82-ref0';
begin
  try

    ArchivoDestino := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Signed' + ExtractFileExt(EdtRutaFicheroXML.Text);

    ArchivoDestinoBase64 := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Base64' + ExtractFileExt(EdtRutaFicheroXML.Text);

    if (Trim(ArchivoDestino) = EmptyStr) or (FileExists(EdtRutaFicheroXML.Text) = False) then
      raise Exception.Create('Error Inicializar');

    F := TFileStream.Create(EdtRutaFicheroXML.Text, fmOpenRead or fmShareDenyWrite);
    XML_Doc := ElXMLDOMDocument.Create;
    XML_Refs := TElXMLReferenceList.Create;
    XML_RefDocu := TElXMLReference.create;

    XML_Signer := TElXMLSigner.Create(nil);
    XML_XAdES :=   TElXAdESSigner.Create(nil);
    XML_KeyData:= TElXMLKeyInfoX509Data.create(false);

    XML_Doc.LoadFromStream(F,'', True);
    if not XML_Doc.Loaded then
      raise Exception.create('Firma XML: No se pudo cargar el documento XML.');


    XML_Signer.References := XML_Refs;
    XML_Signer.SignatureMethodType := SBXMLSec.xmtSig;
    XML_Signer.SignatureType := SBXMLSec.xstEnveloped;
    XML_Signer.CanonicalizationMethod := SBXMLDefs.xcmCanon;
    XML_Signer.SignatureMethod := SBXMLSec.xsmRSA_SHA256;

    XML_Signer.IncludeKey := True;
    XML_Signer.XAdESProcessor := XML_XAdES;
    XML_Signer.XAdESProcessor.XAdESVersion := SBXMLAdES.XAdES_v1_4_1;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Identifier := POLITICA_PDF;

    if (Length(POLITICA_PDF) > 0) then
    begin
      if (LowerCase(Copy(POLITICA_PDF,0,4)) = 'urn:') then
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURN
      else
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURI;
    end
    else
      XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtNone;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Description := POLITICA_FIRMA;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := SBXMLSec.DigestMethodToURI(xdmSHA256);


    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := DigestMethodToURI(xdmSHA256);
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := ConvertFromBase64String('eTt00qpcKGu3EVLFt2kjJFaczEmo3EOWnh6udzUnnEk=');
    //XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := CalculateDigest(@Buf[0], Length(Buf), xdmSHA1);


    XML_Signer.XAdESProcessor.SigningTime := UtcNow;
    XML_Signer.XAdESProcessor.Generate();

    XML_Signer.XAdESProcessor.QualifyingProperties.XAdESPrefix := 'xades';

    XML_Signer.UpdateReferencesDigest();

    XML_KeyData.IncludeKeyValue := False;
    Cert := ListaCertificados[ComboBoxCertificados.ItemIndex];
    XML_KeyData.Certificate := Cert;

    XML_Signer.KeyData := XML_KeyData;
    XML_RefDocu.DigestMethod := SBXMLSec.xdmSHA256;
    XML_RefDocu.URINode := XML_Doc.DocumentElement;

    XML_RefDocu.ID := REF_DOCU_ID;
    XML_RefDocu.URI := '';
    XML_RefDocu.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
    XML_Refs.Add(XML_RefDocu);
    XML_Signer.UpdateReferencesDigest();


    XML_Signer.Sign();

    XML_Signer.Signature.SignedInfo.SigPropRef.DigestMethod := xdmSHA256;
    XML_Signer.Signature.SignedInfo.SigPropRef.TransformChain.Add(TElXMLC14NTransform.Create);


    XML_Nodo := XML_Doc.DocumentElement;
    XML_Signer.Save(XML_Nodo);
    F.Position := 0;
    XML_Doc.SaveToStream(F);



    Out_Stream:= TFileStream.create(ArchivoDestino, fmCreate);
    XML_Doc.SaveToStream(Out_Stream);
    FreeAndNil(Out_Stream);


    FreeAndNil(F);
    XML_Doc.free;
    XML_Refs.free;
    XML_Signer.free;
    XML_XAdES.free;
    XML_KeyData.Free;
  
    ShowMessage('Fichero Firmado');
  except on E: Exception do
    begin
      ShowMessage(e.ToString);
    end;
  end;
end;

La verdad es que no sé donde puede estar el fallo, paso el fichero firmado por un validador y me indica que está correcto. Estoy perdido

Última edición por elcharlie fecha: 04-12-2019 a las 10:35:18.
Responder Con Cita
  #2  
Antiguo 04-12-2019
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 174
Poder: 12
elcharlie Va por buen camino
Esto si que es raro, si lo firmo como la facturaE, no me da ningun tipo de error, pero su ejemplo es completamente distinto. No sé. Os pongo el código que he usado y que si me funciona, pero no tengo claro que vaya a ser así en un futuro
Código Delphi [-]
procedure TFrmMain.Button1Click(Sender: TObject);
var
  ArchivoDestino: String;
  F : TFileStream;
  Out_Stream: TFileStream;
  XML_Doc : ElXMLDOMDocument;
  XML_Refs : TElXMLReferenceList;
  XML_RefDocu : TElXMLReference;
  XML_RefCert : TElXMLReference;
  XML_Signer : TElXMLSigner;
  XML_XAdES : TElXAdESSigner;
  XML_KeyData : TElXMLKeyInfoX509Data;
  XML_Digest: String;
  XML_Buf: ByteArray;
  j, i, k1, k2: Integer;
  Cert : TElX509Certificate;
  XML_Nodo : TElXMLDOMNode;
const
  SHA256 = 'http://www.w3.org/2001/04/xmlenc#sha256';
  POLITICA_PDF = 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf';
  POLITICA_FIRMA = 'Política de firma electrónica para facturación electrónica con formato Facturae';
  HASH_POLITICA = '3A18B197ABA90FA6AFF0DEE912F0C006110BEA13';
begin
  try
    ArchivoDestino := ExtractFilePath(EdtRutaFicheroXML.Text) + StringReplace(ExtractFileName(EdtRutaFicheroXML.Text), ExtractFileExt(EdtRutaFicheroXML.Text), '', [rfReplaceAll, rfIgnoreCase])
      + 'Signed' + ExtractFileExt(EdtRutaFicheroXML.Text);


    if (Trim(ArchivoDestino) = EmptyStr) or (FileExists(EdtRutaFicheroXML.Text) = False) then
      raise Exception.Create('Error Inicializar');


    F := TFileStream.Create(EdtRutaFicheroXML.Text, fmOpenRead or fmShareDenyWrite);
    XML_Doc := ElXMLDOMDocument.Create;
    XML_Refs := TElXMLReferenceList.Create;
    XML_RefDocu := TElXMLReference.create;
    XML_RefCert := TElXMLReference.create;
    XML_Signer := TElXMLSigner.Create(nil);
    XML_XAdES :=   TElXAdESSigner.Create(nil);
    XML_KeyData:= TElXMLKeyInfoX509Data.create(false);

    XML_Doc.LoadFromStream(F,'', True);
    if not XML_Doc.Loaded then
      raise Exception.create('Firma XML: No se pudo cargar el documento XML.');

    XML_Signer.References := XML_Refs;
    XML_Signer.SignatureMethodType := SBXMLSec.xmtSig;
    XML_Signer.SignatureType := SBXMLSec.xstEnveloped;
    XML_Signer.CanonicalizationMethod := SBXMLDefs.xcmCanon;
    XML_Signer.SignatureMethod := SBXMLSec.xsmRSA_SHA256;
    XML_Signer.IncludeKey := True;

    XML_Signer.XAdESProcessor := XML_XAdES;
    XML_Signer.XAdESProcessor.XAdESVersion := SBXMLAdES.XAdES_v1_4_1;

    XML_Signer.XAdESProcessor.Included := [SBXMLAdESIntf.xipSignerRole];
    XML_Signer.XAdESProcessor.SignerRole.ClaimedRoles.AddText(XML_Signer.XAdESProcessor.XAdESVersion, XML_Doc, 'supplier');
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Identifier := POLITICA_PDF;

    if (Length(POLITICA_PDF) > 0) then
    begin
      if (LowerCase(Copy(POLITICA_PDF,0,4)) = 'urn:') then
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURN
      else
        XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtOIDAsURI;
    end
    else
      XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.IdentifierQualifier := SBXMLAdES.xqtNone;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyId.Description := POLITICA_FIRMA;
    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestMethod := SHA256;

    XML_Digest:= LowerCase(HASH_POLITICA);

    SetLength(XML_Buf, Length(XML_Digest) div 2);
    for j:= 0 to Length(XML_Buf)-1 do
    begin
      k1:= SBMath.HexToDecDigit(XML_Digest[j*2 + 1]);
      k2:= SBMath.HexToDecDigit(XML_Digest[j*2 + 2]);
      if (k1<0) or (k2<0) then
        raise Exception.Create('Firma XML: Error convirtiendo digest de política de firmado a Base64.');
      XML_Buf[j]:= k1 shl 4 + k2;
    end;

    XML_Signer.XAdESProcessor.PolicyId.SigPolicyHash.DigestValue := XML_Buf;

    XML_Signer.XAdESProcessor.SigningTime := UtcNow;
    XML_Signer.XAdESProcessor.Generate();
    XML_Signer.UpdateReferencesDigest();

    XML_KeyData.IncludeKeyValue := true;
    Cert := ListaCertificados[ComboBoxCertificados.ItemIndex];
    XML_KeyData.Certificate := Cert;

    XML_Signer.KeyData := XML_KeyData;
    XML_RefDocu.DigestMethod := SBXMLSec.xdmSHA256;
    XML_RefDocu.URINode := XML_Doc.DocumentElement;
    XML_RefDocu.URI := '';
    XML_RefDocu.TransformChain.Add(TElXMLEnvelopedSignatureTransform.Create);
    XML_Refs.Add(XML_RefDocu);
    XML_Signer.UpdateReferencesDigest();

    XML_RefCert.URI := '#Certificate1';
    XML_RefCert.DigestMethod := SBXMLSec.xdmSHA256;
    XML_Refs.Add(XML_RefCert);

    XML_Signer.Sign();
    XML_Signer.Signature.KeyInfo.ID := 'Certificate1';

    XML_Nodo := XML_Doc.DocumentElement;
    XML_Signer.Save(XML_Nodo);

    F.Position := 0;
    XML_Doc.SaveToStream(F);

    Out_Stream:= TFileStream.create(ArchivoDestino, fmCreate);
    XML_Doc.SaveToStream(Out_Stream);
    FreeAndNil(Out_Stream);

    FreeAndNil(F);
    XML_Doc.free;
    XML_Refs.free;
    XML_Signer.free;
    XML_XAdES.free;
    XML_KeyData.Free;
    ShowMessage('Fichero Firmado');
  except on E: Exception do
    begin
      ShowMessage(e.ToString);


      if Assigned(XML_Doc) then
        XML_Doc.free;

      if Assigned(XML_Refs) then
        XML_Refs.free;

      if Assigned(XML_Signer) then
        XML_Signer.free;
    end;
  end;
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SII -Nuevo sistema de la Agencia Tributaria española de envío de datos vía Webservice newtron Internet 3565 Hace 1 Semana 11:04:13
Como utilizar la ayuda del nuevo Sistema Operativo gluglu Humor 3 24-09-2007 09:39:05
Aplicacion Agencia De Viajes ArdiIIa Varios 9 20-01-2007 16:49:53
El Vasco Aguirre Al González La Taberna 5 26-05-2006 09:22:28
Microsoft ha lanzado su nuevo sistema operativo DarkByte Humor 0 25-01-2004 09:21:14


La franja horaria es GMT +2. Ahora son las 23:05:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi