Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-09-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.026
Poder: 22
keys Va por buen camino
EFactura SecureBlackBox

Hola a todos.

Tengo un programa en Delphi Tokio que genera facturas en el formato facturae (xml) y los firmo con los componentes de SecureBlackBox (Version 16.0.329) he actualizado por si acaso. Utilizo la función que tienen en su pagina web para firmar los ficheros. https://www.nsoftware.com/kb/article...gdocuments.rst

Antes funcionaba correctamente, pero ahora al validar las facturas en la pagina de facturae. Me dice que el certificado no es valido. En concreto "El certificado firmante no está recogido en los apartados a) ó c) del artículo 18 del Reglamento que está recogido en R.D. 1496/2003 del 28 de Noviembre"

Si firmo el fichero con el programa de la aeat con el mismo certificado funciona correctamente. He probado en otros equipos con otros certificados y me ocurre lo mismo.

En SecureBlackBox me han dicho que cambie un par de constantes en la función por que puede que ahora estén haciendo validaciones mas fuertes.

¿A alguiente le esta pasando lo mismo? o puede compartir la funcion con la que esta firmando los ficheros con estos componentes. He estado mirando el foro y encuentro nada.

Un Saludo.
Responder Con Cita
  #2  
Antiguo 16-09-2020
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.461
Poder: 20
newtron Va camino a la fama
Buenas compañero.


Al leer tu mensaje he hecho una prueba con un programa que tengo para enviar facturas firmadas de forma masiva (con unas rutinas en delphi y .net que me hicieron) y efectivamente al validar el fichero me da un error "Firma no válida. No se pudo encontrar el nodo de la firma". Por otro lado si firmo con el programa "autofirma" si que me la valida correctamente, esto me lleva a pensar que algo ha cambiado. A mi de momento ese tema no me preocupa demasiado porque ya no tengo en uso el programa que te digo pero solo quería confirmarte que si que parece que algo ha cambiado.


De una forma o de otra te agradeceré que si das con la solución lo comentes por aquí.


Saludos
__________________
Be water my friend.
Responder Con Cita
  #3  
Antiguo 18-09-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.026
Poder: 22
keys Va por buen camino
Hola a todos.

Sigo mirando para encontrar la solución. No se si alguien más le pasa lo mismo. Me he dado cuenta que el error de validación solo para con los certificados de representante que son los que utilizan las empresas, no con los de persona física.

Un Saludo.
Responder Con Cita
  #4  
Antiguo 25-09-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.026
Poder: 22
keys Va por buen camino
Hola a todos.

Por lo que voy averiguando, cuando se trata de un certificado de representante, el programa autofirma parece que lo firma tres veces, es decir con tres certificados.

Código:
  ds:X509Data>

