5.- Servicios SIFE

ÍNDICE DE SERVICIOS

Inicialización del cliente

Para poder consumir los métodos que se indican a continuación es necesario disponer de Usuario en SIFE e inicializar el cliente de SIFE con dicho usuario y la contraseña correspondiente. A continuación se muestra un ejemplo de inicialización del cliente.

Ejemplo de invocación firma CAdES básica
DigitalSignatureServiceClient digitalSignatureServiceClient = new DigitalSignatureServiceClient("http://preaplicaciones.aragon.es/sife/services", USER, PASSWORD);

Servicios DigitalSignatureServiceJaxRsV2

Gestión de firma electrónica

Conjunto de métodos que permiten realizar operaciones de firma electrónica, firmar, elevar una firma, validar certificado, validar una firma, generar un timestamp, etc. Se trata de un servicio REST que se encuentra disponible en v2/dss/.

Actualmente se sigue dando soporte la la versión v1/dss del servicio DigitalSignatureServiceJaxRS pero pasa a estar deprecated y será eliminado en un futuro

Método 'sign'

Método que realiza la firma electrónica en servidor utilizando un certificado almacenado previamente en el keystore centralizado.Se puede indicar los parámetros de firma (digestAlgorithm, signatureLevel. signaturePackaging, etc) o bien utilizar un perfilde firma predefinido usando signatureProfile.

 Más detalles

Signatura

SifeDocument sign(SignatureParameters params)

Parámetros de invocación

NombreTipoDescripción
paramsObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
signedDocumentObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
NO_SIGNATUREPROFILE_ERRORNo existe el perfil seleccionado para realizar la firma
NO_SIGNATURELEVEL_ERROREl valor de signatureLevel de params es nulo
BAD_SIGNATURE_PACKAGING_ERROREl método de packaging elegido no es compatible con el tipo de firma elegido
NOT_FOUND_ERRORError al obtener datos de CCSV
REQUIRED_DATA_ERRORDatos requeridos para la realización de la firma son nulos
REQUIRED_HASH_ERRORFaltan datos para la realización de una firma a partir de HASH
BAD_CERTIFICATE_ERROREl existe un certificado con el alias establecido en el keystore
REQUIRED_SIGN_ERROREl documento no tiene firma asociada en CCSV
STAMP_NOT_AUTHORIZEDEl sello utilizado para la firma no ha sido autorizado previamente

Pueden obtenerse otros códigos de error diferentes a los comentados en la tabla anterior se produce algún error durante el proceso de firma en la plataforma @firma, estos errores no poseen un código propio de SIFE sino que se devuelve el código devuelvo por la plataforma directamente.

Ejemplos de invocación

En función de los valores que poseen los parámetros de entrada, se pueden realizar varias operaciones de firma, firma CAdES básica, firma con sello de tiempo, firma con CSV, firma con Hash, entre otros. A continuación se muestran algunos ejemplos de invocaciones para realizar estas firmas.

Ejemplo de invocación firma CAdES básica
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
SifeDocument sifeDocument = new SifeDocument();
sifeDocument.setData(originalDocument);

SignatureParameters signatureParameters = new SignatureParameters();
signatureParameters.setSignatureLevel(SignatureLevel.CAdES_BASELINE_B);
signatureParameters.setSignaturePackaging(SignaturePackaging.DETACHED);
signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA512);
signatureParameters.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);

SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);
Ejemplo de invocación firma XAdES Manifest utilizando documento completo.
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
SifeDocument sifeDocument = new SifeDocument();
sifeDocument.setData(originalDocument);

signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA1);
signatureParameters.setSignatureLevel(SignatureLevel.XAdES_BASELINE_B);
signatureParameters.setSignaturePackaging(SignaturePackaging.DETACHED);
signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA512);
signatureParameters.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);

SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);

En el caso de que se quiera realizar la firma a partir del Hash del documento, hay que tener en cuenta que el algoritmo utilizado para la generación del Hash tiene que ser el indicado como DigestAlgorithm.

Ejemplo de invocación firma usando Hash
//Generacion del hash del documento
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
MessageDigest.getInstance("SHA-256");
Byte[]originalDocumentHash = md.digest(originalDocument);

//Se rellenan los datos del documento
SifeDocument sifeDocument = new SifeDocument();
sifeDocument.setDigestAlgorithm(DigestAlgorithm.SHA256);
sifeDocument.setDigestValue(originalDocumentHash);

SignatureParameters signatureParameters = new SignatureParameters();
signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA256);
signatureParameters.setSignatureLevel(SignatureLevel.CAdES_A);
signatureParameters.setSignaturePackaging(SignaturePackaging.DETACHED);
signatureParameters.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);

SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);
Ejemplo de invocación de firma XAdES nivel XAdES_A mediante hash SHA-512
//Generacion del hash del documento
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
MessageDigest.getInstance("SHA-512");
Byte[]originalDocumentHash = md.digest(originalDocument);

//Se rellenan los datos del documento
SifeDocument sifeDocument = new SifeDocument();
sifeDocument.setDigestAlgorithm(DigestAlgorithm.SHA512);
sifeDocument.setDigestValue(originalDocumentHash);

