<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="signbatch"> <xs:complexType> <xs:sequence> <xs:element name="singlesign" maxOccurs="unbounded" minOccurs="1"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="datasource"/> <xs:element name="format"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="XAdES"/> <xs:enumeration value="CAdES"/> <xs:enumeration value="PAdES"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="suboperation"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="sign"/> <xs:enumeration value="cosign"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="extraparams"> <xs:simpleType> <xs:restriction base="xs:base64Binary" /> </xs:simpleType> </xs:element> <xs:element name="signsaver"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="class"/> <xs:element name="config"> <xs:simpleType> <xs:restriction base="xs:base64Binary" /> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute type="xs:string" name="Id" use="required"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute type="xs:integer" name="concurrenttimeout" use="optional"/> <xs:attribute name="stoponerror" use="optional"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> <xs:attribute name="algorithm" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="SHA1withRSA"/> <xs:enumeration value="SHA256withRSA"/> <xs:enumeration value="SHA384withRSA"/> <xs:enumeration value="SHA512withRSA"/> </xs:restriction> </xs:simpleType> <xs:attribute> </xs:complexType> </xs:element> </xs:schema>Un ejemplo de definición XML de lote de firmas podría ser este (ejemplo con dos firmas en el lote):
<?xml version="1.0" encoding="UTF-8" ?> <signbatch stoponerror="true" algorithm="SHA512withRSA" concurrenttimeout="9223372036854775807"> <singlesign Id="f8526f7b-d30a-4720-9e35-fe3494217944"> <datasource>http://google.com</datasource> <format>XAdES</format> <suboperation>sign</suboperation> <extraparams>Iw0KI1RodSBBdW[...]QNCg==</extraparams> <signsaver> <class>es.gob.afirma.signers.batch.SignSaverFile</class> <config>Iw0KI1RodSBBdWcgMT[...]wNCg==</config> </signsaver> </singlesign> <singlesign Id="0e9cc5de-63ee-45ee-ae02-4a6591ab9a46"> <datasource>SG9sYSBNdW5kbw==</datasource> <format>CAdES</format> <suboperation>sign</suboperation> <extraparams>Iw0KI1RodSBBdWc[...]NCg==</extraparams> <signsaver> <class>es.gob.afirma.signers.batch.SignSaverFile</class> <config>Iw0KI1RodSBBdWcgMTM[...]Cg==</config> </signsaver> </singlesign> </signbatch>En este se distinguen los siguientes elementos:
Cabecera de definición de lote
En el ejemplo, es la línea <signbatch stoponerror="false">
,
que contiene dos atributos configurables por el integrador:
stoponerror
Cuando se establece a false
se indica que el proceso debe continuar incluso
si alguna de las firmas del lote no puede completarse, y cuando se establece a true
el proceso se para en el momento en el que se produce el primer error.
algorithm
Algoritmo de firma a usar en todo el lote.
Se admiten los siguientes algoritmos:
SHA1withRSA
(no se recomienda por obsoleto)SHA256withRSA
SHA384withRSA
SHA512withRSA
Definición de cada firma dentro del lote
Dentro del elemento de definición de lote debemos incluir uno o varios elementos de tipo
singlesign
, que es obligatorio cuenten en origen con un identificados único
(en el ejemplo se observa la primera cabecera de definición de firma
<singlesign id="7725374e-728d-4a33-9db9-3a4efea4cead">
, que indica que es una
firma dentro del lote identificada por la cadena 7725374e-728d-4a33-9db9-3a4efea4cead
.
Configuración de cada firma dentro del lote
Cada una de las firmas dentro del lote puede ser configurada individualmente con los siguientes parámetros:
El origen de los datos debe indicarse dentro del elemento datasource
del XML, por ejemplo:
<datasource>http://google.com</datasource>
El formato de firma a utilizar debe indicarse dentro del elemento format
del XML, por ejemplo
<format>XAdES</format>
.
XAdES
CAdES
PAdES
(válido únicamente para documentos PDF)
La operación concreta de firma a realizar debe indicarse dentro del elemento suboperation
del XML, por ejemplo <suboperation>sign</suboperation>
.
sign
(firma)cosign
(cofirma)
Los parámetros adicionales para el formato y la operación concreta de firma (tal y como se describe
en la documentación del MiniApplet) deben indicarse dentro del elemento extraparams
del XML,
por ejemplo <extraparams>bW9kZT1pbXBsaWNpdA0Kc2lnbmF0dXJlUHJvZHVjdGlvbkNpdHk9TWFkcmlk</extraparams>
.
Estos parámetros adicionales deben indicarse codificando su representación textual como Base64.
Así, las siguientes propiedades (indicando cada parámetro en una línea de texto con el formato
nombre_parĂ¡metro=valor):
mode=implicit
signatureProductionCity=Madrid
bW9kZT1pbXBsaWNpdA0Kc2lnbmF0dXJlUHJvZHVjdGlvbkNpdHk9TWFkcmlk
El guardado de la firma una vez esta se finaliza es una tarea que realiza igualmente el servidor, utilizando
para ello clases especiales de guardado que el integrador debe codificar según sus necesidades.
Estas clases deben implementar el interfaz SignSaver
.
La forma de indicar qué clase de guardado a usar y con qué configuración es mediante el
nodo signsaver
code>, que contiene a su vez dos nodos:
class
, con el nombre cualificado de la clase a usar.config
, con las propiedades de configuración codificadas en Base64.Así, en el ejemplo tenemos el siguiente nodo:
<signsaver> <class>es.gob.afirma.signers.batch.SignSaverFile</class> <config> Iw0KI1RodSBBdWcgMjAgMTI6MTM6NDEgQ0VTVCAyMDE1DQpGaWxlTmFtZT1DXDpcXFVzZXJzXFx0b21hc1xcQXBwRGF0YVxcTG9jYWxcXFRlbXBcXEZJUk1BMi54bWwNCg== </config> </signsaver>
Este indica que debe usarse la clase de guardado es.gob.afirma.signers.batch.SignSaverFile
con la configuración Iw0KI1RodSBBdWcgMjAgMTI6MTM6NDEgQ0VTVCAyMDE1DQpGaWxlTmFtZT1DXDpcXFVzZXJzXFx0b21hc1xcQXBwRGF0YVxcTG9jYWxcXFRlbXBcXEZJUk1BMi54bWwNCg==
,
que si la descodificamos vemos que contiene:
FileName=C\:\\Users\\tomas\\AppData\\Local\\Temp\\FIRMA2.xml
Que es la configuración que necesita para guardar la firma (esta clase simplemente guarda la firma en el fichero que se le indique en la configuración).