Ver Mensaje Individual
  #83  
Antiguo 04-12-2019
Avatar de elcharlie
elcharlie elcharlie is offline
Miembro
 
Registrado: mar 2013
Ubicación: Bilbao
Posts: 174
Reputación: 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