Ver Mensaje Individual
  #84  
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
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