<ds:X509Certificate>MIIIozCCB4ugAwIBAgIQQQop5szD1T1eTR2l4PyQHTANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNFUkVTMRswGQYDVQQDDBJBQyBSZXBy ZXNlbnRhY2nDs24wHhcNMjAwMjE5MTEzNjA1WhcNMjIwMjE5MTEzNjA1WjCCAQkxODA2BgNVBA0M L1JlZjpBRUFUL0FFQVQwNDAwL1BVRVNUTyAxLzE4NzM4LzE5MDIyMDIwMTIzNDAzMRgwFgYDVQQF Ew9JRENFUy03ODg5OTgwMFcxDzANBgNVBCoMBk5BR09SRTEdMBsGA1UEBAwURkVSTkFOREVaIEdP SUVORVRYRUExMjAwBgNVBAMMKTc4ODk5ODAwVyBOQUdPUkUgRkVSTkFOREVaIChSOiBCOTUxOTgz MjEpMRgwFgYDVQRhDA9WQVRFUy1COTUxOTgzMjExKDAmBgNVBAoMH1RFQ05PTE9HSUEgQ09OVEFC TEUgQVBMSUNBREEgU0wxCzAJBgNVBAYTAkVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAz9zFSsFwoj4dbP+uAJlZUHZDavYBsZEu19iFzEWOjSqojpYBPdXIiboE7TkhrfYFQgr/j6RD VmCK9OaObZr0xkXc/9k+hIS4JbxY1saYvuo9XJOrLx4oKcGVslEAFNOINRDNtLvICpMlbPtTIIcX I6+YlCfk7cmwI+vyaMtHlSvPNifhseCHQWG4mjMU4oOboHjwHpwmK15iTFt+8Uj5aY4TxlHKFsrz CMNMr7CmRSZWUPWHBQCG+MDh2ycEOwfshNZZfLe+1i1pb+iiiiCquYNZtjfc2JfN9hJfjwhwCbfD lv5Fqmn8QMjRjpl+PZEwju8v06GZH/WWlpBfr7wfpQIDAQABo4IEvzCCBLswgegGA1UdEQSB4DCB 3YEZbi5mZXJuYW5kZXpAY29tZXJhbGlhLmNvbaSBvzCBvDEeMBwGCSsGAQQBrGYBBwwPVkFURVMt Qjk1MTk4MzIxMS4wLAYJKwYBBAGsZgEGDB9URUNOT0xPR0lBIENPTlRBQkxFIEFQTElDQURBIFNM MR4wHAYJKwYBBAGsZgEEDA9JRENFUy03ODg5OTgwMFcxGTAXBgkrBgEEAaxmAQMMCkdPSUVORVRY RUExGDAWBgkrBgEEAaxmAQIMCUZFUk5BTkRFWjEVMBMGCSsGAQQBrGYBAQwGTkFHT1JFMAwGA1Ud EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDCB ggYIKwYBBQUHAQEEdjB0MD0GCCsGAQUFBzABhjFodHRwOi8vb2NzcHJlcC5jZXJ0LmZubXQuZXMv b2NzcHJlcC9PY3NwUmVzcG9uZGVyMDMGCCsGAQUFBzAChidodHRwOi8vd3d3LmNlcnQuZm5tdC5l cy9jZXJ0cy9BQ1JFUC5jcnQwHQYDVR0OBBYEFAqqruRhNDefoyxN75s7Nm4Nb9BHMIIBPAYDVR0g BIIBMzCCAS8wggEVBgorBgEEAaxmAwsCMIIBBTApBggrBgEFBQcCARYdaHR0cDovL3d3dy5jZXJ0 LmZubXQuZXMvZHBjcy8wgdcGCCsGAQUFBwICMIHKDIHHQ2VydGlmaWNhZG8gY3VhbGlmaWNhZG8g ZGUgcmVwcmVzZW50YW50ZSBkZSBwLiBqdXLDrWRpY2EgZW4gc3VzIHJlbGFjaW9uZXMgY29uIGxh cyBBQVBQLiBTdWpldG8gYSBjb25kaWNpb25lcyBkZSB1c28gc2Vnw7puIGxhIERQQyBkZSBGTk1U LVJDTSwgTklGOiBRMjgyNjAwNC1KIChDL0pvcmdlIEp1YW4gMTA2LTI4MDA5LU1hZHJpZC1Fc3Bh w7FhKTAJBgcEAIvsQAEAMAkGB2CFVAEDBQgwgacGCCsGAQUFBwEDBIGaMIGXMAgGBgQAjkYBATAT BgYEAI5GAQYwCQYHBACORgEGATBpBgYEAI5GAQUwXzAtFidodHRwczovL3d3dy5jZXJ0LmZubXQu ZXMvcGRzL1BEU19lcy5wZGYTAmVzMC4WKGh0dHBzOi8vd3d3LmNlcnQuZm5tdC5lcy9wZHMvUERT X2VuLnBkZiATAmVuMAsGBgQAjkYBAwIBDzAfBgNVHSMEGDAWgBTcUJaf1zGJyRHk75Zf9l+CUkZi UzCB4QYDVR0fBIHZMIHWMIHToIHQoIHNhoGdbGRhcDovL2xkYXByZXAuY2VydC5mbm10LmVzL0NO PUNSTDEwMjQsT1U9QUMlMjBSZXByZXNlbnRhY2lvbixPVT1DRVJFUyxPPUZOTVQtUkNNLEM9RVM/ Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5hcnk/YmFzZT9vYmplY3RjbGFzcz1jUkxEaXN0 cmlidXRpb25Qb2ludIYraHR0cDovL3d3dy5jZXJ0LmZubXQuZXMvY3Jsc3JlcC9DUkwxMDI0LmNy bDANBgkqhkiG9w0BAQsFAAOCAQEAvht6MSBUp9+Q59Y7DRAHA+cuTLu8c9sNdYlWHwta8Cl9M5X2 a9F8KA9G88J8FwE/RerCirk156k1LsMoUGMFyYHEUKrPy8obf7LgsWm2XnwJCLD3ixZqcfMPMLVm bp658tR2WZz/Ytc/X20cJS49MfyTuLBDGPUVE1KumicBej7p82IjKDu5zPUoCHgnkpe114DtAo5S 5ERxJNux8gTa3fh9pptu/Tk//uB08PFEZDJ9tJBZ4vRWOY5BsHm39kGbKyVjeITzrFUfxhCJXkI0 5xnpK06L4b6a6ENMW4lFaLMURXArZGUaBFTfoRGrMQ6PxLKCtFdyK7vyo9lVpWJjDw==</ds:X509Certificate>

