Según se indica en su página
oficial,
@firma es una plataforma de validación y firma electrónica multi-PKI desarrollada por el
MINHAP, y que se pone a disposición de las Administraciones Públicas, proporcionando servicios para implementar la autenticación y firma electrónica avanzada de una forma rápida y efectiva.
Originariamente @firma sólo ofrecía un
applet de firma para hacer firma en cliente. De este modo las aplicaciones incluían una serie de librerías y javascript en sus páginas para ejecutar el este applet, que era el que se encargaba de acceder a los certificados del usuario.
Con la progresiva caída en desuso de los applets se ha potenciado el uso de un
componente de usuario denominado
Autofirma. Se trata de una aplicación independiente que debe instalar manualmente el usuario y que es quien en última instancia realiza la firma.
El caso más básico de funcionamiento consiste en que desde la página web se invoque el componente de autofirma pasándole el fichero que se desea firmar (en base 64), se firme en local, y luego se envíe de vuelta a la página. De ahí, volvería finalmente al servidor.
Este modelo de integración es válido cuando los ficheros son relativamente pequeños, pero para documentos mayores implica un tráfico de red excesivo. Además, en algunos dispositivos móviles no se permite la descarga de documentos, como por ejemplo en iOS.
Para solventar estos problemas se dispone de la opción de
firma trifase. En estos casos, el documento nunca llega a salir del servidor remoto y la firma se realiza de forma conjunta entre autofirma y una nueva aplicación web denominada servidor trifase.
Cuando desde página web se invoca a autofirma (a través de
invocación por protocolo), se le pasa como parámetro la URL del servidor trifase y un identificador que hace referencia al fichero remoto que se quiere firmar. Autofirma establece una comunicación con el servidor trifase, indicándole este identificador y se intercambian mensajes para componer una firma e incrustrarla en en el documento resultante.
En la siguiente imagen se muestra el diagrama general de funcionamiento.
El componente autofirma y el server trifase se pueden descargar de la página de la forma del CTT,
http://forja-ctt.administracionelectronica.gob.es/web/clienteafirma. Desde ahí se puede ir a la página de la
forja.
Además, el código fuente del server trifase (como el del resto del proyecto) se puede consultar en su github
https://github.com/ctt-gob-es/clienteafirma.
Para hacer pruebas lo mejor es descargar el server trifase y modificar su config.properties para que emplee acceda a una ruta de disco, que servirá de entrada y salida de los ficheros firmados. El fichero de configuración está en
WEB-INF/classes/config.properties:
# Origenes permitidos
Access-Control-Allow-Origin=*
# Clase DocumentManager
#document.manager=es.gob.afirma.triphase.server.document.SelfishDocumentManager
document.manager=es.gob.afirma.triphase.server.document.FileSystemDocumentManager
# Instalar provedor de XMLdSig alternativo
alternative.xmldsig=false
# Configuracion de la clase FileSystemDocumentManager
indir=D:/tmp/afirma/entrada
outdir=D:/tmp/afirma/salida
overwrite=true
Luego basta con desplegarlo tal cual en un servidor de aplicaciones, por ejemplo tomcat.
Al descargar el componente de autofirma también se incluye una página para probar todas las opciones disponibles de firma. He cogido esa página y la he recortado para dejar únicamente la parte de firma trifase.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html> <!-- Ejemplo basico de lanzador de la aplicacion -->
<head>
<title>Ejemplo de despliegue del MiniApplet @firma</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<script type="text/javascript" src="miniapplet.js"></script>
<script type="text/javascript">
function doSign() {
try {
MiniApplet.sign(
document.getElementById("idFicheroServidor").value,
"SHA512withRSA",
"PAdEStri",
document.getElementById("params").value,
showResultCallback,
showErrorCallback);
} catch(e) {
try {
showLog("Type: " + MiniApplet.getErrorType() + "\nMessage: " + MiniApplet.getErrorMessage());
} catch(ex) {
showLog("Error: " + e);
}
}
}
function showResultCallback(signatureB64, certificateB64) {
showLog("Firma OK");
document.getElementById('result').value = signatureB64;
document.getElementById('certificate').value = certificateB64;
}
function showErrorCallback(errorType, errorMessage) {
showLog("Type: " + errorType + "\nMessage: " + errorMessage);
}
function showAppletLog() {
try {
showLog(MiniApplet.getCurrentLog());
} catch(e) {
showLog("Type: " + MiniApplet.getErrorType() + "\nMessage: " + MiniApplet.getErrorMessage());
}
}
function cleanDataField(dataField, textDiv) {
textDiv.innerHTML = "";
dataField.value = null;
}
function addExtraParam(extraParam) {
var paramsList = document.getElementById("params");
paramsList.value = paramsList.value + extraParam + "\n";
document.getElementById('newParam').value = "";
}
function cleanExtraParams() {
document.getElementById("params").value = "";
document.getElementById('newParam').value = "";
}
function showLog(newLog) {
document.getElementById('console').value = document.getElementById('console').value + "\n" + newLog;
}
</script>
</head>
<body>
<script type="text/javascript">
MiniApplet.setForceWSMode(false);
MiniApplet.cargarAppAfirma();
</script>
<fieldset><legend>Entrada de datos</legend>
<div>
<span>Identificador de fichero en servidor:</span> <input id="idFicheroServidor" type="text" value="prueba.pdf">
</div>
</fieldset>
<br/>
<fieldset><legend>Configuración de la firma</legend>
<div>
<label for="newParam">ExtraParams</label>
<input id="newParam" type="text"><input type="button" value="Agregar" onclick="addExtraParam(document.getElementById('newParam').value);">
<input type="button" value="Limpiar" onclick="cleanExtraParams();">
<span>(Insertar las propiedades de una en una)</span>
<br>
<textarea id="params" cols="50" rows="5" readonly>serverUrl=http://localhost:8080/afirma-server-triphase-signer/SignatureService
</textarea>
</div>
</fieldset>
<br/>
<input type="button" value="Firmar" onclick="doSign();">
<input type="button" value="Mostrar Log" onclick="showAppletLog();">
<br/>
<div>
<span>Consola</span>
<br>
<textarea id="console" cols="150" rows="10">
</textarea>
</div>
<div>
<span>Resultado</span>
<br>
<textarea id="result" cols="150" rows="10">
</textarea>
</div>
<div>
<span>Certificado</span>
<br>
<textarea id="certificate" cols="150" rows="10">
</textarea>
</div>
</body>
</html>
Esta página invoca la firma trifase de tipo
PAdES (firma de PDF).
El único parámetro que hay que cubrir es el identificador del fichero, que será el nombre de un fichero que se encuentre en el directorio de entrada configurado dentro del server trifase.
Para ver los mensajes intercambiados entre autofirma y el server trifase se puede utilizar un filtro de log de tomcat como el describía en una entrada anterior
http://trabajosdesisifo.blogspot.com.es/2016/03/tomcat-custom-request-dump-filter-log.html