SignatureParameters signatureParameters = new SignatureParameters();
signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA512);
signatureParameters.setSignatureLevel(SignatureLevel.XAdES_A);
signatureParameters.setSignaturePackaging(SignaturePackaging.DETACHED);
signatureParameters.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);

SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);

En el caso de indicar un CSV para la realización de la firma, se realizará una búsqueda del documento en CCSV a partir de dicho dato. Serán ignorados los datos añadidos a partir de sifeDocument.setData(originalDocument) y sifeDocument.setDigestValue(originalDocumentHash). En el caso de que no se encuentre un documento con dicho CSV en CCSV, se devolverá un error.

Importante: En ningún caso el documento será actualizado en CCSV, será tarea del integrador realizar esta actualización si fuera necesario.

Ejemplo de invocación firma usando CSV
SifeDocument sifeDocument = new SifeDocument();
sifeDocument.setCsv(CSV);

SignatureParameters signatureParameters = new SignatureParameters();
signatureParameters.setDigestAlgorithm(DigestAlgorithm.SHA256);
signatureParameters.setSignatureLevel(SignatureLevel.CAdES_A);
signatureParameters.setSignaturePackaging(SignaturePackaging.DETACHED);
signatureParameters.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);

SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);

Método 'extendSignature

Método que eleva la firma que se le pasa como parámetro a un nivel superior, por ejemplo de CAdES-B a CAdES-T, CAdES-A o CAdES-LTA.

Se debe enviar la firma a elevar, el nivel deseado, y en caso de firmas detached el documento original. También permite resellar un documento cuando la firma sea ya de nivel A.

Como ocurre en el caso de la firma, en el caso de que se trate de una firma detached, se puede realizar su elevación a partir del documento original completo, a través del Hash del documetno o con su CSV. En el caso de que realice a través del CSV el contenido del documento almacenado en sifeDocument.setData(originalDocument) y sifeDocument.setDigestValue(originalDocumentHash) será ignorado. 

El método 'extendSignature' no modificado los datos almacenados en CCSV en ningún momento, únicamente realizará la elevación y devolverá el resultado.

 Más detalles

Signatura

SifeDocument extendSignature (ExtensionParameters params)

Parámetros de invocación

NombreTipoDescripción
paramsObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
signedDocumentSifeDocument

Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
REQUIRED_SIGN_ERROREl documento no tiene firma asociada en CCSV
NOT_FOUND_ERRORError al obtener datos de CCSV
REQUIRED_DATA_ERRORDatos requeridos para la realización de la firma son nulos
REQUIRED_HASH_ERRORFaltan datos para la realización de una firma a partir de HASH
BAD_CERTIFICATE_ERROREl existe un certificado con el alias establecido en el keystore

Ejemplos de invocación

Es posible la elevación de la firma a partir del contenido del documento, o a partir de su Hash si se trata de una firma detached. 

Ejemplo de invocación elevación CAdES-A documento completo
SifeDocument extendedSignature = null;