<ds:X509Certificate>MIIG3DCCBMSgAwIBAgIQYcLU1PaprndVkma5ja/WITANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQG EwJFUzERMA8GA1UECgwIRk5NVC1SQ00xGTAXBgNVBAsMEEFDIFJBSVogRk5NVC1SQ00wHhcNMTUw NjMwMDk1MTUzWhcNMjkxMjMxMTA1MTUzWjBNMQswCQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1S Q00xDjAMBgNVBAsMBUNFUkVTMRswGQYDVQQDDBJBQyBSZXByZXNlbnRhY2nDs24wggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCO7E+oUYbuTJaWkEQtIFgcRHD/kHavy+XBFdfCdUzDh9w 7Yq4kYckBPW/YU1QRa4v35HbajEMCs4cyLnoJy8Wyzq7qrSwmNHhMYDjtGywJXbCo5SZVbIwyagW ig8Nb/x9Y5WGWIY76E9agPAoEYOxOG8h1J6ipNoBbq0R+4N4ODaq57ABY7mUSXb4WgjoVg4WxxZw 0GGLuc8R1idoX1G/VqxvNymeCZ7o1bEwbs7X3NhRsK21w3ju8pkUNZXN6Pkflh9qIslOLiokKbiD wwAZE4nvU//B8Q8FLYk1sgTQTLET2EQZ308FlECRp3i6Ay4iezc0Yd3FKIDmOxCdDUcDAgMBAAGj ggLIMIICxDASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU3FCW n9cxickR5O+WX/ZfglJGYlMwgZgGCCsGAQUFBwEBBIGLMIGIMEkGCCsGAQUFBzABhj1odHRwOi8v b2NzcGZubXRyY21jYS5jZXJ0LmZubXQuZXMvb2NzcGZubXRyY21jYS9PY3NwUmVzcG9uZGVyMDsG CCsGAQUFBzAChi9odHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9jZXJ0cy9BQ1JBSVpGTk1UUkNNLmNy dDAfBgNVHSMEGDAWgBT3fcX9xOiaG3dkp/UdoMy/h2CabTCB6wYDVR0gBIHjMIHgMIHdBgRVHSAA MIHUMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzCBpgYIKwYBBQUH AgIwgZkMgZZTdWpldG8gYSBsYXMgY29uZGljaW9uZXMgZGUgdXNvIGV4cHVlc3RhcyBlbiBsYSBE ZWNsYXJhY2nDs24gZGUgUHLDoWN0aWNhcyBkZSBDZXJ0aWZpY2FjacOzbiBkZSBsYSBGTk1ULVJD TSAoIEMvIEpvcmdlIEp1YW4sIDEwNi0yODAwOS1NYWRyaWQtRXNwYcOxYSkwgdQGA1UdHwSBzDCB yTCBxqCBw6CBwIaBkGxkYXA6Ly9sZGFwZm5tdC5jZXJ0LmZubXQuZXMvQ049Q1JMLE9VPUFDJTIw UkFJWiUyMEZOTVQtUkNNLE89Rk5NVC1SQ00sQz1FUz9hdXRob3JpdHlSZXZvY2F0aW9uTGlzdDti aW5hcnk/YmFzZT9vYmplY3RjbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludIYraHR0cDovL3d3dy5j ZXJ0LmZubXQuZXMvY3Jscy9BUkxGTk1UUkNNLmNybDANBgkqhkiG9w0BAQsFAAOCAgEApS/HpvFq 3S42VmjXtoNVxdh+m1/NdjoWVY6M2o9c+UZofrZWbaiQ+aNOn6/+Qf/LZk41jD+nEa/O1GkPyAin eYtjyW6Ae7ltVPIVIWQa3fALcgyN7s/U31qPooU7Zv7a5mghpxapWHvtL9yxpLjrtGsZD32qysIJ 2pjDqJa5WeWVKF2RS1zy6Bm/9JzlxzTCH03kivP5ltp+cHik/KzJZ+HgPv6BLwO+OYrJ19vGbPuD GgOj7uJTG3XQIlZchTltgCmNRPKs/HOGOyDmWxm07FmrADQ1NWag3gjoH8xcfAlp9aBnm/UXFJuA kGOq8ASr+A5dpJeDP/rlKphDdxJpG5YKRwRSb7PnAccstmGxynL+K/0ofxAhbWqC6z7KeGyZBTeV IilPhp+xZzJnvFVBjN6s2j7W3+esQkiT4SdY9RN+c3tBuWF54UNc7YVe6KVTjzkpev9szp6vUNQ+ A45i2KGXRLN6/16nA9fujzITRWmX4tOGABo0aL/wBrf3Po89gvZwZRaVQ9Bw/KfEF8eZDhA1MgQK SPJLSXSl58elHGFLUR2CQMGl+mgfPB0qZUUkRG/RYpZLocczAz6pfkxA3Mt3DfIyVtA/YJ0O4ZYp dbH9zdJZI1RQEWmFrMOrEAWmGIG0SmNpARqOPJsTQJomUcvd3EvA7so2LzLJ+Sjj2So=</ds:X509Certificate>

<ds:X509Certificate>MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=</ds:X509Certificate>

</ds:X509Data>
Lo que no se que certificados esta utilizando ya que en el ordenador solo hay uno instalado. Los de SecureBlackBox me dicen que le pida tres certificos al que esta firmando la factura. Algo totalmente fuera de lugar.

Si firmo tres veces con el mismo certificado me da error tambien al validarlo.

¿A alguien se le ocurre algo?.
Responder Con Cita
  #5  
Antiguo 01-10-2020
Avatar de keys
keys keys is offline
Miembro
 
Registrado: sep 2003
Ubicación: Bilbao
Posts: 1.026
Poder: 22
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
  #6  
Antiguo 01-10-2020
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.461
Poder: 20
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
  #7  
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.038
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
  #8  
Antiguo 01-10-2020
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.461
Poder: 20
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
  #9  
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
Respuesta



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 22:29:51.


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