Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-10-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.130
Poder: 23
keys Va por buen camino
Hola a todos.

Como ya he comentado el problema radica que con este tipo de certificados de representación hay que firmar el fichero varias veces. Despues de varios días hablando con los de SecureBlackBox parece que hemos encontrado la solución. Pongo la solución para firmar con estos certificados y la anterior.

Código Delphi [-]
procedure SignFacturaRepresentacion(XMLDocument : TElXMLDOMDocument; Cert : TElX509Certificate);
var
Signer : TElXMLSigner;
XAdESSigner: TElXAdESSigner;
X509KeyInfoData: TElXMLKeyInfoX509Data;
DataFormat : TElXMLDataObjectFormat;
Ref : TElXMLReference;
URL : string;
Buf : ByteArray;
k, i : Integer;

CertificateValidator : TElX509CertificateValidator;
Validity : TSBCertificateValidity;
Reason   : TSBCertificateValidityReason;

begin

 Signer := TElXMLSigner.Create(nil);
 XAdESSigner := TElXAdESSigner.Create(nil);
 X509KeyInfoData := TElXMLKeyInfoX509Data.Create(true);
 try
  Signer.XAdESProcessor := XAdESSigner;
  Signer.SignatureMethodType := xmtSig;
  Signer.SignatureMethod := xsmRSA_SHA256;
  Signer.CanonicalizationMethod := xcmCanon;
  Signer.IncludeKey := true;

  k := Signer.References.Add;
  Ref := Signer.References[k];
  Ref.DigestMethod := xdmSHA512;
  Ref.ID := 'Ref1';
  Ref.URI := '';
  Ref.URINode := XMLDocument.DocumentElement;
  Ref.TransformChain.AddEnvelopedSignatureTransform();

  Signer.UpdateReferencesDigest();

  k := Signer.References.Add;
  Ref := Signer.References[k];
  Ref.DigestMethod := xdmSHA512;
  Ref.URI := '#Certificate1';

  XAdESSigner.XAdESVersion := XAdES_v1_3_2;
  XAdESSigner.Included := [xipSignerRole];
  XAdESSigner.SigningTime := UTCNow;
  XAdESSigner.SignerRole.ClaimedRoles.AddText(XAdESSigner.XAdESVersion, XMLDocument, 'emisor');

  URL := 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf';
  XAdESSigner.PolicyId.SigPolicyId.Identifier := URL;
  XAdESSigner.PolicyId.SigPolicyId.IdentifierQualifier := xqtNone;
    XAdESSigner.PolicyId.SigPolicyHash.DigestMethod := DigestMethodToURI(xdmSHA1);

  XAdESSigner.PolicyId.SigPolicyHash.DigestValue := ConvertFromBase64String('Ohixl6upD6av8N7pEvDABhEL6hM=');

  XAdESSigner.SigningCertificates := TElMemoryCertStorage.Create(nil);
  XAdESSigner.OwnSigningCertificates := true;
  XAdESSigner.SigningCertificates.Add(Cert);

  XAdESSigner.SigningCertificatesDigestMethod := xdmSHA512;
  XAdESSigner.SignedPropertiesReferenceDigestMethod := xdmSHA512;

  XAdESSigner.Generate(XAdES_EPES);


  XAdESSigner.QualifyingProperties.XAdESPrefix := 'xades';
  XAdESSigner.QualifyingProperties.ID := 'QualifyingPropertiesId';


  DataFormat := TElXMLDataObjectFormat.Create(XAdESSigner.XAdESVersion);
  //DataFormat.Description := 'Factura electrónica';
  DataFormat.MimeType := 'text/xml';
  DataFormat.ObjectReference := '#Ref1';
  XAdESSigner.QualifyingProperties.SignedProperties.SignedDataObjectProperties.DataObjectFormats.Add(D  ataFormat);

  X509KeyInfoData.IncludeKeyValue := true;
  X509KeyInfoData.IncludeDataParams := [xkidX509Certificate];


  X509KeyInfoData.CertStorage := TElMemoryCertStorage.Create(nil);
  X509KeyInfoData.CertStorage.Add(Cert);


  CertificateValidator := TElX509CertificateValidator.Create(nil);
  CertificateValidator.CheckCRL := false;
  CertificateValidator.CheckOCSP := false;
  CertificateValidator.ImplicitlyTrustSelfSignedCertificates := true;
  CertificateValidator.Validate(cert, Validity, Reason);

  for i := 1 to (CertificateValidator.UsedCertificates.Count - 1) do
   begin
    X509KeyInfoData.CertStorage.Add(CertificateValidator.UsedCertificates.Certificates[i]);
   end;


  Signer.KeyData := X509KeyInfoData;

  Signer.GenerateSignature;
  Signer.Signature.KeyInfo.ID := 'Certificate1';

  Signer.SaveEnveloped(XMLDocument.DocumentElement);
  finally
   FreeAndNil(X509KeyInfoData);
   FreeAndNil(Signer);
   FreeAndNil(XAdESSigner);
   FreeAndNil(CertificateValidator);
  end;