// Se establece la firma
byte[] signature= Base64.decode(FileUtils.readFileToString(new File("pathFile"));
SifeDocument sign = new SifeDocument();
sign.setData(signature);

// Se añade el contenido del documento porque se trata de una firma detached
byte[] extendedDocument = FileUtils.readFileToByteArray(new File("pathFile"));
SifeDocument detachedContent = new SifeDocument();
detachedContent.setData(document);

// Especificamos tanto el documento original como la firma y el nivel de elevacion de la firma
ExtensionParameters extensionParameters = new ExtensionParameters();
extensionParameters.setDetachedContent(detachedContent);
extensionParameters.setSignature(sign);
extensionParameters.setSignatureLevel(SignatureLevel.CAdES_A);

extendedSignature = digitalSignatureServiceClient.extendSignature(extensionParameters);


Para realizar la elevación a partir del Hash del documento
Ejemplo de invocación elevación CAdES-A con Hash
//Generacion del hash del documento
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
MessageDigest.getInstance("SHA-1");
Byte[]originalDocumentHash = md.digest(originalDocument);

// Se establece la firma
byte[] signature= Base64.decode(FileUtils.readFileToString(new File("pathFile"));
SifeDocument sign = new SifeDocument();
sign.setData(signature);

// Se añade el contenido del documento porque se trata de una firma detached
byte[] extendedDocument = FileUtils.readFileToByteArray(new File("pathFile"));
SifeDocument detachedContent = new SifeDocument();
sign.setDigestAlgorithm(DigestAlgorithm.SHA1);
sign.setDigestValue(originalDocumentHash);

// Especificamos tanto el documento original como la firma y el nivel de elevacion de la firma
ExtensionParameters extensionParameters = new ExtensionParameters();
extensionParameters.setDetachedContent(detachedContent);
extensionParameters.setSignature(sign);
extensionParameters.setSignatureLevel(SignatureLevel.CAdES_A);

SifeDocument  extendedSignature = digitalSignatureServiceClient.extendSignature(extensionParameters);

Método 'verifyCertificate'

Método que verifica un certificado. La respuesta obtenida indica el si el certificado es valido (VALID o INVALID), así como todos los datos de este.

 Más detalles

Signatura

CertificateReport verifyCertificate(CertificateParameters params)

Parámetros de invocación

NombreTipoDescripción
paramsObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
certificateReportObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Códigos error

Los códigos de error que se obtienen son producidos directamente por la plataforma @firma, estos errores no poseen un código propio de SIFE sino que se devuelve el código devuelvo por la plataform.

Ejemplos de invocación

Ejemplo de invocación verifyCertificate
byte[] certificate = FileUtils.readFileToByteArray(new File("pathFile");

CertificateParameters certificateParameters = new CertificateParameters();
certificateParameters.setCertificate(certificate);

CertificateReport certificateReport = digitalSignatureServiceClient.verifyCertificate(certificateParameters);

Método 'verifySignature'

Verifica una firma contra @firma. Se debe enviar la firma a verificar y el documento original si la firma es detached. Este método puede invocarse pasando como parámetro el contenido completo del documento, a través de su hash o indicando su CCSV.

Se devolverá un informe de verificación con el resultado, indicando si la firma es válida, o si la firma es inválida o la razón por la cual no se ha verificado correctamente la firma.


 Más detalles

Signatura

VerificationReport verifySignature(VerificationParameters params)

Parámetros de invocación

NombreTipoDescripción
paramsObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
verificationReportObjeto 1034420316 (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
REQUIRED_SIGN_ERRORNo se encuentra la firma en CCSV
NOT_FOUND_ERRORAlgún dato necesario para la validación de la firma no se encuentra en base de datos
REQUIRED_DATA_ERRORDatos del contenido del documento son nulos
REQUIRED_HASH_ERRORFaltan datos para la realización de una firma a partir de HASH

Pueden obtenerse otros códigos de error diferentes a los comentados en la tabla anterior se produce algún error durante el proceso de firma en la plataforma @firma, estos errores no poseen un código propio de SIFE sino que se devuelve el código devuelvo por la plataforma directamente.

Ejemplos de invocación

A continuación se muestra un ejemplo de invocación al método verifySignature de una firma detached y pasando como atributo el contenido completo del documento.

Ejemplo de invocación verifySignature pasando contenido del documento
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));		// Contenido del documento en texto plano
byte[] signature = FileUtils.readFileToByteArray(new File("pathFilePass")); 		// La firma en texto plano

SifeDocument originalSifeDocument = new SifeDocument();
originalSifeDocument.setData(originalDocument);

SifeDocument signatureSifeDocument = new SifeDocument();
signatureSifeDocument.setData(signature);

// Pareseamos de formato de firma ASF a formato de firma SIFE.
VerificationParameters verificationParameters = new VerificationParameters();
verificationParameters.setSignatureFormat(SignatureFormat.CAdES);
verificationParameters.setSignature(signatureSifeDocument);
verificationParameters.setDetachedContent(originalSifeDocument);

VerificationReport result = digitalSignatureServiceClient.verifySignature(verificationParameters);
Ejemplo de invocación verifySignature de firma XAdES Manifest mediante documento copmleto
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));		// Contenido del documento en texto plano
byte[] signature = FileUtils.readFileToByteArray(new File("pathFilePass")); 		// La firma en texto plano

SifeDocument originalSifeDocument = new SifeDocument();
originalSifeDocument.setData(originalDocument);

SifeDocument signatureSifeDocument = new SifeDocument();
signatureSifeDocument.setData(signature);

// Pareseamos de formato de firma ASF a formato de firma SIFE.
VerificationParameters verificationParameters = new VerificationParameters();
verificationParameters.setSignatureFormat(SignatureFormat.XAdES); //Formato de firma XAdES
verificationParameters.setSignature(signatureSifeDocument);
verificationParameters.setDetachedContent(originalSifeDocument);

VerificationReport result = digitalSignatureServiceClient.verifySignature(verificationParameters);

En el caso de que se pase como parámetro el CSV del documento, el contenido de dicho documento se obtendrá de CCSV

Ejemplo de invocación verifySignature a través de CSV
byte[] signature = FileUtils.readFileToByteArray(new File("pathFilePass")); 		// La firma en texto plano

SifeDocument originalSifeDocument = new SifeDocument();
originalSifeDocument.setCsv(CSV);

SifeDocument signatureSifeDocument = new SifeDocument();
signatureSifeDocument.setData(signature);

// Pareseamos de formato de firma ASF a formato de firma SIFE.
VerificationParameters verificationParameters = new VerificationParameters();
verificationParameters.setSignatureFormat(SignatureFormat.CAdES);
verificationParameters.setSignature(signatureSifeDocument);
verificationParameters.setDetachedContent(originalSifeDocument);

VerificationReport result = digitalSignatureServiceClient.verifySignature(verificationParameters);

SifeDocument originalSifeDocument = new SifeDocument();
originalSifeDocument.setData(originalDocument);

La tercera forma de invocar al método verifySignature es a través del Hash del documento. Para ello hay que indicar el algoritmo de digest. A continuación se muestra un ejemplo de invocación utilizando el Hash del documento.

Ejemplo de invocación verifySignature a través de Hash
//Generacion del hash del documento TODO
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
MessageDigest.getInstance("SHA-256");
Byte[]originalDocumentHash = md.digest(originalDocument);

byte[] signature = FileUtils.readFileToByteArray(new File("pathFilePass")); 		// La firma en texto plano

SifeDocument firma = new SifeDocument();
firma.setData(documentSign);

