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