Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Firmar con AutoFirma y fichero PFX (https://www.clubdelphi.com/foros/showthread.php?t=97123)

PukinG 12-12-2024 14:58:28

Firmar con AutoFirma y fichero PFX
 
1º. OBTENER ALIAS FICHERO PFX
Código:

AutoFirmaCommandLine listaliases -store pkcs12:"C:\...\certificado.pfx" -password "mipassword" -xml > "C:\...\respuesta_alias.xml"
RESULTADO OK
Código PHP:

<afirma><result>ok</result><response><alias>{????????-????-????-????-????????????}</alias></response></afirma

RESULTADO FALSE
Código:

<afirma><result>false</result><response><msg>La contrasena del almacen PKCS#12 / PFX no es valida</msg></response></afirma>

2º. FIRMAR XML
Código:

AutoFirmaCommandLine sign -i "C:\..\fichero_a_firmar.xml" -o "C:\...\fichero_firmado.xml" -format "xades" -config "format=XAdES Enveloped\nxadesNamespace=.../2000/09/xmldsig#"
 -store pkcs12:"C:\...\certificado.pfx" -password "mipassword" -alias "{????????-????-????-????-????????????}" -xml > "C:\...\respuesta_firma.xml"

NOTA: En el xadesNamespace hay que poner el que especifica el documento de la Orden Ministerial (no me deja enviar el mensaje si lo pongo, pues parece un enlace)

RESULTADO OK
Código PHP:

<afirma><result>true</result><response><msg>La operacion ha terminado correctamente </msg></response></afirma

RESULTADO FALSE
Código PHP:

<afirma><result>false</result><response><msg>La contrasena del almacen PKCS#12 / PFX no es valida</msg></response></afirma> 


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

Cita:

Empezado por PukinG (Mensaje 560699)
NOTA: En el xadesNamespace hay que poner el que especifica el documento de la Orden Ministerial (no me deja enviar el mensaje si lo pongo, pues parece un enlace)

Gracias.
En estos casos para evitar la restricción (es cuando lleváis pocos mensajes por temas de seguridad y antispam) se puede modificar el uinicio de la url poniendo h_t_t_p://... (con eso no la identifica como url y os dejaponerla...)

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

Actualizao el mensaje número #2 con la recopialación de códigos.

PukinG 14-12-2024 15:37:38

He descubierto que no hay que definir el Namespace. El comando quedaría así:

Cita:

AutoFirmaCommandLine sign -i "C:\..\fichero_a_firmar.xml" -o "C:\...\fichero_firmado.xml" -format "xades" -config "format=XAdES Enveloped" -store pkcs12:"C:\...\certificado.pfx" -password "mipassword" -alias "{????????-????-????-????-????????????}" -xml > "C:\...\respuesta_firma.xml"

ermendalenda 17-12-2024 17:48:08

Cita:

Empezado por PukinG (Mensaje 560747)
He descubierto que no hay que definir el Namespace. El comando quedaría así:

No ll he mirado, pero no tiene \npolicyIdentifier=...?
Es raro que no hayan metido políticas de firma.

ermendalenda 17-12-2024 18:12:14

Lo el alias lo puedes simplificar, hay un parámetro más fácil y menos dado a errores.
Te lo miro mañana.

ermendalenda 17-12-2024 21:40:01

Hola, prueba algo así, en vez de alias es mejor esto subject.contains:XXXXXXXX donde XXXXXXXXX es el cif,nif,o nie del certificado, y así no va a fallar.
Pero no sé si falta o sobra algo. De momento no voy a trabajar en las firmas. Pero creo que te faltan las politicas de firma tambien:

Código:

AutoFirmaCommandLine.exe sign -i c:\...\Fichero_vfactu_3_2-1-110.xml -o c:\...\Fichero_vfactu_3_2-1-110.xml.sign -format facturae -store pkcs12:"C:\...\fichero.pt2 o fichero.pfx" -password pepito -filter subject.contains:A29XXXXX -format xades -xml -config "format=XAdES Enveloped \npolicyIdentifier=urn:oid:2.16.724.1.3.1.1.2.1.9 \npolicyIdentifierHash=Dkx2R3nMv8kWo7iSAh+/1SQ70hfseOEaQbpJnURk+pg= \npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 \npolicyQualifier=https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf"
Si te funciona mandalo a verifactu el firmado a ver si es aceptado y despues al correo verifactu para que te lo corroboren, aunque es dificl que funcione a la primera, no tengo ahora el autofirma instalado y no he visto resultados.

PukinG 19-12-2024 20:29:40

Sí, he mandado varios XML firmados así a VeriFactu y los ha tomado sin problemas.

ermendalenda 19-12-2024 21:11:39

Con los parámetros que te he puesto?

PukinG 20-12-2024 10:52:03

No. Lo he probado con los parámetros de mi primer mensaje.

razorxxx 07-01-2025 16:14:28

Cita:

Empezado por ermendalenda (Mensaje 560803)
Hola, prueba algo así, en vez de alias es mejor esto subject.contains:XXXXXXXX donde XXXXXXXXX es el cif,nif,o nie del certificado, y así no va a fallar.
Pero no sé si falta o sobra algo. De momento no voy a trabajar en las firmas. Pero creo que te faltan las politicas de firma tambien:

Código:

AutoFirmaCommandLine.exe sign -i c:\...\Fichero_vfactu_3_2-1-110.xml -o c:\...\Fichero_vfactu_3_2-1-110.xml.sign -format facturae -store pkcs12:"C:\...\fichero.pt2 o fichero.pfx" -password pepito -filter subject.contains:A29XXXXX -format xades -xml -config "format=XAdES Enveloped \npolicyIdentifier=urn:oid:2.16.724.1.3.1.1.2.1.9 \npolicyIdentifierHash=Dkx2R3nMv8kWo7iSAh+/1SQ70hfseOEaQbpJnURk+pg= \npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 \npolicyQualifier=https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf"
Si te funciona mandalo a verifactu el firmado a ver si es aceptado y despues al correo verifactu para que te lo corroboren, aunque es dificl que funcione a la primera, no tengo ahora el autofirma instalado y no he visto resultados.

Hola. Usando tu código sugerido, y comparando la salida con el archivo firmado de ejemplo proporcionado por la AEAT, veo que se añade un nodo extra dentro de <xades:SignedProperties> llamado <xades:SignedDataObjectProperties> con el siguiente contenido:
Código:

        <xades:SignedDataObjectProperties>
                <xades:DataObjectFormat ObjectReference="#Reference-f90e12c9-a8c8-4705-ac51-4ada280e7e32">
                        <xades:Description/>
                        <xades:ObjectIdentifier>
                                <xades:Identifier Qualifier="OIDAsURN">urn:oid:1.2.840.10003.5.109.10</xades:Identifier>
                                <xades:Description/>
                        </xades:ObjectIdentifier>
                        <xades:MimeType>text/xml</xades:MimeType>
                        <xades:Encoding/>
                </xades:DataObjectFormat>
        </xades:SignedDataObjectProperties>

Además, donde dice:
Código:

<xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
debería poner
Código:

<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
.

También dentro del nodo <ds:SignedInfo> debería hacer mención a sha256, pero está poniendo sha512 en todas.

Dentro de <ds:Reference><ds:Transforms> se añade:
Código:

        <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
              <ds:XPath xmlns:ds="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::ds:Signature)</ds:XPath>
        </ds:Transform>

Uso AutoFirma 1.8.3 para Windows. Todavía no he llegado a la parte de enviar. ¿Alguien puede corroborar si este fichero resultante sería igualmente válido y el WebService se lo traga?

razorxxx 08-01-2025 15:35:13

Cita:

Empezado por razorxxx (Mensaje 561072)
Hola. Usando tu código sugerido, y comparando la salida con el archivo firmado de ejemplo proporcionado por la AEAT, veo que se añade un nodo extra dentro de <xades:SignedProperties> llamado <xades:SignedDataObjectProperties> con el siguiente contenido:
Código:

        <xades:SignedDataObjectProperties>
                <xades:DataObjectFormat ObjectReference="#Reference-f90e12c9-a8c8-4705-ac51-4ada280e7e32">
                        <xades:Description/>
                        <xades:ObjectIdentifier>
                                <xades:Identifier Qualifier="OIDAsURN">urn:oid:1.2.840.10003.5.109.10</xades:Identifier>
                                <xades:Description/>
                        </xades:ObjectIdentifier>
                        <xades:MimeType>text/xml</xades:MimeType>
                        <xades:Encoding/>
                </xades:DataObjectFormat>
        </xades:SignedDataObjectProperties>

Además, donde dice:
Código:

<xades:SigningCertificate><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
debería poner
Código:

<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
.

También dentro del nodo <ds:SignedInfo> debería hacer mención a sha256, pero está poniendo sha512 en todas.

Dentro de <ds:Reference><ds:Transforms> se añade:
Código:

        <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
              <ds:XPath xmlns:ds="http://www.w3.org/2000/09/xmldsig#">not(ancestor-or-self::ds:Signature)</ds:XPath>
        </ds:Transform>

Uso AutoFirma 1.8.3 para Windows. Todavía no he llegado a la parte de enviar. ¿Alguien puede corroborar si este fichero resultante sería igualmente válido y el WebService se lo traga?

Si valido el fichero firmado en la web valide.redsara.es el achivo XML, me da el siguiente error: El hash de la política incluido en la firma no coincide con el hash real de la política de firma.
¿Alguien sabe de dónde se saca el parámetro de configuración policyIdentifierHash?

delphiGar 09-01-2025 10:39:26

Para la politica de firmas debes tener esto en el signature:

Código:

<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#Signature-356076609">
<xades:SignedProperties Id="SignedProperties-896717916">
<xades:SignedSignatureProperties>
<xades:SigningTime>2025-01-09T09:06:03.661Z</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>GonBTW0Kj+S7ul49CizLsozDclU28uKhzNqqIGHkuRs=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=AC Representación, OU=CERES, O=FNMT-RCM, C=ES</ds:X509IssuerName>
<ds:X509SerialNumber>60125478927655539147584317276501208423</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
<xades:SignaturePolicyIdentifier>
<xades:SignaturePolicyId>
<xades:SigPolicyId>
<xades:Identifier>urn:oid:2.16.724.1.3.1.1.2.1.9</xades:Identifier>
</xades:SigPolicyId>
<xades:SigPolicyHash>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>G7roucf600+f03r/o0bAOQ6WAs0=</ds:DigestValue>
</xades:SigPolicyHash>
<xades:SigPolicyQualifiers>
<xades:SigPolicyQualifier>
<xades:SPURI>https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf</xades:SPURI>
</xades:SigPolicyQualifier>
</xades:SigPolicyQualifiers>
</xades:SignaturePolicyId>
</xades:SignaturePolicyIdentifier>
</xades:SignedSignatureProperties>
<xades:SignedDataObjectProperties>
<xades:DataObjectFormat ObjectReference="#xmldsig-5cf63553-8a48-4ceb-83f8-861d341a4d67-ref0">
<xades:ObjectIdentifier>
<xades:Identifier>urn:oid:1.2.840.10003.5.109.10</xades:Identifier>
</xades:ObjectIdentifier>
<xades:MimeType>text/xml</xades:MimeType>
<xades:Encoding>UTF8</xades:Encoding>
</xades:DataObjectFormat>
</xades:SignedDataObjectProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>


razorxxx 14-01-2025 12:06:15

Cita:

Empezado por delphiGar (Mensaje 561102)
Para la politica de firmas debes tener esto en el signature:

Código:

<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#Signature-356076609">
<xades:SignedProperties Id="SignedProperties-896717916">
<xades:SignedSignatureProperties>
<xades:SigningTime>2025-01-09T09:06:03.661Z</xades:SigningTime>
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>GonBTW0Kj+S7ul49CizLsozDclU28uKhzNqqIGHkuRs=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>CN=AC Representación, OU=CERES, O=FNMT-RCM, C=ES</ds:X509IssuerName>
<ds:X509SerialNumber>60125478927655539147584317276501208423</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
<xades:SignaturePolicyIdentifier>
<xades:SignaturePolicyId>
<xades:SigPolicyId>
<xades:Identifier>urn:oid:2.16.724.1.3.1.1.2.1.9</xades:Identifier>
</xades:SigPolicyId>
<xades:SigPolicyHash>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>G7roucf600+f03r/o0bAOQ6WAs0=</ds:DigestValue>
</xades:SigPolicyHash>
<xades:SigPolicyQualifiers>
<xades:SigPolicyQualifier>
<xades:SPURI>https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf</xades:SPURI>
</xades:SigPolicyQualifier>
</xades:SigPolicyQualifiers>
</xades:SignaturePolicyId>
</xades:SignaturePolicyIdentifier>
</xades:SignedSignatureProperties>
<xades:SignedDataObjectProperties>
<xades:DataObjectFormat ObjectReference="#xmldsig-5cf63553-8a48-4ceb-83f8-861d341a4d67-ref0">
<xades:ObjectIdentifier>
<xades:Identifier>urn:oid:1.2.840.10003.5.109.10</xades:Identifier>
</xades:ObjectIdentifier>
<xades:MimeType>text/xml</xades:MimeType>
<xades:Encoding>UTF8</xades:Encoding>
</xades:DataObjectFormat>
</xades:SignedDataObjectProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>


El algoritmo http://www.w3.org/2000/09/xmldsig#sha1 que sugieres no está soportado por las especificaciones de la firma que exige el reglamento, debe ser http://www.w3.org/2001/04/xmlenc#sha256.

El caso es que mandándole a mano al AutoFirma el DigestValue que aparece en el fichero de ejemplo firmado de la AEAT, me firma el archivo correctamente pero al validarlo en valide.redsara.es me devuelve el siguiente error: "El hash de la política incluido en la firma no coincide con el hash real de la política de firma".

La llamada que realizo es: AutoFirmaCommandLine.exe sign -i "ejemplo.xml" -o "ejemplo_signed.xml" -format xades -config "format=XAdES Enveloped \nincludeOnlySignningCertificate=true \npolicyIdentifier=urn:oid:2.16.724.1.3.1.1.2.1.9 \npolicyIdentifierHash=Dkx2R3nMv8kWo7iSAh+/1SQ70hfseOEaQbpJnURk+pg= \npolicyIdentifierHashAlgorithm=http://www.w3.org/2001/04/xmlenc#sha256 \npolicyQualifier=https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf" -store pkcs12:"cert.pfx" -password XXXX -filter subject.contains:89890001K

Está todo bien salvo el tema del hash de la política de firma. Otra cosa que intenté fue calcularlo desde archivo PDF: THashSHA2.GetHashStringFromFile('politica_de_firma_anexo_1.pdf'). Pero el error devuelto es el mismo.

¿Alguna idea de cómo solucionarlo?

delphiGar 14-01-2025 13:00:43

1 Archivos Adjunto(s)
El hash que te he puesto es el correcto, el otro que pones no es correcto es sha1 y no sha256, ademas con el digestvalue que te indica.

Mira las especificaciones de firma y lo veras.

Código:

https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Espec-Tecnicas/EspecTecGenerFirmaElectRfact_BORRADOR.pdf
Te dejo un archivo valido firmado, lo puedes comprobar en la red.sara

razorxxx 14-01-2025 17:20:05

Cita:

Empezado por delphiGar (Mensaje 561166)
El hash que te he puesto es el correcto, el otro que pones no es correcto es sha1 y no sha256, ademas con el digestvalue que te indica.

Mira las especificaciones de firma y lo veras.

Código:

https://www.agenciatributaria.es/static_files/AEAT_Desarrolladores/EEDD/IVA/VERI-FACTU/Espec-Tecnicas/EspecTecGenerFirmaElectRfact_BORRADOR.pdf
Te dejo un archivo valido firmado, lo puedes comprobar en la red.sara

Me temo que es al revés compañero. En el archivo ejemplo que mandas estás especificando que el algoritmo a usar para la política de firma es SHA1, y no SHA-256: <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>. Y el DigestValue es G7roucf600+f03r/o0bAOQ6WAs0=, que viene a ser el hash SHA-1 de la política de firma.

Si uso tu propuesta sí me funciona. Pero ¿qué pasa si quiero aplicar el sha-256 como aparece en el ejemplo de archivo firmado proporcionado por la AEAT? ¿Cómo se calcula el sha-256 de la política de firma? Porque si uso el proporcionado en el fichero de ejemplo de la AEAT, al validarlo en valide.redsara.es me da el error de "El hash de la política incluido en la firma no coincide con el hash real de la política de firma".

delphiGar 14-01-2025 17:25:39

Cita:

Empezado por razorxxx (Mensaje 561174)
Me temo que es al revés compañero. En el archivo ejemplo que mandas estás especificando que el algoritmo a usar para la política de firma es SHA1, y no SHA-256: <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>. Y el DigestValue es G7roucf600+f03r/o0bAOQ6WAs0=, que viene a ser el hash SHA-1 de la política de firma.

Si uso tu propuesta sí me funciona. Pero ¿qué pasa si quiero aplicar el sha-256 como aparece en el ejemplo de archivo firmado proporcionado por la AEAT? ¿Cómo se calcula el sha-256 de la política de firma? Porque si uso el proporcionado en el fichero de ejemplo de la AEAT, al validarlo en valide.redsara.es me da el error de "El hash de la política incluido en la firma no coincide con el hash real de la política de firma".

Compañero, fijate bien que en el ejemplo viene lo que te digo, y no es al reves como tu dices, es sha1

delphiGar 14-01-2025 17:27:28

El ejemplo me refiero al de la Aeat no al mio, veras que es sha1

delphiGar 14-01-2025 17:36:49

Para hacerlo con SHA256 debes saber el DisgestValue correspondiente, el que pones de 256 no es valido, ya lo comprobe anteriormente cuando salio el documento, pero despues lo cambiaron a SHA1

delphiGar 14-01-2025 18:44:13

Aunque yo no utilizo Autofirma para firmar los ficheros.

El codigo correcto para autofrima seria este:

Código:

AutoFirmaCommandLine.exe sign -i "c:\envio_firmado.xml" -o "c:\envio_firmado_a.xsig" -format xades -config "format=XAdES Enveloped \nincludeOnlySignningCertificate=true \npolicyIdentifier=urn:oid:2.16.724.1.3.1.1.2.1.9 \npolicyIdentifierHash=G7roucf600+f03r/o0bAOQ6WAs0= \npolicyIdentifierHashAlgorithm=http://www.w3.org/2000/09/xmldsig#sha1 \npolicyQualifier=https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf" -store auto -certgui


La franja horaria es GMT +2. Ahora son las 17:54:08.

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