SifeDocument detachedContent = new SifeDocument();
detachedContent.setDigestValue(originalDocumentHash);
detachedContent.setDigestAlgorithm(DigestAlgorithm.SHA256);

// Verificamos la firma con sife
VerificationParameters verificationParameters = new VerificationParameters();
verificationParameters.setSignature(firma);
verificationParameters.setDetachedContent(detachedContent);
verificationParameters.setSignatureFormat(SignatureFormat.CAdES);
		
VerificationReport verificationReport = digitalSignatureServiceClient.verifySignature(verificationParameters);
Ejemplo de invocación verifySignature de XAdES Manifest mediante hash
//Generacion de SifeDocuments para la verificación
byte[] originalDocument = FileUtils.readFileToByteArray(new File("pathFile"));
MessageDigest.getInstance("SHA-1"); // El algoritmo del hash a comparar debe ser el mismo que el usado en la firma
Byte[] originalDocumentHash = md.digest(originalDocument);

byte[] signature = FileUtils.readFileToByteArray(new File("pathFilePass")); // La firma en texto plano

SifeDocument firma = new SifeDocument();
firma.setData(documentSign);

SifeDocument detachedContent = new SifeDocument();
detachedContent.setDigestValue(originalDocumentHash);
detachedContent.setDigestAlgorithm(DigestAlgorithm.SHA1); 

// Verificamos la firma con sife
VerificationParameters verificationParameters = new VerificationParameters();
verificationParameters.setSignature(firma);
verificationParameters.setDetachedContent(detachedContent);
verificationParameters.setSignatureFormat(SignatureFormat.XAdES);
		
VerificationReport verificationReport = digitalSignatureServiceClient.verifySignature(verificationParameters);

Método 'wssSign'

Método que permite diferentes acciones sobre una petición a un servicio web. Las acciones que se pueden realizar son las siguientes, pudiéndose ejecutar de forma individual o combinando varias de ellas. A la hora de ejecutar las acciones especificadas, el orden será en el que están añadidas al vector de acciones a ejecutar. Por tanto no es lo mismo ejecutar  [Firma, Cifrado] que  [Cifrado, Firma]

  • Firma: Indicando un certificado, se calcula firma electrónica de las partes indicadas de la petición web. Permite la identificación del firmante y la integridad de la información.
  • Cifrado: Realiza el cifrado de las partes indicadas de la petición web con el certificado indicado. De esta manera se asegura la procedencia de la petición
  • TimeStamp: Realiza un sellado de tiempo de la petición

 Más detalles

Signatura

SifeDocument wssSign(WSSSignatureParameters params)

Parámetros de invocación

