Í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.
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
Nombre | Tipo | Descripción |
---|
params | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
signedDocument | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Códigos error
Código | Descripción |
---|
NO_SIGNATUREPROFILE_ERROR | No existe el perfil seleccionado para realizar la firma |
NO_SIGNATURELEVEL_ERROR | El valor de signatureLevel de params es nulo |
BAD_SIGNATURE_PACKAGING_ERROR | El método de packaging elegido no es compatible con el tipo de firma elegido |
NOT_FOUND_ERROR | Error al obtener datos de CCSV |
REQUIRED_DATA_ERROR | Datos requeridos para la realización de la firma son nulos |
REQUIRED_HASH_ERROR | Faltan datos para la realización de una firma a partir de HASH |
BAD_CERTIFICATE_ERROR | El existe un certificado con el alias establecido en el keystore |
REQUIRED_SIGN_ERROR | El documento no tiene firma asociada en CCSV |
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.
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.setSigningCertificateAlias("ast_cert");
signatureParameters.setDocument(sifeDocument);
SifeDocument documentSigned = digitalSignatureServiceClient.sign(signatureParameters);
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.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.
//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);
//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.
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
Nombre | Tipo | Descripción |
---|
params | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
signedDocument | SifeDocument
| Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Códigos error
Código | Descripción |
---|
REQUIRED_SIGN_ERROR | El documento no tiene firma asociada en CCSV |
NOT_FOUND_ERROR | Error al obtener datos de CCSV |
REQUIRED_DATA_ERROR | Datos requeridos para la realización de la firma son nulos |
REQUIRED_HASH_ERROR | Faltan datos para la realización de una firma a partir de HASH |
BAD_CERTIFICATE_ERROR | El 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.
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
//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
Nombre | Tipo | Descripción |
---|
params | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
certificateReport | Objeto 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
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
Nombre | Tipo | Descripción |
---|
params | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
verificationReport | Objeto 1034420316 (ver detalle de campos en el apartado de objetos comunes) |
Códigos error
Código | Descripción |
---|
REQUIRED_SIGN_ERROR | No se encuentra la firma en CCSV |
NOT_FOUND_ERROR | Algún dato necesario para la validación de la firma no se encuentra en base de datos |
REQUIRED_DATA_ERROR | Datos del contenido del documento son nulos |
REQUIRED_HASH_ERROR | Faltan 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.
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);
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
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.
//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);
//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
Nombre | Tipo | Descripción |
---|
params | 1034420316 Objeto (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
sifeDoc | 1034420316 Objeto (ver detalle de campos en el apartado de objetos comunes) |
Códigos error
Código | Descripción |
---|
NO_DATA_ERROR | El parámetro document del objeto WSSSignatureParameters es nulo o no tiene datos |
INTERNAL_SERVER_ERROR | Error interno en el servidor |
NO_SIGNINGCERTIFICATEALIAS_ERROR | WSSAction = 'SIGNATURE' y SigningCertificateAlias es nulo |
BAD_CERTIFICATE_ERROR | No exite el certificado con el alias indicado |
NO_ENCRYPTIONCERTIFICATEALIAS_ERROR | WSSAction = 'SIGNATURE' y EncryptionCertificateAlias es nulo |
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.
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
Nombre | Tipo | Descripción |
---|
params | WSSVerificationParametersparams Objeto (ver detalle de campos en el apartado de objetos comunes) |
Parámetros de respuesta
Nombre | Tipo | Descripción |
---|
report | WSSVerificationReport Objeto (ver detalle de campos en el apartado de objetos comunes) |
Códigos error
Código | Descripción |
---|
NO_DATA_ERROR | El parámetro document del objeto WSSSignatureParameters es nulo o no tiene datos |
INTERNAL_SERVER_ERROR | Error interno en el servidor |
NO_SIGNINGCERTIFICATEALIAS_ERROR | WSSAction = 'SIGNATURE' y SigningCertificateAlias es nulo |
BAD_CERTIFICATE_ERROR | No exite el certificado con el alias indicado |
NO_ENCRYPTIONCERTIFICATEALIAS_ERROR | WSSAction = 'SIGNATURE' y EncryptionCertificateAlias es nulo |
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.
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
Parámetros de respuesta
Códigos error
Código | Descripción |
---|
404 | La 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.
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'
Nombre | Tipo | Descripción |
---|
claimedSignerRole | List<String> | Lista de roles del firmante |
digestAlgorithm | Objeto 1034420316 | Algoritmo de digest utilizado para calcular el hash |
document | Objeto 1034420316 | Origen de datos a firmar |
detachedContent | Objeto 1034420316 | Origen de datos correspondiente con la firma en caso de firmas detached |
signatureLevel | Objeto 1034420316 | Nivel deseado para la firma Ej: B,T,XL, A etc |
signaturePackaging | Objeto 1034420316 | Empaquetado de la firma |
signatureProfile | String | 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 |
signaturePolicy | Objeto 1034420316 | Política de firma a incluir |
signingCertificateAlias | String | Alias del certificado servidor para utilizar en la firma |
signingDate | XMLGregorianCalendar | Fecha de firma |
userIdentifier | String | NIF del peticionario. Debera estar habilitado |
Objeto 'SifeDocument'
Nombre | Tipo | Descripción |
---|
digestValue | byte [] | Resumen del documento (hash) |
digestAlgorithm | Objeto 1034420316 | Algoritmo de digest utilizado para calcular el hash |
data | byte [] | Contenido completo del documento |
mimetype | String | Tipo del documento. Ej: application/pdf, application/xml |
csv | String | Identificador del documento en CCSV |
csvSignatureId | String | Identificador de la firma del documento en CCSV |
sifeIdentifer | Long | Identificador interno de SIFE para documentos temporales |
name | String | Nombre del documento |
Objeto 'Policy'
Nombre | Tipo | Descripción |
---|
digestAlgorithm | Objeto 1034420316 | Algoritmo de digest utilizada para calcular el hash |
digestValue | byte[] | Resumen del documento (hash) |
identifier | String | Identificador de la política |
qualifier | String | URL del documento externo, normalmente un PDF |
age | Boolean | Indica si aplicar la politica de la AGE. Valor por defecto, false |
facturae | Boolean | Indica si aplicar la politica de factura electrónica. Valor por defecto, false |
Objeto 'ExtensionParameters'
Nombre | Tipo | Descripción |
---|
signature | Objeto 1034420316 | Firma a elevar |
detachedContent | Objeto 1034420316 | Origen de datos correspondiente con la firma en caso de firmas detached |
signatureLevel | Objeto 1034420316 | Nivel deseado para la firma (T,XL, A) |
Objeto 'TimestampParameters'
Nombre | Tipo | Descripción |
---|
document | Objeto 1034420316 | Origen de datos a sellar |
timestampForm | Objeto 1034420316 | Tipo de sello de tiempo XML o RFC3161 que soporta TS@. Por defecto RFC3161 |
digestAlgorithm | Objeto 1034420316 | Algoritmo de digest. Si no viene valor se asigna el del documento |
previousTimestampToken | byte [] | Sello de tiempo a resellar |
previousTimestampForm | Objeto 1034420316 | Tipo de sello de tiempo a resellar |
Objeto 'TimestampResponse'
Nombre | Tipo | Descripción |
---|
indication | Objeto 1034420316 | Resultado global de la solicitud |
errors | List<1034420316> | Mensajes de error en caso de haberlos |
timestampToken | Objeto 1034420316 | Contenido del token RFC3161 emitido por la TSA |
timestampTokenXML | String | Contenido del sello de tiempo XML emitido por la TSA |
Objeto 'VerificationError'
Nombre | Tipo | Descripción |
---|
code | String | Código del error producido |
description | String | Descripción del error producido |
Objeto 'TimestampToken'
Nombre | Tipo | Descripción |
---|
serialNumber | String | Identificador del sello de tiempo |
nonce | String |
|
expires | Date | Fecha de expiración |
generationDate | Date | Fecha de generación |
encoded | byte[] | Contenido del token |
hash | byte[] | Hash del mensaje |
content | byte[] | Contenido sobre el que se han realizado las acciones |
tsaName | String |
|
tsaPolicyOID | String |
|
certificates | List<byte[]> | Certificados utilizados |
Objeto 'TimestampStatus'
Nombre | Tipo | Descripción |
---|
serialNumber | String | Numero de serie asignado por el prestador al token |
indication | 1034420316 | Resultado global de la validación del sello |
errors | List<10344203161034420316> | Errores en la verificación |
type | 1034420316 | Tipo de sello, de firma o de archivo |
creationDate | Date | Fecha del sellado de tiempo |
tsaCertificate | 1034420316 | Estado del certificado |
timestampTokenData | byte[] | Datos del sellado de tiempo |
timestampToken | 1034420316 | Token de sello |
Objeto 'CertificateStatus'
Nombre | Tipo | Descripción |
---|
serialNumber | String | Número de serie |
subjectPrincipal | String | Titular |
issuerPrincipal | String | Emisor |
errors | List<1034420316> | Errores en la verificación |
validFrom | Date | Fecha desde la que es válido |
validTo | Date | Fecha hasta la que es válido |
elements | Map<String, String> | Cada uno de los elementos extraídos del certificado (Vacío para certificados de sello de tiempo |
status | 1034420316 | Estado de validación |
x509Certificate | byte[] | Contenido del certificado en formato DER |
Objeto 'CertificateParameters'
Nombre | Tipo | Descripción |
---|
certificate | byte[] | Certificado a validar |
Objeto 'CertificateReport'
Nombre | Tipo | Descripción |
---|
indication | Indication | Resultado global de la validación del certificado |
certificateStatus | List<1034420316> | Lista del estado de los certificados validados |
errors | List<1034420316> | Errores en la verificación |
Objeto 'VerificationParameters'
Nombre | Tipo | Descripción |
---|
signature | 1034420316 | Firma a verificar |
detachedContent | 1034420316 | Contenido del documento al que pertenece la firma en el caso de ser una firma detached |
signatureFormat | 1034420316 | Formato de firma. Solo requerido para XAdES |
Objeto 'VerificationReport'
Nombre | Tipo | Descripción |
---|
validationTime | Date | Fecha en la que se ha realizado la validación de la firma |
signatures | List<1034420316> | Estado de cada una de las firmas que contiene la firma original |
indication | 1034420316 | Resultado global de la validación de la firma |
errors | List<VerificationError> | Errores en la verificación |
signatureLevel | 1034420316 | Nivel de firma |
signatureFormat | 1034420316 | Formato de firma |
Objeto 'SignatureStatus'
Nombre | Tipo | Descripción |
---|
indication | 1034420316 | Resultado global de validación de la firma |
errors | List<1034420316> | Errores en la verificación |
signingDate | Date | Fecha de firma |
signatureExpirationDate | Date | Fecha de caducidad de la firma. Correspondera a la fecha de firma o a la fecha del sello de tiempo si la hay |
policy | String | Datos de la politica de firma seguida |
signatureLevel | 1034420316 | Nivel de firma |
signingCertificate | 1034420316 | Certificado de firma utilizado |
certificates | List<1034420316> | Certificados procesados |
timestamps | List<1034420316> | Sellos de tiempo de la firma (si los hay) |
Objeto 'WSSSignatureParameters'
Nombre | Tipo | Descripción |
---|
actions | List<1034420316> | Acciones a realizar sobre el mensaje. Por defecto SIGNATURE. Las acciones pueden combinarse, por ejemplo [ENCRYPTION, SIGNATURE] o [SIGNATURE, ENCRYPTION] |
document | 1034420316 | Origen de datos a firmar. Solo admite datos completos, NO admite ni CSV ni digest |
keyIdentifierType | 1034420316 | Tipo de identificación para la firma |
userIdentifier | String | NIF del ordenante de la firma |
useSingleCertificate | Boolean | Indica si se usa un certificado simple para la firma, o la cadena completa de certificacion. Por defecto true |
signingCertificateAlias | String | Alias del certificado servidor para utilizar en la firma |
digestAlgorithm | 1034420316 | Algoritmo de digest para firma |
signatureAlgorithm | 1034420316 | Nombre (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. |
signatureParts | List<WSSEncryptionPart> | Controla como se cifra el elemento |
simmetricEncryptionAlgorithm | String | Nombre 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. |
keyEncryptionAlgorithm | 1034420316 | Tipo de algoritmo RSA para envolver la clave simetrica. |
encryptionCertificateAlias | String | Alias del certificado a usar para cifrado utilizando un algoritmo asimetrico |
encryptionParts | List<1034420316> | Controla como se cifra el elemento |
Objeto 'WSSEncryptionPart'
Nombre | Tipo | Descripción |
---|
name | String | Nombre local del elemento a cifrar |
namespace | String | Namespace del elemento local a cifrar |
encryptionModifier | String | Encryption modifier. Valores "Element" o "Content" |
Objeto 'WSSVerificationParametersparams'
Nombre | Tipo | Descripción |
---|
document | SifeDocument | Petición WSS firmada |
decryptionCertificateAlias | String | Alias del certificado que se va a utilizar para descifrar |
signingCertificateAlias | String | Alias del certificado a utilizar para validar la firma |
userIdentifier | String | Identificador del usuario |
Objeto 'WSSVerificationReport'
Nombre | Tipo | Descripción |
---|
indication | 1034420316 | Resultado global de validación |
errors | List<1034420316> | Errores en la verificación |
data | byte[] |
|
Objeto 'AuthenticationParameters'
Nombre | Tipo | Descripción |
---|
targetAccountId | String | Identificador de la aplicación que realiza la llamada al servicio |
certificates | List<byte[]> | Lista con el contenidos de los certificados a verificar. |
Objeto 'AuthenticationOperationResult'
Nombre | Tipo | Descripción |
---|
token | String | Token JWT con el resumen de la verificación del certificado codificado en base64
{
"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'
Nombre | Valor |
---|
XAdES_C | XAdES_C |
XAdES_X | XAdES_X |
XAdES_XL | XAdES_XL |
XAdES_A | XAdES_A |
XAdES_BASELINE_LTA | XAdES_BASELINE_LTA |
XAdES_BASELINE_LT | XAdES_BASELINE_LT |
XAdES_BASELINE_T | XAdES_BASELINE_T |
XAdES_BASELINE_B | XAdES_BASELINE_B |
CAdES_BASELINE_LTA | CAdES_BASELINE_LTA |
CAdES_BASELINE_LT | CAdES_BASELINE_LT |
CAdES_BASELINE_T | CAdES_BASELINE_T |
CAdES_BASELINE_B | CAdES_BASELINE_B |
CAdES_C | CAdES_C |
CAdES_X | CAdES_X |
CAdES_XL | CAdES_XL |
CAdES_A | CAdES_A |
PAdES_BASELINE_LTA | PAdES_BASELINE_LTA |
PAdES_BASELINE_LT | PAdES_BASELINE_LT |
PAdES_BASELINE_T | PAdES_BASELINE_T |
PAdES_BASELINE_B | PAdES_BASELINE_B |
PAdES_LTV | PAdES_LTV |
ASiC_S_BASELINE_LTA | ASiC_S_BASELINE_LTA |
ASiC_S_BASELINE_LT | ASiC_S_BASELINE_LT |
ASiC_S_BASELINE_T | ASiC_S_BASELINE_T |
ASiC_S_BASELINE_B | ASiC_S_BASELINE_B |
ASiC_E_BASELINE_LTA | ASiC_E_BASELINE_LTA |
ASiC_E_BASELINE_LT | ASiC_E_BASELINE_LT |
ASiC_E_BASELINE_T | ASiC_E_BASELINE_T |
ASiC_E_BASELINE_B | ASiC_E_BASELINE_B |
WSS | WSS |
CMS | CMS_CMS |
XMLDSIG | XMLDSIG_XMLDSIG |
PAdES_BASIC | PAdES_BASIC |
CAdES_BES | CAdES_BES |
CAdES_EPES | CAdES_EPES |
CAdES_T | CAdES_T |
XAdES_BES | XAdES_BES |
XAdES_EPES | XAdES_EPES |
XAdES_T | XAdES_T |
PAdES_BES | PAdES_BES |
PAdES_EPES | PAdES_EPES |
PAdES_T | PAdES_T |
ODF | ODF |
Enum 'SignaturePackaging'
Nombre | Valor |
---|
ENVELOPED | ENVELOPED |
ENVELOPING | ENVELOPING |
DETACHED | DETACHED |
Enum 'DigestAlgorithm'
Nombre | Valor1 | jceName |
---|
SHA1 | SHA1 | SHA-1 |
SHA224 | SHA224 |
|
SHA256 | SHA256 | SHA-256 |
SHA384 | SHA384 | SHA-384 |
SHA512 | SHA512 | SHA-512 |
MD2 | MD2 | MD2 |
MD5 | MD5 | MD5 |
Nombre | Valor |
---|
XML | XML |
RFC3161 | RFC3161 |
Enum 'Indication'
Nombre | Valor |
---|
VALID | VALID |
INVALID | INVALID |
Enum 'TimestampType'
Nombre | Valor |
---|
SIGNATURE_TIMESTAMP | SIGNATURE_TIMESTAMP |
ARCHIVE_TIMESTAMP | ARCHIVE_TIMESTAMP |
Enum 'Status'
Nombre | Valor |
---|
GOOD | GOOD |
REVOKED | REVOKED |
EXPIRED | EXPIRED |
UNKNOWN | UNKNOWN |
NOT_CHECKED | NOT_CHECKED |
Nombre | Valor |
---|
XAdES | XAdES |
CAdES | CAdES |
PAdES | PAdES |
ASiC_S | ASiC_S |
ASiC_E | ASiC_E |
WSS | WSS |
CMS | CMS |
Enum 'WSSAction'
Nombre | Valor |
---|
ENCRYPTION | ENCRYPTION |
SIGNATURE | SIGNATURE |
TIMESTAMP | TIMESTAMP |
Enum 'WSSKeyIdentifierType'
Nombre | Valor |
---|
BST_DIRECT_REFERENCE | 1 |
ISSUER_SERIAL | 2 |
X509_KEY_IDENTIFIER | 3 |
SKI_KEY_IDENTIFIER | 4 |
THUMBPRINT_IDENTIFIER | 8 |
KEY_VALUE | 13 |
Enum 'SignatureAlgorithm'
Nombre | Valor |
---|
RSA | RSA |
DSA | DSA |
RSA_SHA256 | RSA-SHA256 |
Enum 'KeyEncryptionAlgorithm'
Nombre | Valor |
---|
RSA15 | RSA15 |
RSAOEP | RSAOEP |
RSAOAEP_XENC11 | RSAOAEP_XENC11 |