/* DESARROLLO */
El portafirmas de la Diputación de Palencia, la página donde se firman con certificado los documentos que la Diputación envía por correo, está programado para preguntar a un fichero de 380 bytes dónde está su servidor de firma. El fichero contesta con una dirección de pruebas, bajo un rótulo que dice DESARROLLO. La de la propia sede está escrita al lado, tachada.
- Dominio
- sede.diputaciondepalencia.es
- Guardado
- 31 AGO 2026
- Comprobado en vivo
- 14 SEP 2026
- Citas
- 10 en 4 ficheros guardados
- Lectura
- unos 4 min

Firmar es lo más solemne que se puede hacer con un ratón. La Diputación manda un documento por correo, quien lo recibe lo abre en el portafirmas, presenta su certificado y estampa una firma que vale lo que valdría su mano. Detrás hay un mecanismo largo: un programa instalado en el ordenador, AutoFirma, que se entiende con la página por un canal propio, y unos servicios en el servidor que preparan la firma, la guardan y la devuelven. La página tiene que decirle a AutoFirma dónde están esos servicios. Lo hace con una dirección.

La dirección está aparte de la aplicación, en un fichero de 380 bytes que la página carga justo después de la aplicación y justo antes del cliente de AutoFirma. Es la manera ordenada de hacerlo: la aplicación se compila y no se toca, y lo que cambia de un despliegue a otro, la dirección del servidor, se deja fuera, en un fichero pequeño que cualquiera puede editar sin recompilar nada. El fichero se llama constantes.js.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 789 B
- sha256
- d3a87216e487…
| 9 | <title>Portafirmas</title> |
| 10 | <script type="module" crossorigin src="/ |
| 11 | <link rel="stylesheet" href="/ |
| 12 | </head> |
| 13 | |
| 14 | <body> |
| 15 | <noscript> |
| 16 | <strong>We're sorry but portafirmas doesn't work properly without JavaScript enabled. Please enable it to |
| 17 | continue.</strong> |
| 18 | </noscript> |
| 19 | <div id="app"></div> |
| 20 | <script src="/ |
| 21 | <script src="/ |
| 22 | |
| 23 | </body> |
| 24 | |
| 25 | </html> |
Cabe entero en una pantalla. Tras la línea que abre la lista de constantes vienen dos líneas de nota, de quien lo escribió para quien lo lea después, en mayúsculas: para pruebas, usar siempre una IP o un nombre de dominio, nunca localhost; si no, AutoFirma bloqueará la firma por seguridad. Es una nota útil, escrita para las pruebas. Luego viene el rótulo, un comentario solo en su línea: DESARROLLO.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 380 B
- sha256
- 6ef30413457c…
- Tapado
- 1 tramos ▒
| 1 | /* eslint-disable */ |
| 2 | |
| 3 | var Constants = { |
| 4 | // IMPORTANTE: PARA PRUEBAS, USAR SIEMPRE UNA IP O NOMBRE DE DOMINIO, NUNCA 'LOCALHOST' O '127.0.0.1' |
| 5 | // SI NO SE HACE ASI, AUTOFIRMA BLOQUEARA LA FIRMA POR SEGURIDAD |
| 6 | |
| 7 | /* DESARROLLO */ |
| 8 | URL_BASE_SERVICES: 'https:// |
| 9 | } |
Y debajo, la única constante del fichero: la dirección base de los servicios, apuntando a un servidor cuyo nombre empieza por test, en un dominio comercial que no es el de la sede, por el puerto 8443. El nombre del dominio lo tapamos nosotros; en el fichero está entero. En la misma línea, detrás de una coma, hay dos barras. En este lenguaje dos barras convierten en comentario todo lo que viene después.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 380 B
- sha256
- 6ef30413457c…
- Tapado
- 1 tramos ▒
| 5 | // SI NO SE HACE ASI, AUTOFIRMA BLOQUEARA LA FIRMA POR SEGURIDAD |
| 6 | |
| 7 | /* DESARROLLO */ |
| 8 | URL_BASE_SERVICES: 'https:// |
| 9 | } |
Y lo que viene después es la dirección de la propia sede: sede.diputaciondepalencia.es/autofirma. La dirección buena está escrita. Está en la línea correcta del fichero correcto, en el servidor correcto. Está tachada: las dos barras la dejan dentro del comentario, con una coma delante, y para la aplicación no existe. Usarla no pide buscarla, pide reordenar la línea. Tal como está, manda la de pruebas.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 380 B
- sha256
- 6ef30413457c…
- Tapado
- 1 tramos ▒
| 5 | // SI NO SE HACE ASI, AUTOFIRMA BLOQUEARA LA FIRMA POR SEGURIDAD |
| 6 | |
| 7 | /* DESARROLLO */ |
| 8 | URL_BASE_SERVICES: 'https:// |
| 9 | } |
En la misma línea, tras la de Palencia, hay una tercera: seu.santcugat.cat/autofirma. Seu es sede en catalán; es la sede electrónica del Ayuntamiento de Sant Cugat del Vallès. No sabemos por qué está ahí y no lo vamos a adivinar. Lo que sabemos es lo que dice la línea: el fichero de constantes del portafirmas de Palencia lleva escrita, comentada, la dirección /autofirma de la sede de Sant Cugat.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 380 B
- sha256
- 6ef30413457c…
- Tapado
- 1 tramos ▒
| 5 | // SI NO SE HACE ASI, AUTOFIRMA BLOQUEARA LA FIRMA POR SEGURIDAD |
| 6 | |
| 7 | /* DESARROLLO */ |
| 8 | URL_BASE_SERVICES: 'https:// |
| 9 | } |
¿Y qué hace la aplicación con la constante? La usa en cuatro sitios, y los cuatro son el mismo gesto. Al identificarse (el portafirmas no pide contraseña, pide que se firme un mensaje con el certificado) llama a AutoFirma con un parámetro que se construye con esa dirección. Termina en el servicio de firma trifásica, el modo en que AutoFirma reparte el trabajo de firmar con un servidor. En tres sitios más pasa a AutoFirma otras dos direcciones, construidas igual: el servicio que almacena las firmas y el que las recupera. Todas nacen de la misma constante. La de DESARROLLO.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 245,7 kB
- sha256
- cd0a6a255257…
| 3 | * (c) 2014-2022 Evan You |
| 4 | * Released under the MIT License. |
| 5 | */var ge= |
| 6 | `), |
| 7 | * vue-router v3.6.4 |
| 8 | * (c) 2022 Evan You |
| 9 | * @license MIT |
| 10 | */function Pe(e,t){for(var r in t)e[r]=t[r];return e}var cv=/ |
| 11 | * vuex v3.6.2 |
| 12 | * (c) 2021 Evan You |
| 13 | * @license MIT |
| 14 | …& |
| 15 | * vue-i18n v8.27.2 |
| 16 | * (c) 2022 kazuya kawaguchi |
| 17 | * Released under the MIT License. |
| 18 | */var Uu= |
| 19 | a[href], |
| 20 | area[href], |
| 21 | input:not([disabled]), |
| 22 | select:not([disabled]), |
| 23 | textarea:not([disabled]), |
| 24 | button:not([disabled]), |
| 25 | iframe, |
El cliente de AutoFirma que carga la propia página explica con sus palabras qué son esas dos direcciones: «las rutas de los servlets encargados de almacenar y recuperar las firmas de los dispositivos moviles», los programas del servidor que guardan y devuelven las firmas hechas desde un móvil. Y tiene su propia opinión sobre dónde deberían estar. Si nadie le dice otra cosa, las construye sobre la dirección de la página en la que está. La sede misma. Ese es el valor por defecto. La aplicación lo sustituye, a propósito, por el del fichero.
- Copia
- archivo
- Guardado
- 31 ago 2026
- Peso
- 222,8 kB
- sha256
- dd77491f6e51…
| 4264 | return errorMessage; |
| 4265 | } |
| 4266 | |
| 4267 | /** |
| 4268 | * Recupera el tipo del ultimo error capturado. |
| 4269 | */ |
| 4270 | function getErrorType () { |
| 4271 | return errorType; |
| 4272 | } |
| 4273 | |
| 4274 | /** |
| 4275 | * Establece las rutas de los servlets encargados de almacenar y recuperar las firmas de los dispositivos moviles. |
| 4276 | */ |
| 4277 | function setServlets (storageServlet, retrieverServlet) { |
| 4278 | storageServletAddress = storageServlet; |
| 4279 | retrieverServletAddress = retrieverServlet; |
| 4280 | } |
| 4281 | |
| 4282 | /** |
| 4283 | * Establece el error indicado como error interno y lanza una excepcion. |
| 4284 | */ |
| 4285 | function throwException (type, message) { |
| 4286 | errorType = type; |
| 4287 | errorMessage = message; |
| 4288 | throw new Error(); |
| 3831 | if (clientAddress != undefined && clientAddress != null) { |
| 3832 | if (clientAddress. |
| 3833 | var servletsBase = clientAddress.substring(0, clientAddress.indexOf("/", clientAddress. |
| 3834 | retrieverServletAddress = servletsBase + "/ |
| 3835 | storageServletAddress = servletsBase + "/ |
| 3836 | } else { |
| 3837 | retrieverServletAddress = clientAddress + "/ |
| 3838 | storageServletAddress = clientAddress + "/ |
| 3839 | } |
| 3840 | } else { |
| 3841 | retrieverServletAddress = window.location.origin + "/ |
| 3842 | storageServletAddress = window.location.origin + "/ |
| 3843 | } |
| 3844 | |
| 3845 | /** |
| 3846 | * Establece el almacen de certificados de que se debe utilizar por defecto. |
| 3847 | */ |
| 3848 | function setKeyStore (keystore) { |
| 3849 | defaultKeyStore = keystore; |
| 3850 | } |
| 3851 | |
| 3852 | /** |
| 3853 | * Inicia el proceso de seleccion de certificado. |
| 15 | if (!window.location.origin) { |
| 16 | window.location.origin = window.location.protocol + "//" + window.location.hostname |
| 17 | + (window.location.port ? ':' + window.location.port : ''); |
| 18 | } |
| 19 | |
| 20 | var originalXMLHttpRequest = window.XMLHttpRequest; |
| 21 | |
| 22 | var SupportDialog; |
| 23 | |
| 24 | var AutoScript = ( function ( window, undefined ) { |
| 25 | |
| 26 | var VERSION = "1.9.0"; |
| 27 | var VERSION_CODE = 3; |
| 28 | |
| 29 | /* ========== DEPRECADO: No se utiliza, pero se mantiene por compatibilidad con los despliegues del MiniApplet. */ |
| 30 | var JAVA_ARGUMENTS = null; |
| 31 | var SYSTEM_PROPERTIES = null; |
| 32 | /* ========== */ |
| 33 | |
| 34 | var clienteFirma = null; |
| 35 | |
| 36 | var storageServletAddress = null; |
El servidor que entrega el fichero es moderno y va bien vestido: cabeceras que prohíben incrustar la página en otra y que fuerzan HTTPS durante un año. Otras apagan la geolocalización, el micrófono y la cámara. Cinco cabeceras de seguridad para servir un fichero de 380 bytes que dice DESARROLLO. Ninguna de las cinco lee lo que entrega. Según ese mismo servidor, el fichero se modificó por última vez el 3 de julio de 2025.
Lo guardamos el 31 de agosto de 2026 y lo volvimos a pedir el 14 y el 23 de septiembre: los mismos 380 bytes, byte a byte, y la misma fecha de modificación. Más de catorce meses en el sitio, con la dirección buena a un lado, detrás de las barras. Mientras tanto, cada vez que alguien abre el portafirmas la página carga el fichero, y cuando la aplicación pregunta dónde firmar, el fichero contesta lo mismo: en el servidor de pruebas.
La dirección correcta está escrita en la línea correcta del fichero correcto, del lado equivocado de dos barras.
- La página /portafirmas/ de la sede carga un fichero de constantes de 380 bytes cuya única constante, bajo el comentario DESARROLLO, apunta a un servidor test de un dominio comercial ajeno a la sede por el puerto 8443.
- En la misma línea, comentadas, van la dirección de la propia sede y la de la sede de Sant Cugat del Vallès.
- La aplicación usa esa constante para construir el servidor de firma trifásica al identificarse y los servicios de almacenar y recuperar firmas en tres sitios; el cliente de AutoFirma usaría por defecto la dirección de la propia página.
- El servidor declara el fichero modificado el 3 de julio de 2025.
- La copia del 31 de agosto de 2026, la del 14 de septiembre y la respuesta del 23 de septiembre son idénticas.
- Que ninguna firma o documento haya viajado a ese servidor.
- Que el servidor de pruebas exista o responda: no le hemos enviado nada.
- Quién es el titular del dominio comercial, cuyo nombre tapamos.
- Por qué está ahí la dirección de Sant Cugat.
- Que el portafirmas esté en uso ni cuántas personas lo usan.
- Que el fichero sea inseguro, ni qué haría AutoFirma al encontrarse con esa dirección.
De dónde sale cada cita
Cada trozo de código de esta ficha está en un fichero guardado tal como lo entregó el servidor, con su huella (sha256) y su hora. Las citas entre «» se comprueban por programa contra ese fichero antes de publicar.
- https://sede.diputaciondepalencia.es/portafirmas/31 de agosto de 2026, 21:19archivosha256 d3a87216e4870c36ca09ed5faf99f4d4a33417eb60fea3da65ff5acd956ff72b
- https://sede.diputaciondepalencia.es/portafirmas/14 de septiembre de 2026, 22:13en vivo · byte a byte igualsha256 d3a87216e4870c36ca09ed5faf99f4d4a33417eb60fea3da65ff5acd956ff72b
- https://sede.diputaciondepalencia.es/portafirmas/js/constantes.js31 de agosto de 2026, 21:17archivosha256 6ef30413457c00f8dd56f247284648d21c378684ec635b2c280d50d13ce8179c
- https://sede.diputaciondepalencia.es/portafirmas/js/constantes.js14 de septiembre de 2026, 22:13en vivo · byte a byte igualsha256 6ef30413457c00f8dd56f247284648d21c378684ec635b2c280d50d13ce8179c
- https://sede.diputaciondepalencia.es/portafirmas/assets/index.f506ebe4.js31 de agosto de 2026, 21:17archivosha256 cd0a6a25525778a6078598ab86f26a769868dce94fd18f384c1b8c0da4e7f626
- https://sede.diputaciondepalencia.es/portafirmas/js/autoscript.js31 de agosto de 2026, 21:17archivosha256 dd77491f6e514ca22d40a1737e6bb13a11f05469c38ddf12ac4a90a7e35f0af5