NombreTipoDescripción
params1034420316  Objeto (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
sifeDoc1034420316 Objeto (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
NO_DATA_ERROREl parámetro document del objeto WSSSignatureParameters es nulo o no tiene datos
INTERNAL_SERVER_ERRORError interno en el servidor
NO_SIGNINGCERTIFICATEALIAS_ERRORWSSAction = 'SIGNATURE' y SigningCertificateAlias es nulo 
BAD_CERTIFICATE_ERRORNo exite el certificado con el alias indicado
NO_ENCRYPTIONCERTIFICATEALIAS_ERRORWSSAction = 'SIGNATURE' y EncryptionCertificateAlias es nulo
STAMP_NOT_AUTHORIZEDEl sello utilizado para la firma no ha sido autorizado previamente

Ejemplos de invocación

A continuación se muestra un ejemplo de invocación al método wssSign en el cual se firma el elemento "Body" de la petición.

Ejemplo de invocación verifyTimestamp a través de CSV
		String cadenaFirma = //petición a firmar
		String aliasCert = // certificado utilizado para la firma
		String [] idToSign = new String[1];
		idToSign[0] = "Body";
		
        System.out.println("BEGIN firmaWSSecurity()");
        System.out.println("Param cadenaFirma: " + cadenaFirma);
        System.out.println("Param aliasCert: " + aliasCert);

        SifeDocument documentoOriginal = new SifeDocument();
        documentoOriginal.setData(cadenaFirma.getBytes("UTF-8"));

        WSSSignatureParameters wsSSignatureParameters = new WSSSignatureParameters();
        List<WSSAction> actions = new ArrayList<>();
        actions.add(WSSAction.SIGNATURE);
        actions.add(WSSAction.TIMESTAMP);
        wsSSignatureParameters.setActions(actions);
        wsSSignatureParameters.setSigningCertificateAlias(aliasCert);
        wsSSignatureParameters.setDocument(documentoOriginal);
        wsSSignatureParameters.setUseSingleCertificate(Boolean.TRUE);

        // partes a firmar asumimos. Se firmará el body
        List<WSSEncryptionPart> parts = new ArrayList<>();
        for (String part : idToSign) {
            WSSEncryptionPart wsSEncryptionPart = new WSSEncryptionPart();
            wsSEncryptionPart.setName(part);
            wsSEncryptionPart.setNamespace("http://schemas.xmlsoap.org/soap/envelope/");
            parts.add(wsSEncryptionPart);
        }
        wsSSignatureParameters.setSignatureParts(parts);

        SifeDocument documentSigned = digitalSignatureServiceClient.wssSign(wsSSignatureParameters);

        // Se valida el resultado
        if (documentSigned != null && documentSigned.getData() != null) {
            System.out.println("Documento firmado " + new String(documentSigned.getData()));
            WSSVerificationParameters vparams = new WSSVerificationParameters();
            vparams.setDocument(documentSigned);
            vparams.setSigningCertificateAlias(aliasCert);

            WSSVerificationReport report = digitalSignatureServiceClient.wssVerify(vparams);
            if (report.getIndication() == Indication.VALID && report.getData() != null) {
                System.out.println("Firma válida");
            } else {
                if (report.getErrors() != null) {
                    for (VerificationError ve : report.getErrors()) {
                        System.out.println("Error code: " + ve.getCode() + " ErrorMsg: " + ve.getDescription());
                    }
                }
            }
        } else {
            System.out.println("Algún problema al generar la firma " + aliasCert + " petición : " + cadenaFirma);
        }
        return new String(documentSigned.getData());

Método 'wssVerify'

Método que permite realizar la validación de una petición WebService firmada.

 Más detalles

Signatura

WSSVerificationReport wssVerify(WSSVerificationParametersparams)

Parámetros de invocación

NombreTipoDescripción
paramsWSSVerificationParametersparams  Objeto (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
reportWSSVerificationReport Objeto (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
NO_DATA_ERROREl parámetro document del objeto WSSSignatureParameters es nulo o no tiene datos
INTERNAL_SERVER_ERRORError interno en el servidor
NO_SIGNINGCERTIFICATEALIAS_ERRORWSSAction = 'SIGNATURE' y SigningCertificateAlias es nulo 
BAD_CERTIFICATE_ERRORNo exite el certificado con el alias indicado
NO_ENCRYPTIONCERTIFICATEALIAS_ERRORWSSAction = 'SIGNATURE' y EncryptionCertificateAlias es nulo
STAMP_NOT_AUTHORIZEDEl sello utilizado para la firma no ha sido autorizado previamente

Ejemplos de invocación

A continuación se muestra un ejemplo de invocación al método wssSign en el cual se firma el elemento "Body" de la petición.

Ejemplo de invocación verifyTimestamp a través de CSV
		String cadenaFirma = //petición a firmar
		String aliasCert = // certificado utilizado para la firma
		String [] idToSign = new String[1];
		idToSign[0] = "Body";
		
        System.out.println("BEGIN firmaWSSecurity()");
        System.out.println("Param cadenaFirma: " + cadenaFirma);
        System.out.println("Param aliasCert: " + aliasCert);

        SifeDocument documentoOriginal = new SifeDocument();
        documentoOriginal.setData(cadenaFirma.getBytes("UTF-8"));

        WSSSignatureParameters wsSSignatureParameters = new WSSSignatureParameters();
        List<WSSAction> actions = new ArrayList<>();
        actions.add(WSSAction.SIGNATURE);
        actions.add(WSSAction.TIMESTAMP);
        wsSSignatureParameters.setActions(actions);
        wsSSignatureParameters.setSigningCertificateAlias(aliasCert);
        wsSSignatureParameters.setDocument(documentoOriginal);
        wsSSignatureParameters.setUseSingleCertificate(Boolean.TRUE);

        // partes a firmar asumimos. Se firmará el body
        List<WSSEncryptionPart> parts = new ArrayList<>();
        for (String part : idToSign) {
            WSSEncryptionPart wsSEncryptionPart = new WSSEncryptionPart();
            wsSEncryptionPart.setName(part);
            wsSEncryptionPart.setNamespace("http://schemas.xmlsoap.org/soap/envelope/");
            parts.add(wsSEncryptionPart);
        }
        wsSSignatureParameters.setSignatureParts(parts);

        SifeDocument documentSigned = digitalSignatureServiceClient.wssSign(wsSSignatureParameters);

        // Se valida el resultado
        if (documentSigned != null && documentSigned.getData() != null) {
            System.out.println("Documento firmado " + new String(documentSigned.getData()));
            WSSVerificationParameters vparams = new WSSVerificationParameters();
            vparams.setDocument(documentSigned);
            vparams.setSigningCertificateAlias(aliasCert);

            WSSVerificationReport report = digitalSignatureServiceClient.wssVerify(vparams);
            if (report.getIndication() == Indication.VALID && report.getData() != null) {
                System.out.println("Firma válida");
            } else {
                if (report.getErrors() != null) {
                    for (VerificationError ve : report.getErrors()) {
                        System.out.println("Error code: " + ve.getCode() + " ErrorMsg: " + ve.getDescription());
                    }
                }
            }
        } else {
            System.out.println("Algún problema al generar la firma " + aliasCert + " petición : " + cadenaFirma);
        }
        return new String(documentSigned.getData());

Servicios LoginServiceJaxRs

Identificación SSL

Conjunto de métodos que permiten realizar operaciones identificación mediante un certificado ssl. Se trata de un servicio REST que se encuentra disponible en v1/login/.

Método 'verifyCertificateForAuthentication'

Verifica que el certificado presentado para la identificación es válido. La respuesta proporciona un token con la información general del certificado y su estado.


 Más detalles

Signatura

AuthenticationOperationResult verifyCertificateForAuthentication(AuthenticationParameters params)

Parámetros de invocación

NombreTipoDescripción
paramsAuthenticationParameters  Objeto (ver detalle de campos en el apartado de objetos comunes)

Parámetros de respuesta

NombreTipoDescripción
result5.- Servicios SIFE#AuthenticationOperationResultObjeto (ver detalle de campos en el apartado de objetos comunes)

Códigos error

CódigoDescripción
404La aplicación indicada no existe

Ejemplos de invocación

A continuación se muestra un ejemplo de invocación al método verifyCertificateForAuthentication en el cual se verifica la validez de un certificado.

Ejemplo de invocación verifyTimestamp a través de CSV
String accountId = "account1";	
X509Certificate chain[] = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");

AuthenticationParameters params = new AuthenticationParameters();
params.setTargetAccountId(accountId);
params.setCertificates(Arrays.asList(chain));
	
AuthenticationOperationResult result = loginServiceClient.verifyCertificateForAuthentication(params);

Anexos

Objectos Comunes

Objeto  'SignatureParameters'

NombreTipoDescripción
claimedSignerRoleList<String>

Lista de roles del firmante

digestAlgorithmObjeto 1034420316 Algoritmo de digest utilizado para calcular el hash
documentObjeto 1034420316 Origen de datos a firmar
detachedContentObjeto 1034420316 Origen de datos correspondiente con la firma en caso de firmas detached
signatureLevelObjeto 1034420316

Nivel deseado para la firma

Ej: B,T,XL, A etc

signaturePackagingObjeto 1034420316Empaquetado de la firma
signatureProfileString

Preconfiguracion de parametros de firma en servidor. NO tienen preferencia sobre los definos en SignatureParameters como 'digestAlgorithm'. 

Ej: si signatureProfile.digestAlgorithm=SHA256 y signatureParameters.digestAlgorithm=SHA512 se utilizara SHA512

signaturePolicyObjeto 1034420316 Política de firma a incluir
signingCertificateAliasStringAlias del certificado servidor para utilizar en la firma
signingDateXMLGregorianCalendarFecha de firma
userIdentifierStringNIF del peticionario. Debera estar habilitado

Objeto   'SifeDocument'

NombreTipoDescripción
digestValuebyte []Resumen del documento (hash)
digestAlgorithmObjeto 1034420316Algoritmo de digest utilizado para calcular el hash
databyte []Contenido completo del documento
mimetypeString

Tipo del documento.

Ej: application/pdf, application/xml

csvStringIdentificador del documento en CCSV
csvSignatureIdStringIdentificador de la firma del documento en CCSV
sifeIdentiferLongIdentificador interno de SIFE para documentos temporales
nameStringNombre del documento

Objeto   'Policy'

NombreTipoDescripción
digestAlgorithmObjeto 1034420316Algoritmo  de digest utilizada para calcular el hash
digestValuebyte[]Resumen del documento (hash)
identifierStringIdentificador de la política
qualifierStringURL del documento externo, normalmente un PDF
ageBooleanIndica si aplicar la politica de la AGE. Valor por defecto, false
facturaeBooleanIndica si aplicar la politica de factura electrónica. Valor por defecto, false

Objeto   'ExtensionParameters'

NombreTipoDescripción
signatureObjeto 1034420316Firma a elevar
detachedContentObjeto 1034420316Origen de datos correspondiente con la firma en caso de firmas detached
signatureLevelObjeto 1034420316Nivel deseado para la firma (T,XL, A)

Objeto   'TimestampParameters'

NombreTipoDescripción
documentObjeto 1034420316Origen de datos a sellar
timestampFormObjeto 1034420316Tipo de sello de tiempo XML o RFC3161 que soporta TS@. Por defecto RFC3161
digestAlgorithmObjeto 1034420316Algoritmo de digest. Si no viene valor se asigna el del documento
previousTimestampTokenbyte []Sello de tiempo a resellar
previousTimestampFormObjeto 1034420316Tipo de sello de tiempo a resellar

Objeto   'TimestampResponse'

NombreTipoDescripción
indicationObjeto 1034420316Resultado global de la solicitud
errorsList<1034420316Mensajes de error en caso de haberlos
timestampTokenObjeto 1034420316Contenido del token RFC3161 emitido por la TSA
timestampTokenXMLStringContenido del sello de tiempo XML emitido por la TSA

Objeto   'VerificationError'

NombreTipoDescripción
codeStringCódigo del error producido
descriptionStringDescripción del error producido

Objeto   'TimestampToken'

NombreTipoDescripción
serialNumberStringIdentificador del sello de tiempo
nonceString
expiresDateFecha de expiración
generationDateDateFecha de generación
encodedbyte[]Contenido del token
hashbyte[]Hash del mensaje
contentbyte[]Contenido sobre el que se han realizado las acciones
tsaNameString
tsaPolicyOIDString
certificatesList<byte[]>Certificados utilizados

Objeto   'TimestampStatus'

NombreTipoDescripción
serialNumberStringNumero de serie asignado por el prestador al token
indication1034420316Resultado global de la validación del sello
errorsList<10344203161034420316>Errores en la verificación
type1034420316

Tipo de sello, de firma o de archivo

creationDateDateFecha del sellado de tiempo
tsaCertificate1034420316Estado del certificado
timestampTokenDatabyte[]Datos del sellado de tiempo
timestampToken1034420316Token de sello

Objeto   'CertificateStatus'

NombreTipoDescripción
serialNumberStringNúmero de serie
subjectPrincipalStringTitular
issuerPrincipalStringEmisor
errorsList<1034420316>Errores en la verificación
validFromDateFecha desde la que es válido
validTo DateFecha hasta la que es válido
elementsMap<String, String>Cada uno de los elementos extraídos del certificado (Vacío para certificados de sello de tiempo
status1034420316Estado de validación
x509Certificatebyte[]Contenido del certificado en formato DER

Objeto   'CertificateParameters'

NombreTipoDescripción
certificatebyte[]Certificado a validar

Objeto   'CertificateReport'

NombreTipoDescripción
indicationIndicationResultado global de la validación del certificado
certificateStatusList<1034420316>Lista del estado de los certificados validados
errorsList<1034420316>Errores en la verificación

Objeto   'VerificationParameters'

NombreTipoDescripción
signature1034420316Firma a verificar
detachedContent1034420316Contenido del documento al que pertenece la firma en el caso de ser una firma detached
signatureFormat1034420316Formato de firma. Solo requerido para XAdES

Objeto   'VerificationReport'

NombreTipoDescripción
validationTimeDateFecha en la que se ha realizado la validación de la firma 
signaturesList<1034420316>Estado de cada una de las firmas que contiene la firma original
indication1034420316Resultado global de la validación de la firma
errorsList<VerificationError>Errores en la verificación
signatureLevel1034420316Nivel de firma
signatureFormat1034420316Formato de firma

Objeto   'SignatureStatus'

NombreTipoDescripción
indication1034420316Resultado global de validación de la firma
errorsList<1034420316>Errores en la verificación
signingDateDateFecha de firma
signatureExpirationDateDateFecha de caducidad de la firma. Correspondera a la fecha de firma o a la fecha del sello de tiempo si la hay
policyStringDatos de la politica de firma seguida
signatureLevel1034420316Nivel de firma
signingCertificate1034420316Certificado de firma utilizado
certificatesList<1034420316>Certificados procesados
timestampsList<1034420316>Sellos de tiempo de la firma (si los hay)

Objeto   'WSSSignatureParameters'

NombreTipoDescripción
actionsList<1034420316>Acciones a realizar sobre el mensaje. Por defecto SIGNATURE. Las acciones pueden combinarse, por ejemplo [ENCRYPTION, SIGNATURE] o [SIGNATURE, ENCRYPTION]
document1034420316Origen de datos a firmar. Solo admite datos completos, NO admite ni CSV ni digest
keyIdentifierType1034420316Tipo de identificación para la firma
userIdentifierStringNIF del ordenante de la firma
useSingleCertificateBooleanIndica si se usa un certificado simple para la firma, o la cadena completa de certificacion. Por defecto true
signingCertificateAliasStringAlias del certificado servidor para utilizar en la firma
digestAlgorithm1034420316Algoritmo de digest para firma
signatureAlgorithm1034420316Nombre (URI) del algoritmo de encriptación de la firma a utilizar. En el caso de que no se le asigne valor a este parámetro, se establecerá por un proceso automático de detección.
signaturePartsList<WSSEncryptionPart>Controla como se cifra el elemento
simmetricEncryptionAlgorithmStringNombre el algoritmo simétrico de encriptación a utilizar. Este algoritmo de encriptación es usado para encriptar los datos. Si la variable se encuentra vacía se utilizará AES128.
keyEncryptionAlgorithm1034420316Tipo de algoritmo RSA para envolver la clave simetrica.
encryptionCertificateAliasStringAlias del certificado a usar para cifrado utilizando un algoritmo asimetrico
encryptionPartsList<1034420316>Controla como se cifra el elemento

Objeto   'WSSEncryptionPart'

NombreTipoDescripción
nameStringNombre local del elemento a cifrar
namespaceStringNamespace del elemento local a cifrar
encryptionModifierStringEncryption modifier. Valores "Element" o "Content"

Objeto   'WSSVerificationParametersparams'

NombreTipoDescripción
documentSifeDocumentPetición WSS firmada
decryptionCertificateAliasStringAlias del certificado que se va a utilizar para descifrar
signingCertificateAliasStringAlias del certificado a utilizar para validar la firma
userIdentifierStringIdentificador del usuario 

Objeto   'WSSVerificationReport'

NombreTipoDescripción
indication1034420316Resultado global de validación
errorsList<1034420316>Errores en la verificación
databyte[]

Objeto   'AuthenticationParameters'

NombreTipoDescripción
targetAccountIdStringIdentificador de la aplicación que realiza la llamada al servicio
certificatesList<byte[]>Lista con el contenidos de los certificados a verificar.

Objeto   'AuthenticationOperationResult'

NombreTipoDescripción
tokenString

Token JWT con el resumen de la verificación del certificado codificado en base64

Token
{
  "statusCode": "GOOD",
  "subStatusCode": null,
  "inResponseTo": null,
  "adienceRestriction": null,
  "country": "ES",
  "message": null,
  "hashCode": null,
  "notBefore": "2019-12-18T16:04:14.627Z",
  "notOnOrAfter": "2019-12-18T17:04:14.627Z",
  "personalAttributes": {
    "eIdentifier": "Q0100000I",
    "givenName": "FUFASA",
    "surname1": "",
    "surname2": "",
    "inheritedFamilyName": null,
    "adoptedFamilyName": null,
    "citizenQAAlevel": "3",
    "certificateType": "11",
    "representedIdentifier": "10000322Z",
    "representedGivenName": "MANUELA",
    "representedSurname1": "BLANCO",
    "representedSurname2": "VIDAL",
    "authority" : "Agencia Notarial de Certificacion S.L.U. - CIF B83395988",
    "certificateTypeDesc": "ANCERT PF Personal Autenticación 2010",
    "certificateUse": "digitalSignature",
    "classification": "ESIG",
    "organizationalUnit": "Autorizado ante Notario NOTARIO FICTICIO",
    "policy": "1.3.6.1.4.1.18920.1.1.1.2.2",
    "policyVersion": "61",
    "serialNumber": "149600354636033510397093140076022879569",
    "validFromDate": "2019-05-02 jue 12:41:51 +0200",
    "validToDate": "2022-05-02 jue 12:41:51 +0200",
  },
  "fail": false
}

Tipos enumerados

Enum   'SignatureLevel'

NombreValor
XAdES_CXAdES_C
XAdES_XXAdES_X
XAdES_XLXAdES_XL
XAdES_AXAdES_A
XAdES_BASELINE_LTAXAdES_BASELINE_LTA
XAdES_BASELINE_LTXAdES_BASELINE_LT
XAdES_BASELINE_TXAdES_BASELINE_T
XAdES_BASELINE_BXAdES_BASELINE_B
CAdES_BASELINE_LTACAdES_BASELINE_LTA
CAdES_BASELINE_LTCAdES_BASELINE_LT
CAdES_BASELINE_TCAdES_BASELINE_T
CAdES_BASELINE_BCAdES_BASELINE_B
CAdES_CCAdES_C
CAdES_XCAdES_X
CAdES_XLCAdES_XL
CAdES_ACAdES_A
PAdES_BASELINE_LTAPAdES_BASELINE_LTA
PAdES_BASELINE_LTPAdES_BASELINE_LT
PAdES_BASELINE_TPAdES_BASELINE_T
PAdES_BASELINE_BPAdES_BASELINE_B
PAdES_LTVPAdES_LTV
ASiC_S_BASELINE_LTAASiC_S_BASELINE_LTA
ASiC_S_BASELINE_LTASiC_S_BASELINE_LT
ASiC_S_BASELINE_TASiC_S_BASELINE_T
ASiC_S_BASELINE_BASiC_S_BASELINE_B
ASiC_E_BASELINE_LTAASiC_E_BASELINE_LTA
ASiC_E_BASELINE_LTASiC_E_BASELINE_LT
ASiC_E_BASELINE_TASiC_E_BASELINE_T
ASiC_E_BASELINE_BASiC_E_BASELINE_B
WSSWSS
CMSCMS_CMS
XMLDSIGXMLDSIG_XMLDSIG
PAdES_BASIC

PAdES_BASIC

CAdES_BESCAdES_BES
CAdES_EPESCAdES_EPES
CAdES_TCAdES_T
XAdES_BESXAdES_BES
XAdES_EPESXAdES_EPES
XAdES_TXAdES_T
PAdES_BESPAdES_BES
PAdES_EPESPAdES_EPES
PAdES_TPAdES_T
ODFODF

Enum   'SignaturePackaging'

NombreValor
ENVELOPEDENVELOPED
ENVELOPINGENVELOPING
DETACHEDDETACHED

Enum   'DigestAlgorithm'

NombreValor1jceName
SHA1SHA1SHA-1
SHA224SHA224
SHA256SHA256SHA-256
SHA384SHA384SHA-384
SHA512SHA512SHA-512
MD2MD2MD2
MD5MD5MD5

Enum   'TimestampForm'

NombreValor
XMLXML
RFC3161RFC3161

Enum   'Indication'

NombreValor
VALIDVALID
INVALIDINVALID

Enum   'TimestampType'

NombreValor
SIGNATURE_TIMESTAMP

SIGNATURE_TIMESTAMP

ARCHIVE_TIMESTAMPARCHIVE_TIMESTAMP

Enum   'Status'

NombreValor
GOODGOOD
REVOKEDREVOKED
EXPIREDEXPIRED
UNKNOWNUNKNOWN
NOT_CHECKEDNOT_CHECKED

Enum   'SignatureFormat'

NombreValor
XAdESXAdES
CAdESCAdES
PAdESPAdES
ASiC_SASiC_S
ASiC_EASiC_E
WSSWSS
CMSCMS

Enum   'WSSAction'

NombreValor
ENCRYPTIONENCRYPTION
SIGNATURESIGNATURE
TIMESTAMPTIMESTAMP

Enum   'WSSKeyIdentifierType'

NombreValor
BST_DIRECT_REFERENCE1
ISSUER_SERIAL2
X509_KEY_IDENTIFIER3
SKI_KEY_IDENTIFIER4
THUMBPRINT_IDENTIFIER8
KEY_VALUE13

Enum   'SignatureAlgorithm'

NombreValor
RSARSA
DSADSA
RSA_SHA256RSA-SHA256

Enum   'KeyEncryptionAlgorithm'

NombreValor
RSA15RSA15
RSAOEPRSAOEP
RSAOAEP_XENC11RSAOAEP_XENC11