Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Registros de Facturacion y Eventos (XML) (https://www.clubdelphi.com/foros/forumdisplay.php?f=67)
-   -   chequeo de Firma de un Registro (https://www.clubdelphi.com/foros/showthread.php?t=97565)

newtron 12-11-2024 11:56:15

Firmar registro NO VeriFactu
 
Hola a tod@s.

¿Hay alguien que me pueda orientar sobre cómo firmar el registro para la opción NO VeriFactu?
Según quiero entender hay que generar el .XML y de ahí crear un hash que se firma con el certificado para guardarlo como un campo que será necesario para hacer el envío a la aeat en caso de requerimiento.

He llegado a generar el .XML y crear el hash pero no doy con la forma de firmar ese hash con el certificado con mi Delphi Berlin. Quiero recordar haber leido algo sobre gente que lo ha firmado con las SecureBlackBox pero me vendría bien encontrar una forma nativa para hacer esa firma.

Gracias y un saludo.

Neftali [Germán.Estévez] 12-11-2024 13:26:53

En este hilo el usuario [seccion_31] ha publicado un proyecto con código que incluye la firma utilizando autofirma.

https://www.clubdelphi.com/foros/showthread.php?t=97004

Código Delphi [-]
// firmar el XML con autofirma
procedure TfVeriFactuForm.Button4Click(Sender: TObject);
var
  rutaAutoFirma:string;
  aliascertificado:string;
  cadena:string;
begin
    rutaAutoFirma:=extractfilePath( autoFirmaPath )+'AutoFirmaCommandLine.exe';
    aliascertificado:=CERTIFICADO_ALIAS(comboCertificados.Text);
    if aliasCertificado='' then
    begin
          showmessage('No Se Encuentra Alias Certificado: '+comboCertificados.Text);
          exit;
    end;

    if  fileExists( rutaAutoFirma ) then
    begin
          if fileExists( xmlSalida_signed) then deleteFile( xmlSalida_signed );

          cadena:=ExtractShortPathName (rutaAutoFirma )+' sign -format xades -i "%s" -o "%s" -store windows -password "" -alias "%s"';
          cadena:=format( cadena,[xmlSalida,xmlSalida_signed,aliascertificado ]);
          ExecuteAndWait(cadena);

          if not FileExists(xmlSalida_signed )  then showmessage('Error Firmando')
                                                else shellexecute(handle,'open',pchar(xmlSalida_signed),nil,nil,sw_showNormal);
    end
    else
        showmessage('AutoFirma No Presente En: '+rutaAutoFirma);
    //;
end;

Neftali [Germán.Estévez] 12-11-2024 13:30:08

Y el usuario [Delphier] en el hilo original, en este mensaje, también publicó un proyecto con código, que está en el FTP del club, que permite firmar, en ese caso utilizando los SecureBlackBox (por lo que me ha parecido ver).

newtron 12-11-2024 16:39:45

Gracias compañero pero creo que me estoy despistando bastante con este asunto de la firma NO VeriFactu.
Quiero entender que lo que piden es que guardes la firma del .XML para, en caso de requerimiento, poder "construir" el .XML con ese campo de firma añadido en un nodo específico. Entiendo que eso es distinto a firmar un .XML y guardar el fichero firmado.
Yo puedo coger un fichero .XML y firmarlo digitalmente pero eso lo que hace es añadir al .XML una serie de nodos que no creo que tengan mucho que ver con la firma que piden luego en la estructura del fichero SOAP.
¿Es así o simplemente basta con guardar el fichero .XML firmado?

Gracias y un saludo.

novatico 12-11-2024 17:11:31

Cita:

Empezado por newtron (Mensaje 559646)
Gracias compañero pero creo que me estoy despistando bastante con este asunto de la firma NO VeriFactu.
Quiero entender que lo que piden es que guardes la firma del .XML para, en caso de requerimiento, poder "construir" el .XML con ese campo de firma añadido en un nodo específico. Entiendo que eso es distinto a firmar un .XML y guardar el fichero firmado.
Yo puedo coger un fichero .XML y firmarlo digitalmente pero eso lo que hace es añadir al .XML una serie de nodos que no creo que tengan mucho que ver con la firma que piden luego en la estructura del fichero SOAP.
¿Es así o simplemente basta con guardar el fichero .XML firmado?

Gracias y un saludo.

Pues creo que eso exactamente, si te fijas el último nodo del registro de facturación se llama "Signature", que es exactamente lo que se añade a un fichero cuando lo firmas, un nodo llamado "Signature" con varios "subnodos". Es cuestión de probar.

Neftali [Germán.Estévez] 12-11-2024 17:16:11

Cita:

Empezado por newtron (Mensaje 559646)
Yo puedo coger un fichero .XML y firmarlo digitalmente pero eso lo que hace es añadir al .XML una serie de nodos que no creo que tengan mucho que ver con la firma que piden luego en la estructura del fichero SOAP.


Pues justo eso.
Firmar el XML genera unos nodos extra con la firma.

Por ejemplo algo así:

Código PHP:

<?xml version="1.0" encoding="utf-8"?>
<sum:RegFactuSistemaFacturacion xmlns:xd="http://www.w3.org/2000/09/xmldsig#" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd">
  <sum:RegistroFactura>
    <sum1:RegistroAlta>
      <sum1:IDVersion>1.0</sum1:IDVersion>
      
      .... todo esto sería lo que corresponde al registro de facturación
      .... lo quito para abreviar

      <sum1:NumRegistroAcuerdoFacturacion></sum1:NumRegistroAcuerdoFacturacion>
      <sum1:IdAcuerdoSistemaInformatico></sum1:IdAcuerdoSistemaInformatico>
      <sum1:TipoHuella>01</sum1:TipoHuella>
      <sum1:Huella>F96F84EAE2A27EE2ECC1F9283075B7EBC96817A7C18FDE46F4C3CEE7F58C56AC</sum1:Huella>
    </sum1:RegistroAlta>
  </sum:RegistroFactura>


  <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
    <ds:SignedInfo>
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
      <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
      <ds:Reference Id="Reference-ceebfecd-9605-4f1a-aa71-c75d652aa53c" URI="">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>MdPzS7i+7f73ejsLpLFZqK4Gji7//N4jgeZg4EGEhKM=</ds:DigestValue>
      </ds:Reference>
      <ds:Reference Id="ReferenceKeyInfo" URI="#KeyInfoId-Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>4ooJRYhKp0wF5esWLT7++8acQZsoHq2lSBH7Q1x9hn8=</ds:DigestValue>
      </ds:Reference>
      <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#SignedProperties-Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
        <ds:Transforms>
          <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        </ds:Transforms>
        <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
        <ds:DigestValue>n+oqDbcVLM5jCcBFNix4eHcmQTIPXSgb+hYR7SJzUwc=</ds:DigestValue>
      </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id="SignatureValue-774231ed-e9e7-47b9-96b4-706291ab3d0d">
      PEm+pl4ljW2AObrD7jNIo4EWHh3YEnT1BdXQR5s1Zni6y0ELMcMTH9Gu5pLAHMCe90JHnv5KvKjjwiRF8pF0GIVaSVcmXtMGEl/LHnwJ62GJQr7lWtV1GXiOgEEeV8cu5wmw47jKUvzWSTrx6Y1jLcDd6N0YdvXB22LL4M0qTkCOMfRqIK0ni0orYA9hR7fHSdiYw4TPZyPIBFNTt4YYYStAFFtFWPQHusn0HeR3WL3DQ7syV5x7umQIWDSnmcXA5iUNBI9kAYDZvCxQHAJ68lf5G4+shn6/l6oeucF8daiuJ40GKq6u05/MUElh0bDAROVcSJ/eZu/D1OU9oTi3tUL3QRajK1P6yNduMHvpTij+VlMXdHkdERcnOElkfSYoqLhlvoR2MHpH2jrcjN12/m+1lPROr39vSfOZFxO7IoXM/FgGS1hdS7JCqTi/oe1O2WJmjJbbzQMEWZY7uxw3SRB/thC9hiJ7aBoeqSf4aIKo/2VQdZ+FJdkfVVUSgISGSNDbQK7Ijd0R8fq46s6YNgvnPf0Z/2GdPoIEagDCA5UWomc2O2mFN8toAbh0eYYV28pmPAgEF4vU/B/fWr5uq4A/n7YpTCCjsYmLULxZBqoJIHwWpB2Tjq7JKAHsFSYGdxuCcxwLwfaia7Sy07M/Nv3CjMOVANWZpUVRS+fPz4M=
    </ds:SignatureValue>
    <ds:KeyInfo Id="KeyInfoId-Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
      <ds:X509Data>
        <ds:X509Certificate>MIIJDDCCBvSgAwIBAgIQHpqv2S+e3ZZgk/gLEO+XjjANBgkqhkiG9w0BAQsFADCBnTELMAkGA1UEBhMCRVMxFDASBgNVBAoMC0laRU5QRSBTLkEuMTowOAYDVQQLDDFBWlogWml1cnRhZ2lyaSBwdWJsaWtvYSAtIENlcnRpZmljYWRvIHB1YmxpY28gU0NBMTwwOgYDVQQDDDNFQUVrbyBIZXJyaSBBZG1pbmlzdHJhemlvZW4gQ0EgLSBDQSBBQVBQIFZhc2NhcyAoMikwHhcNMjEwNTA2MTQwNzA3WhcNMzEwNTA2MTQwNzA3WjCBoTELMAkGA1UEBhMCRVMxDTALBgNVBAoMBEFTVVMxNzA1BgNVBAsMLkdhaWx1IHppdXJ0YWdpcmlhIC0gQ2VydGlmaWNhZG8gZGUgZGlzcG9zaXRpdm8xIzAhBgNVBAsMGlpFUEhZUlVTIE0gR1U1MDJHVV9HVTUwMkdVMQswCQYDVQQLDAJQQzEYMBYGA1UEAwwPTDFOUkNWMDFENzQ4MDI3MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA3+RvefNVHNcvHSzFmjXNMRdZXKctuVAY6hOy2nc486H4opgE8H5/2orrIF9wfJW6Hb5xAhc6DNhlfXoTq6a5OSAKPDyn7az8uYzuOR+HIFn8Ow8y4/An+kHCyTqN2avksmQDrc2cfxzdUYu6GVIazmfU2iFiwXCrG+lJDEeLoh+8VD6YCnFDSuCyZVUcTaPVg/ymjtVcXJoLe8qiXjha63Yf+EKt9Sz9xgRZVGA68eixJWXwU/D0UYC/miw6JWro4whWO8o5vDrSdLvpmpojXRRCZcDktFKwsIbJW9u7bFxNv5LPzVgM14mBzpUfJ2/JuQbB79Gq6l6NPtN53qlHPgA3jTJTOX0vHqkCEU1VTVN8UqHmNQxbXt6gbRERaQRt/h0lE4yW+GYI7AQLoDlpwFRXRt5bL8NcCWQtH7HkUyNbN3EQFj48sOn5sVKzOfkbWPPC5BgSoziXlPpsTYZMlP2uLv3vD1iY0XHau/C821FJVZ0r/oqE37rukHk8gyCP6Yc1xON05d2rrs+rwTqgwxnSWx4SogyGyzdovS0LUT/zfM+fLJeILC5941X5iMSvvrHrGN829f+J+/uo5dez5X4eyyzqXrc/FwbgT02Y+kni2c1Wb+T5XmnVTpiwarI38W6zru+XTEPKirhJnEGIy1tT85JGoBlzWXSnY794XDsCAwEAAaOCA0AwggM8MIHHBgNVHRIEgb8wgbyGFWh0dHA6Ly93d3cuaXplbnBlLmNvbYEPaW5mb0BpemVucGUuY29tpIGRMIGOMUcwRQYDVQQKDD5JWkVOUEUgUy5BLiAtIENJRiBBMDEzMzcyNjAtUk1lcmMuVml0b3JpYS1HYXN0ZWl6IFQxMDU1IEY2MiBTODFDMEEGA1UECQw6QXZkYSBkZWwgTWVkaXRlcnJhbmVvIEV0b3JiaWRlYSAxNCAtIDAxMDEwIFZpdG9yaWEtR2FzdGVpejAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0OBBYEFP7l1cwcXOUTcx9428TFx7oWETeTMB8GA1UdIwQYMBaAFMCpSvdHJYf/vLWmic6C0kaoieujMIIBHgYDVR0gBIIBFTCCAREwggENBgorBgEEAfM5AQMCMIH+MCUGCCsGAQUFBwIBFhlodHRwOi8vd3d3Lml6ZW5wZS5jb20vY3BzMIHUBggrBgEFBQcCAjCBxwyBxEJlcm1lZW4gbXVnYWsgZXphZ3V0emVrbyB3d3cuaXplbnBlLmNvbSBaaXVydGFnaXJpYW4ga29uZmlhbnR6YSBpemFuIGF1cnJldGlrIGtvbnRyYXR1YSBpcmFrdXJyaS5MaW1pdGFjaW9uZXMgZGUgZ2FyYW50aWFzIGVuIHd3dy5pemVucGUuY29tIENvbnN1bHRlIGVsIGNvbnRyYXRvIGFudGVzIGRlIGNvbmZpYXIgZW4gZWwgY2VydGlmaWNhZG8wHwYDVR0lBBgwFgYIKwYBBQUHAwIGCisGAQQBgjcKAwwwgaAGCCsGAQUFBwEBBIGTMIGQMCIGCCsGAQUFBzABhhZodHRwOi8vb2NzcC5pemVucGUuY29tMGoGCCsGAQUFBzAChl5odHRwOi8vd3d3Lml6ZW5wZS5jb20vY29udGVuaWRvcy9pbmZvcm1hY2lvbi9jYXNfaXplbnBlL2VzX2Nhcy9hZGp1bnRvcy9BQVBQTlJfY2VydF9zaGEyNTYuY3J0MDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly9jcmwuaXplbnBlLmNvbS9jZ2ktYmluL2NybGludGVybmEyMA0GCSqGSIb3DQEBCwUAA4ICAQCSM24d7ToO2NXrsNp4U8PcgmT3qVTbGgtfZix8774SzElCaKBYZvEDqsJpTdlpzDmUXbCtAJsFGeCj/vz3P4Ot1DUYiej7TttsSsTLZUHrxI8mn++R9vlXLOsioRxf4XORdyvinRgUHv3SJ6Xk6Yc67QRKjJsOQhjTuZ0fyzNsyCwvEJ2W8B1UhAuUF0rGzmez6brwfJnWtZMMCRtPsvaHvG2CK91koqkuoYdheoKFC3Ud5TMP1djc5p5KXzFzTNgHIX1Wl6L8go+Pco24V67hG7n58daRI0RVG7guuYMbxk1r76/58QnIYVD0n44QT0b27Ki0flG6rFLfNRZpiNUMAPTtDAAH3aJ41XoNwkfOyxZrt9BUUdg5wCJI+1TYsClXkUj395w3DSZ8BY55QNOyrf5XQjDmtuk/jqTzjlheAL94NIAs5Pa+vG8b8aOuNG6MKZXNF1hKPx7bZ4cxkWnLJX8wA0Ohw8I8TqWDc44ZAwXvxAjwTM7WrXtMixeCIapJjQwR9TJvtf+I1FvnLsPUVlnAuqkjs6K4Wzd3CmekqNLXGX/1jfi0avmkVAHbFGFnmwoKyW7zP7MVMELSAF9O9szOdIDS8L1IckohxvZr8P+IkYRbJPhy0HFFJrqevnwAqI4wYL5fFlj3CJGDhwwgTYdx/79ph9fp3sXUIAhO7Q==</ds:X509Certificate>
      </ds:X509Data>
      <ds:KeyValue>
        <ds:RSAKeyValue>
          <ds:Modulus>3+RvefNVHNcvHSzFmjXNMRdZXKctuVAY6hOy2nc486H4opgE8H5/2orrIF9wfJW6Hb5xAhc6DNhlfXoTq6a5OSAKPDyn7az8uYzuOR+HIFn8Ow8y4/An+kHCyTqN2avksmQDrc2cfxzdUYu6GVIazmfU2iFiwXCrG+lJDEeLoh+8VD6YCnFDSuCyZVUcTaPVg/ymjtVcXJoLe8qiXjha63Yf+EKt9Sz9xgRZVGA68eixJWXwU/D0UYC/miw6JWro4whWO8o5vDrSdLvpmpojXRRCZcDktFKwsIbJW9u7bFxNv5LPzVgM14mBzpUfJ2/JuQbB79Gq6l6NPtN53qlHPgA3jTJTOX0vHqkCEU1VTVN8UqHmNQxbXt6gbRERaQRt/h0lE4yW+GYI7AQLoDlpwFRXRt5bL8NcCWQtH7HkUyNbN3EQFj48sOn5sVKzOfkbWPPC5BgSoziXlPpsTYZMlP2uLv3vD1iY0XHau/C821FJVZ0r/oqE37rukHk8gyCP6Yc1xON05d2rrs+rwTqgwxnSWx4SogyGyzdovS0LUT/zfM+fLJeILC5941X5iMSvvrHrGN829f+J+/uo5dez5X4eyyzqXrc/FwbgT02Y+kni2c1Wb+T5XmnVTpiwarI38W6zru+XTEPKirhJnEGIy1tT85JGoBlzWXSnY794XDs=</ds:Modulus>
          <ds:Exponent>AQAB</ds:Exponent>
        </ds:RSAKeyValue>
      </ds:KeyValue>
    </ds:KeyInfo>
    <ds:Object Id="XadesObjectId-e1f7803a-06c3-4efb-80a1-240de019d004">
      <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Id="QualifyingProperties-8b4ef365-4074-4ac4-9cac-5a609fc6672a" Target="#Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
        <xades:SignedProperties Id="SignedProperties-Signature-774231ed-e9e7-47b9-96b4-706291ab3d0d">
          <xades:SignedSignatureProperties>
            <xades:SigningTime>2024-11-12T16:19:07+01:00</xades:SigningTime>
            <xades:SigningCertificate>
              <xades:Cert>
                <xades:CertDigest>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                  <ds:DigestValue>7RfvGuxIRTKz5Thh0ysc2xcu7vcSE7XLJmVIgr2d41k=</ds:DigestValue>
                </xades:CertDigest>
                <xades:IssuerSerial>
                  <ds:X509IssuerName>CN=EAEko Herri Administrazioen CA - CA AAPP Vascas (2), OU=AZZ Ziurtagiri publikoa - Certificado publico SCA, O=IZENPE S.A., C=ES</ds:X509IssuerName>
                  <ds:X509SerialNumber>40680020218691596437659190274445776782</ds:X509SerialNumber>
                </xades:IssuerSerial>
              </xades:Cert>
            </xades:SigningCertificate>
            <xades:SignaturePolicyIdentifier>
              <xades:SignaturePolicyId>
                <xades:SigPolicyId>
                  <xades:Identifier>https://www.agenciatributaria.es/verifactu/firma</xades:Identifier>
                  <xades:Description></xades:Description>
                </xades:SigPolicyId>
                <xades:SigPolicyHash>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>aHR0cHM6Ly93d3cuYWdlbmNpYXRyaWJ1dGFyaWEuZXMvdmVyaWZhY3R1L2Zpcm1h</ds:DigestValue>
                </xades:SigPolicyHash>
              </xades:SignaturePolicyId>
            </xades:SignaturePolicyIdentifier>
            <xades:SignerRole>
              <xades:ClaimedRoles>
                <xades:ClaimedRole>tercero</xades:ClaimedRole>
              </xades:ClaimedRoles>
            </xades:SignerRole>
          </xades:SignedSignatureProperties>
          <xades:SignedDataObjectProperties>
            <xades:DataObjectFormat ObjectReference="#Reference-ceebfecd-9605-4f1a-aa71-c75d652aa53c">
              <xades:MimeType>text/xml</xades:MimeType>
              <xades:Encoding>UTF-8</xades:Encoding>
            </xades:DataObjectFormat>
          </xades:SignedDataObjectProperties>
        </xades:SignedProperties>
      </xades:QualifyingProperties>
    </ds:Object>
  </ds:Signature>
</sum:RegFactuSistemaFacturacion>

La parte del <ds:signature>...</ds:signature> sería el resultado de firnmar el XML.

newtron 12-11-2024 17:23:00

:eek: Ok.... entonces.... Yo firmo el fichero .XML y lo guardo. ¿Cuando lo pidan cómo se envía?


Gracias y un saludo.

rci 13-11-2024 10:17:06

Cita:

Empezado por newtron (Mensaje 559658)
:eek: Ok.... entonces.... Yo firmo el fichero .XML y lo guardo. ¿Cuando lo pidan cómo se envía?


Gracias y un saludo.

Creo que se envía igual que se envían todas las factura en el modo "Veri*Factu" pero a una url distinta y con alguna propiedad de la cabecera distinta, que indica que es un requerimiento y no remisión voluntaria. o algo así

newtron 13-11-2024 10:30:59

Cita:

Empezado por rci (Mensaje 559685)
Creo que se envía igual que se envían todas las factura en el modo "Veri*Factu" pero a una url distinta y con alguna propiedad de la cabecera distinta, que indica que es un requerimiento y no remisión voluntaria. o algo así


¿Y sabemos dónde están esos requerimientos o todavía no los han publicado?


Gracias y un saludo.

rci 13-11-2024 11:24:36

Cita:

Empezado por newtron (Mensaje 559689)
¿Y sabemos dónde están esos requerimientos o todavía no los han publicado?


Gracias y un saludo.

Si, es la misma documentación técnica de Veri*Factu.
Hay información de las dos modalidades

Neftali [Germán.Estévez] 13-11-2024 11:26:33

Cita:

Empezado por newtron (Mensaje 559658)
:eek: Ok.... entonces.... Yo firmo el fichero .XML y lo guardo. ¿Cuando lo pidan cómo se envía?

Extraído de la documentación:

6.5. Remisión voluntaria y por requerimiento.

Existe un único formato de registro de facturación para remisión voluntaria por parte sistemas que emiten facturas verificables y ante un
requerimiento
. Por tanto, el esquema XSD es único para los dos casos.
Aunque el esquema XSD es común, existen URLs diferentes para la remisión voluntaria y ante requerimiento.
Además, son distintos sistemas de gestión en la AEAT, sin compartición de los registros de facturación remitidos entre ellos.

La definición de los servicios web para la remisión voluntaria y ante requerimiento se encuntra en el archivo WSDL en la siguiente dirección:
https://prewww2.aeat.es/static_files...cturacion.wsdl

newtron 13-11-2024 11:33:52

Perfecto... iremos revisando.


Gracias a todos.

Sandy656 15-11-2024 11:53:49

Hola a todos.

He realizado la firma para guardar el xml firmado pero me coloca la firma al inicio del xml y al enviarlo para comprobar si está correcto me devuelve esto:

Código PHP:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Body>
        <env:Fault>
            <faultcode>env:Server</faultcode>
            <faultstring>Codigo[1207].Se esperaba nodo {http://schemas.xmlsoap.org/soap/envelope/}Envelope y ha venido {http://www.w3.org/2000/09/xmldsig#}Signature</faultstring>
        </env:Fault>
    </env:Body>
</env:Envelope>

Si cambio manualmente el xml y coloco todo el bloque signature al final ,antes del nodo </RegFactuSistemaFacturacion> me lo da como correcto.

¿Cómo se puede realizar la firma colocando todo correcto?

gracias a todos.

newtron 15-11-2024 12:16:31

Cita:

Empezado por Sandy656 (Mensaje 559790)
Hola a todos.

He realizado la firma para guardar el xml firmado pero me coloca la firma al inicio del xml y al enviarlo para comprobar si está correcto me devuelve esto:

Código PHP:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Body>
        <env:Fault>
            <faultcode>env:Server</faultcode>
            <faultstring>Codigo[1207].Se esperaba nodo {http://schemas.xmlsoap.org/soap/envelope/}Envelope y ha venido {http://www.w3.org/2000/09/xmldsig#}Signature</faultstring>
        </env:Fault>
    </env:Body>
</env:Envelope>

Si cambio manualmente el xml y coloco todo el bloque signature al final ,antes del nodo </RegFactuSistemaFacturacion> me lo da como correcto.

¿Cómo se puede realizar la firma colocando todo correcto?

gracias a todos.


¿Y cómo estás firmando el fichero?

Sandy656 15-11-2024 12:25:52

Hola. Este es el código que uso.

Código PHP:

    Entrada:=DirAplicacion+'Copias\VerifactuEntrada.xml';
      
Salida:=DirAplicacion+'Copias\VerifactuSalidaSigned.xml';
      
MemoXML.Lines.SaveToFile(Entrada); //guardo el xml inicial
      
MemoXML.Lines.SaveToFile(Salida);//guardo el xml inicial
      
aliascertificado:=P_DataVarios.QSala.FieldByName('ultima_firma').AsString// tomo la firma
      
ACardinal:=-1;
      if 
not FileExists(Salida )  then showmessage('Error Firmando')
      else
      
begin
        ACardinal
:=ShellExecute(Handle,
        
PWideChar('open'),
        
PWideChar('autofirmacommandline'),
        
PWideChar('sign -i "'+Entrada+'" -o "'+Salida+'" -format xades'+' -store windows -alias "'+aliascertificado+'"'),
        
nil,
        
SW_SHOWNORMAL);
      
end


newtron 15-11-2024 12:36:33

Cita:

Empezado por Sandy656 (Mensaje 559793)
Hola. Este es el código que uso.

Código PHP:

    Entrada:=DirAplicacion+'Copias\VerifactuEntrada.xml';
      
Salida:=DirAplicacion+'Copias\VerifactuSalidaSigned.xml';
      
MemoXML.Lines.SaveToFile(Entrada); //guardo el xml inicial
      
MemoXML.Lines.SaveToFile(Salida);//guardo el xml inicial
      
aliascertificado:=P_DataVarios.QSala.FieldByName('ultima_firma').AsString// tomo la firma
      
ACardinal:=-1;
      if 
not FileExists(Salida )  then showmessage('Error Firmando')
      else
      
begin
        ACardinal
:=ShellExecute(Handle,
        
PWideChar('open'),
        
PWideChar('autofirmacommandline'),
        
PWideChar('sign -i "'+Entrada+'" -o "'+Salida+'" -format xades'+' -store windows -alias "'+aliascertificado+'"'),
        
nil,
        
SW_SHOWNORMAL);
       
end


</div>

Yo la verdad es que con autofirma no he probado pero podrías probar con la sintaxis que tienes en este mismo hilo un poco más arriba.

Sandy656 15-11-2024 12:44:21

He intentado con el código que me has indicado pero al llamar a la función autoFirmaPath me da el mensaje 'Error 2'. He buscado en el registro y esa cadena está vacía.

Código PHP:

function autoFirmaPath:string;
var
  
RegTRegistry;
begin
  Reg 
:= TRegistry.Create;
  
with Reg do
  
begin
    RootKey 
:= HKEY_CLASSES_ROOT;
    if 
OpenKey('\afirma\shell\open\command',falsethen
    begin
      
if ValueExists(''then
        Result 
:= Readstring('')
      else
        
ShowMessage('error');
    
end
    
else
      
ShowMessage('Error 2');
    
CloseKey;
  
end;
end


delphiGar 15-11-2024 12:50:29

Cita:

Empezado por Sandy656 (Mensaje 559790)
Hola a todos.

He realizado la firma para guardar el xml firmado pero me coloca la firma al inicio del xml y al enviarlo para comprobar si está correcto me devuelve esto:

Código PHP:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Body>
        <env:Fault>
            <faultcode>env:Server</faultcode>
            <faultstring>Codigo[1207].Se esperaba nodo {http://schemas.xmlsoap.org/soap/envelope/}Envelope y ha venido {http://www.w3.org/2000/09/xmldsig#}Signature</faultstring>
        </env:Fault>
    </env:Body>
</env:Envelope>

Si cambio manualmente el xml y coloco todo el bloque signature al final ,antes del nodo </RegFactuSistemaFacturacion> me lo da como correcto.

¿Cómo se puede realizar la firma colocando todo correcto?

gracias a todos.

El xml que has firmado me da que no lo verifica el entorno donde lo estas enviando, eso se verificara en el entorno de Pre/Pro por requerimiento no en el voluntario, ya que no es obligatorio.

Sandy656 15-11-2024 12:57:16

Creo que puede ser eso porque el xml firmado me lo genera correctamente. Lo que ocurre es que si lo guardo así, no se si se estará guardando en el formato correcto.

¿No habrá una forma de comprobarlo igual que los registros que se envían en el entorno de pruebas?

delphiGar 15-11-2024 13:04:32

Cita:

Empezado por Sandy656 (Mensaje 559798)
Creo que puede ser eso porque el xml firmado me lo genera correctamente. Lo que ocurre es que si lo guardo así, no se si se estará guardando en el formato correcto.

¿No habrá una forma de comprobarlo igual que los registros que se envían en el entorno de pruebas?

El entorno de pruebas de por requerimiento no esta implantado. De hecho el wdsl no existe la url de envio.

Código:

<!--  Sistemas que emiten facturas NO verificables. (Remision bajo requerimiento). Entorno de PRUEBAS  -->
<wsdl:port name="SistemaRequerimientoPruebas" binding="sfWdsl:sfRequerimiento">
<soap:address location="xxxxxxxxxx"/>
</wsdl:port>


Sandy656 15-11-2024 13:06:29

Ok. Estaremos atentos a ver cuando se puede hacer.

Gracias a todos!!

razorxxx 25-11-2024 13:41:14

¿Alguno de ustedes sabe si la firma que piden para los XML es la misma que para FACe? Lo pregunto porque igual me vale la misma rutina que tenía.

En cuanto a los mensajes SOAP, interpreto que no van firmados, sino que se les adjunta el certificado en el método NodeBeforePost del objeto HTTPRIO, ¿verdad?

Maska10 29-11-2024 11:31:58

Buenas a todos, estoy intentando firmar el fichero con autofirmacommandline con el siguiente comando:

Código:

/v:1 /c AutoFirmaCommandLine.exe sign -i "C:\SYSME\SGC\efactura\efacturas\fs-F198.xml" -o "C:\SYSME\SGC\efactura\efacturassigned\fs-F198.xml" -store pkcs12:"G:\sysme\docs\SYSME2023.p12" -filter "imported" -password "xxxxxx" -format xades -xml -config "format=XAdES Enveloped \npolicyIdentifier=urn:oid:2.16.724.1.3.1.1.2.1.9 \npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 \npolicyQualifier=https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf" > resultado.txt
El resultado es de error porque el fichero no es un XML válido por los prefijos (sum:)

?????

newtron 19-12-2024 18:00:34

Hola a tod@s de nuevo.


Después de algunas semanas ocupado en cambiar mi ordenador estoy retomando de nuevo el tema VeriFactu y quería ver si alguien había hecho ya algo sobre la remisión por requerimiento. Entiendo que hay que añadir en el campo "signature" el fichero XML original firmado pero estoy viendo que el campo es del tipo "signature".


¿Alguien está haciendo ya remisión de esos datos? ¿Alguien puede confirmarme que en el campo "signature" hay que insertar el xml firmado o es de otra manera? y en caso de serlo cómo se informa ese campo a partir del XML firmado.


Gracias y un saludo.

Maska10 19-12-2024 18:38:12

Cita:

Empezado por newtron (Mensaje 560843)
Hola a tod@s de nuevo.


Después de algunas semanas ocupado en cambiar mi ordenador estoy retomando de nuevo el tema VeriFactu y quería ver si alguien había hecho ya algo sobre la remisión por requerimiento. Entiendo que hay que añadir en el campo "signature" el fichero XML original firmado pero estoy viendo que el campo es del tipo "signature".


¿Alguien está haciendo ya remisión de esos datos? ¿Alguien puede confirmarme que en el campo "signature" hay que insertar el xml firmado o es de otra manera? y en caso de serlo cómo se informa ese campo a partir del XML firmado.


Gracias y un saludo.

No no, a ver, al firmar el fichero original, el proceso de firma ya incluye el <ds:Signature en el fichero firmado, simplemente firma con la tipología y parámetros que te indican y listo

newtron 20-12-2024 09:41:22

Cita:

Empezado por Maska10 (Mensaje 560845)
No no, a ver, al firmar el fichero original, el proceso de firma ya incluye el <ds:Signature en el fichero firmado, simplemente firma con la tipología y parámetros que te indican y listo


Ahhhh... ok. Entonces... a ver si me entero. Yo guardo el .XML firmado en una carpeta. En caso de remisión por requerimiento lo único que tendría que hacer sería enviar directamente ese fichero. ¿Es correcto?


Gracias y un saludo.

Maska10 20-12-2024 09:44:24

Cita:

Empezado por newtron (Mensaje 560868)
Ahhhh... ok. Entonces... a ver si me entero. Yo guardo el .XML firmado en una carpeta. En caso de remisión por requerimiento lo único que tendría que hacer sería enviar directamente ese fichero. ¿Es correcto?


Gracias y un saludo.

Exacto, logicamente añadiendo la cabecera del envio y tal .. también ten cuidado porque al firmarlo (en mi caso con autofirmacommandline) me añade <?xml version="1.0" encoding="UTF-8"?> al inicio y esto hay que eliminarlo en cada fichero para enviarlo.

razorxxx 20-12-2024 09:53:44

Cita:

Empezado por newtron (Mensaje 560868)
Ahhhh... ok. Entonces... a ver si me entero. Yo guardo el .XML firmado en una carpeta. En caso de remisión por requerimiento lo único que tendría que hacer sería enviar directamente ese fichero. ¿Es correcto?


Gracias y un saludo.

Si bien el Reglamento no especifica cómo los desarrolladores deben almacenar la información, por los principios de "integridad e inalterabilidad" yo que tú no guardaría los XML como ficheros sueltos en una carpeta, ya que cualquier persona de la red podría acceder a ellos y manipularlos, borrarlos, etc. Otra cosa sería que lo hicieras porque vas a funcionar en modo VeriFactu y se van enviar en breve. Pero para almacenamiento a largo plazo, te recomendaría que guardaras los XML en la base de datos de tu programa.

Es verdad que esto hará crecer el tamaño de la base de datos exponencialmente, pero en teoría sólo los administradores del servidor y/o desarrolladores del programa deberían tener acceso a esa base de datos, y se minimizarían los riesgos.

Maska10 20-12-2024 09:57:04

Cita:

Empezado por razorxxx (Mensaje 560871)
Si bien el Reglamento no especifica cómo los desarrolladores deben almacenar la información, por los principios de "integridad e inalterabilidad" yo que tú no guardaría los XML como ficheros sueltos en una carpeta, ya que cualquier persona de la red podría acceder a ellos y manipularlos, borrarlos, etc. Otra cosa sería que lo hicieras porque vas a funcionar en modo VeriFactu y se van enviar en breve. Pero para almacenamiento a largo plazo, te recomendaría que guardaras los XML en la base de datos de tu programa.

Es verdad que esto hará crecer el tamaño de la base de datos exponencialmente, pero en teoría sólo los administradores del servidor y/o desarrolladores del programa deberían tener acceso a esa base de datos, y se minimizarían los riesgos.

Yo en, Ticket Bai, guardaba los xml firmados en base de datos y a los pocos meses era insoportable, logicamente teniendo en cuenta que los equipos Tpv de los usuarios suelen ser básicos ... al final opté por carpetas.

YellowStone 20-12-2024 10:03:27

Cita:

Empezado por Maska10 (Mensaje 560869)
Exacto, logicamente añadiendo la cabecera del envio y tal .. también ten cuidado porque al firmarlo (en mi caso con autofirmacommandline) me añade <?xml version="1.0" encoding="UTF-8"?> al inicio y esto hay que eliminarlo en cada fichero para enviarlo.


Ojito con quitar o trastocar cosas de un fichero ya firmado, porque entonces la firma pasa a ser incorrecta. Los que vayáis a desarrollar NO VERIFACTU (Dios me libre), acordaros de que tenéis que desarrollar también la parte del registro de eventos.

razorxxx 20-12-2024 10:04:55

Cita:

Empezado por Maska10 (Mensaje 560872)
Yo en, Ticket Bai, guardaba los xml firmados en base de datos y a los pocos meses era insoportable, logicamente teniendo en cuenta que los equipos Tpv de los usuarios suelen ser básicos ... al final opté por carpetas.

El Reglamento nos deja vendidos la verdad, yo también lo primero que pensé fue en que las bases de datos se van a ir por la pata abajo, pero luego te meten miedo con el Reglamento. Se me ocurre también usar carpetas que sólo sean accesibles en el servidor por el programa que realiza los envíos y por un único usuario administrador del servidor, pero que no esté disponible en la red.

Maska10 20-12-2024 10:10:58

Cita:

Empezado por YellowStone (Mensaje 560873)
Ojito con quitar o trastocar cosas de un fichero ya firmado, porque entonces la firma pasa a ser incorrecta. Los que vayáis a desarrollar NO VERIFACTU (Dios me libre), acordaros de que tenéis que desarrollar también la parte del registro de eventos.

Si, eso me preocupaba, pero resulta que ese encabezado que añade autofirma "<?xml version="1.0" encoding="UTF-8"?>" parece no formar parte del resultado de firma, lo quito y me sigue validando como firma correcta, logicamente si tocas cualquier otro caracter ya no valida.

razorxxx 20-12-2024 10:25:22

Cita:

Empezado por Maska10 (Mensaje 560875)
Si, eso me preocupaba, pero resulta que ese encabezado que añade autofirma "<?xml version="1.0" encoding="UTF-8"?>" parece no formar parte del resultado de firma, lo quito y me sigue validando como firma correcta, logicamente si tocas cualquier otro caracter ya no valida.

Correcto amigo, es lo mismo que ya hacíamos para FACe. De hecho, si le dejas lo de <?xml version="1.0" encoding="UTF-8"?> no valida.

newtron 20-12-2024 10:40:14

Cita:

Empezado por Maska10 (Mensaje 560869)
Exacto, logicamente añadiendo la cabecera del envio y tal .. también ten cuidado porque al firmarlo (en mi caso con autofirmacommandline) me añade <?xml version="1.0" encoding="UTF-8"?> al inicio y esto hay que eliminarlo en cada fichero para enviarlo.


:confused: ¿Y cómo va eso? Pregunto porque yo los envíos los tengo con llamadas soap y no enviando los ficheros. ¿Qué habría que hacer para montar la cabecera y luego enviar los ficheros? ¿Algún ejemplo por ahí?


Yo firmo con una dll que me prepararon con .net para firmar archivos para facturae hace unos años y la verdad es que no sé todavía si se tragará el fichero. De momento voy a intentar enviarlo a ver qué pasa, cuando averigue cómo, claro.



Gracias y un saludo.

YellowStone 20-12-2024 17:05:31

Cita:

Empezado por razorxxx (Mensaje 560876)
Correcto amigo, es lo mismo que ya hacíamos para FACe. De hecho, si le dejas lo de <?xml version="1.0" encoding="UTF-8"?> no valida.




??? A mi me validan perfectamente con <?xml version="1.0" encoding="UTF-8"?> (Hablo del FACE). Supongo que quizá será porque ya tengo incluida esa primera línea antes de mandar el fichero a firmar.

newtron 30-12-2024 19:26:29

Hola de nuevo.


¿No ha conseguido nadie todavía subir con éxito alguna factura en modo NO VeriFACTU?


Saludos y ¡¡Feliz Año!!

newtron 03-01-2025 10:55:27

Ok.


Por si a alguien le viene bien creo que he conseguido enviar registros en modo NO Verifactu a partir de los ficheros XML de las facturas firmados en disco con una pequeña "ñapa".


Lo que he hecho ha sido crear un fichero .xml con la cabecera "a pelo" hasta el nodo "RegistroFactura"

A esto le añado los ficheros xml firmados leyendo cada uno de ellos y al final cierro los nodos.

Una vez creado este fichero hago una llamada SOAP e intercepto el evento "beforeexecute" del objeto HTTPRIO y sustituyo el stream por el del fichero que he generado con el siguiente código:

Código Delphi [-]
  // Cargar el archivo XML desde disco
  XMLFactura := TStringList.Create;
  XMLFactura.LoadFromFile('C:\TEMP\prueba.xml'); // Fichero creado "a pelo"
  // Leer el contenido del flujo SOAPRequest
  RequestStream := TStringStream.Create;
  SOAPRequest.Position := 0;
  RequestStream.CopyFrom(SOAPRequest, SOAPRequest.Size);
  // Convertir el flujo a una cadena para su manipulación
  ModifiedRequest := RequestStream.DataString;
  ModifiedRequest:=XMLFactura.Text;
  // Sobrescribir el contenido del flujo con la solicitud modificada
  RequestStream.Size := 0; // Limpiar el flujo
  RequestStream.WriteString(ModifiedRequest);
  RequestStream.Position := 0;
  // Reemplazar el flujo original con el modificado
  SOAPRequest.Size := 0;
  SOAPRequest.CopyFrom(RequestStream, RequestStream.Size);
  SOAPRequest.Position := 0;
  RequestStream.Free;
  XMLFactura.Free;


Esto hace la llamada SOAP con el fichero que hemos creado y debe de funcionar. Todo esto lo he hecho en pruebas sueltas y me falta implementarlo en mi programa pero creo que funciona, lo digo por si alguien quiere ir trabajando en ello.


Saludos.

razorxxx 03-01-2025 14:20:11

Hola a todos.

Cada vez que ejecuto en una consola el AutoFirmaCommandLine.exe me devuelve un warning:

es.gob.afirma.standalone.HDPIManager executeWmicCommand
ADVERTENCIA: Error en la ejecucion del comando [Ljava.lang.String;@380fb434: java.io.IOException: Cannot run program "wmic": CreateProcess error=2, El sistema no puede encontrar el archivo especificado.

Tengo instalado Java y AutoFirma en sus últimas versiones.

¿A alguien más le pasa?

razorxxx 03-01-2025 14:59:04

Cita:

Empezado por razorxxx (Mensaje 561038)
Hola a todos.

Cada vez que ejecuto en una consola el AutoFirmaCommandLine.exe me devuelve un warning:

es.gob.afirma.standalone.HDPIManager executeWmicCommand
ADVERTENCIA: Error en la ejecucion del comando [Ljava.lang.String;@380fb434: java.io.IOException: Cannot run program "wmic": CreateProcess error=2, El sistema no puede encontrar el archivo especificado.

Tengo instalado Java y AutoFirma en sus últimas versiones.

¿A alguien más le pasa?

Me respondo a mí mismo. En Windows 11 hay que instalar WMIC (Windows Management Instrumentation Command-line). Hay que ir a Configuración, en el cuadro de búsqueda escribimos "Características opcionales", luego "Ver características" y en el buscador escribimos WMIC. Lo seleccionamos, le damos a instalar y esperamos a que termine (tarda un rato).

razorxxx 03-01-2025 16:02:31

Por cierto, ¿alguien ha conseguido firmar con AutoFirmaCommandline.exe y colocar el nodo <Signature> al final del documento?


La franja horaria es GMT +2. Ahora son las 23:15:22.

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