end;

Código Delphi [-]
procedure SignFactura(XMLDocument : TElXMLDOMDocument; Cert : TElX509Certificate);
var
Signer : TElXMLSigner;
XAdESSigner: TElXAdESSigner;
X509KeyInfoData: TElXMLKeyInfoX509Data;
DataFormat : TElXMLDataObjectFormat;
Ref : TElXMLReference;
URL : string;
Buf : ByteArray;
k : Integer;
begin

 Signer := TElXMLSigner.Create(nil);
 XAdESSigner := TElXAdESSigner.Create(nil);
 X509KeyInfoData := TElXMLKeyInfoX509Data.Create(false);
 try
  Signer.XAdESProcessor := XAdESSigner;
  Signer.SignatureMethodType := xmtSig;
  Signer.SignatureMethod := xsmRSA_SHA256;
  Signer.CanonicalizationMethod := xcmCanon;
  Signer.IncludeKey := true;

  k := Signer.References.Add;
  Ref := Signer.References[k];
  Ref.DigestMethod := xdmSHA512;
  Ref.ID := 'Ref1';
  Ref.URI := '';
  Ref.URINode := XMLDocument.DocumentElement;
  Ref.TransformChain.AddEnvelopedSignatureTransform();

  Signer.UpdateReferencesDigest();

  k := Signer.References.Add;
  Ref := Signer.References[k];
  Ref.DigestMethod := xdmSHA512;
  Ref.URI := '#Certificate1';

  XAdESSigner.XAdESVersion := XAdES_v1_3_2;
  XAdESSigner.Included := [xipSignerRole];
  XAdESSigner.SigningTime := UTCNow;
  XAdESSigner.SignerRole.ClaimedRoles.AddText(XAdESSigner.XAdESVersion, XMLDocument, 'emisor');

  URL := 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf';
  XAdESSigner.PolicyId.SigPolicyId.Identifier := URL;
  XAdESSigner.PolicyId.SigPolicyId.IdentifierQualifier := xqtNone;
  //XAdESSigner.PolicyId.SigPolicyId.Description := 'Política de Firma FacturaE v3.1';
  XAdESSigner.PolicyId.SigPolicyHash.DigestMethod := DigestMethodToURI(xdmSHA1);
  // uncomment to calculate a digest value or use precalculated value
  //Buf := DownloadData(URL);
  //XAdESSigner.PolicyId.SigPolicyHash.DigestValue := CalculateDigest(@Buf[0], Length(Buf), xdmSHA1);
  XAdESSigner.PolicyId.SigPolicyHash.DigestValue := ConvertFromBase64String('Ohixl6upD6av8N7pEvDABhEL6hM=');

  XAdESSigner.SigningCertificates := TElMemoryCertStorage.Create(nil);
  XAdESSigner.OwnSigningCertificates := true;
  XAdESSigner.SigningCertificates.Add(Cert);

  XAdESSigner.SigningCertificatesDigestMethod := xdmSHA512;
  XAdESSigner.SignedPropertiesReferenceDigestMethod := xdmSHA512;

  XAdESSigner.Generate(XAdES_EPES);


  XAdESSigner.QualifyingProperties.XAdESPrefix := 'xades';
  XAdESSigner.QualifyingProperties.ID := 'QualifyingPropertiesId';


  DataFormat := TElXMLDataObjectFormat.Create(XAdESSigner.XAdESVersion);
  //DataFormat.Description := 'Factura electrónica';
  DataFormat.MimeType := 'text/xml';
  DataFormat.ObjectReference := '#Ref1';
  XAdESSigner.QualifyingProperties.SignedProperties.SignedDataObjectProperties.DataObjectFormats.Add(D  ataFormat);

  X509KeyInfoData.IncludeKeyValue := true;
  X509KeyInfoData.IncludeDataParams := [xkidX509Certificate];
  X509KeyInfoData.Certificate := Cert;

  Signer.KeyData := X509KeyInfoData;

  Signer.GenerateSignature;
  Signer.Signature.KeyInfo.ID := 'Certificate1';

  Signer.SaveEnveloped(XMLDocument.DocumentElement);
  finally
   FreeAndNil(X509KeyInfoData);
   FreeAndNil(Signer);
   FreeAndNil(XAdESSigner);
  end;
