Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device.
Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device. Atlassian cookies and tracking notice, (opens new window)
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.
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
STAMP_NOT_AUTHORIZED
El 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.
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.
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.
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.
Objeto CertificateReport (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.
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.
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.
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
WSSVerificationParametersparams Objeto (ver detalle de campos en el apartado de objetos comunes)
Parámetros de respuesta
Nombre
Tipo
Descripción
Nombre
Tipo
Descripción
report
WSSVerificationReport Objeto (ver detalle de campos en el apartado de objetos comunes)
Códigos error
Código
Descripción
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
STAMP_NOT_AUTHORIZED
El 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.