end;

Antes de llamar a una función de firma u otra se mira si el certificado es de representación.

Código Delphi [-]
if AnsiPos(Ansiuppercase('REPRESENTACIÓN'), ANSIUPPERCASE(Cert.IssuerName.CommonName)) = 0  then
               SignFactura(FXMLDocument, FCertificate) //firmado de la manera anterior 
             else
               SignFacturaRepresentacion(FXMLDocument, FCertificate);

De todas formas todo esto viene por que facturas que antes daban correcto en la página de hacienda de facturae https://www.facturae.gob.es ahora dan incorrecto. He podido comprobar que en otras páginas del gobierno como https://face.gob.es/es/facturas/vali...lizar-facturas, las facturas siguen dando correcto. Asi que parece que es una validación que han añadido en la primera página.
Responder Con Cita
  #2  
Antiguo 01-10-2020
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.905
Poder: 22
newtron Va camino a la fama
Gracias keys.


A ver ahora cómo resolvemos los que no usamos SecureBlackBox.


Saludos
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 01-10-2020
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.405
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hago un paréntesis en este tema, pensando en voz alta:

Todos estos controles administrativos perjudican a los pequeños: pequeñas empresas, desarrolladores independientes, etc.
Y beneficia por tanto a los más grandes porque tienen más recursos y posibilidades para poder implementar toda esta parafernalia.

Para el desarrollador típico autónomo es un problemón enorme de tiempo, dinero, dedicación, etc. para mantener al día su software.
Responder Con Cita
  #4  
Antiguo 01-10-2020
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.905
Poder: 22
newtron Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Hago un paréntesis en este tema, pensando en voz alta:

Todos estos controles administrativos perjudican a los pequeños: pequeñas empresas, desarrolladores independientes, etc.
Y beneficia por tanto a los más grandes porque tienen más recursos y posibilidades para poder implementar toda esta parafernalia.

Para el desarrollador típico autónomo es un problemón enorme de tiempo, dinero, dedicación, etc. para mantener al día su software.

Antonio.


Nadie piensa en nadie, y la administración menos. En este puñetero mundo cada cual va a su mejor apaño y el que venga detrás que arree. Es triste pero es así.
__________________
Be water my friend.
Responder Con Cita
  #5  
Antiguo 07-02-2022
ismael@intellit ismael@intellit is offline
Registrado
 
Registrado: feb 2022
Posts: 1
Poder: 0
ismael@intellit Va por buen camino
Hola,

Aunque sea tarde y ya lo tendrán resuelto, la clave está en el tipo de firma, hay que firmar las facturas con un tipo de firma XADES-EPES
También estoy de acuerdo con lo comentado por Casimiro y Antonio

Lo que estoy intentando es comunicarme con el web service de OSAKIDETZA (el FACe del País Vasco)
¿Alguien me podría ayudar con esto?


Gracias
Un saludo
Responder Con Cita
  #6  
Antiguo Hace 4 Días
_Io _Io is offline
Miembro
 
Registrado: ene 2024
Posts: 86
Poder: 2
_Io Va por buen camino
Cita:
Empezado por keys Ver Mensaje
Hola a todos.

Código Delphi [-]
procedure SignFacturaRepresentacion(XMLDocument : TElXMLDOMDocument; Cert : TElX509Certificate);
var
........

Buf : ByteArray;

..................

begin

.......
end;
Buenas noches.

Dónde está definido el tipo ByteArray ?

Es que me da error, y no soy capaz de encontrar su definición.

Muchas Gracias.
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
Delphi7 - secureblackbox-escritorio remoto shoulder Varios 4 10-05-2020 17:58:59
SecureBlackBox - Cerrar Ventana shoulder Varios 5 29-12-2016 17:32:14
eFactura diegosz Providers 2 03-01-2007 20:15:23
Activex de AEAT para firmar efactura diegosz Providers 0 28-10-2006 14:37:44


La franja horaria es GMT +2. Ahora son las 16:23:55.


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