Privacidad al firmar un PDF en el navegador
Conoce cómo se procesan el PDF y el certificado, qué datos puede incluir un reporte voluntario y cómo comprobar las solicitudes de red. Versión del 30 de septiembre de 2026.
Compatibilidad y ayuda con errores
La pantalla inicial de DocuFirma llega en el HTML del servidor y permanece visible mientras se carga el editor en tu navegador. Su animación no indica progreso ni confirma que puedas desconectarte. Espera el mensaje «Listo sin conexión» en el editor antes de elegir tus archivos sin internet.
Antes de abrir el editor comprobamos las funciones necesarias del navegador. Si faltan, mostramos una pantalla con instrucciones para continuar. Usa la dirección segura del sitio, que comienza con HTTPS. Recordar el certificado es opcional y su ausencia no impide firmar.
Si la preparación falla, los archivos y la contraseña permanecen deshabilitados. Abre «Ver detalles y reintentar» para conocer el motivo y su código. Cada etapa tiene códigos estables, como FIRMA-PREP-ASSETS o FIRMA-CERT-EXPIRED. Un error de contraseña incorrecta no abre un formulario de reporte, porque no es un fallo técnico.
Reportes voluntarios de errores
Ante ciertos fallos técnicos ofrecemos «Informar este error». La aplicación prepara datos técnicos únicamente cuando ocurre un error: versión del formato, identificador aleatorio del incidente, código y mensaje estable, etapa, clase segura de excepción (por ejemplo, TypeError), hora, navegador, plataforma, idioma, zona horaria, tamaño de pantalla y área visible, y escala de píxeles. Esta información permanece en esta pestaña hasta que decides enviarla. No se registra el uso normal ni se envían reportes automáticamente.
Antes de enviar, el formulario muestra todos los datos técnicos, el correo opcional y el comentario que escribiste. La aplicación no adjunta ni recopila automáticamente el PDF, su nombre, el certificado, la clave privada, la contraseña, la identidad del firmante ni la imagen de firma. Tampoco envía el mensaje o stack originales de JavaScript, que podrían incluir texto del documento o rutas locales. El comentario es texto libre: podría contener esos datos si los pegas. Sin la traza, el reporte permite agrupar fallos por código, etapa y navegador, pero no indica la función, el archivo o la línea exactos. El formulario requiere que pulses «Enviar reporte»; si no lo envías, no queda guardado ni se pone en una cola local.
Si dejas el correo en blanco y no escribes datos que te identifiquen, el reporte se envía de forma anónima. El correo y el comentario sí pueden identificarte si los incluyes. Si compartes tu correo, el equipo podrá pedirte más detalles y avisarte cuando corrijamos el problema. En localhost, el reporte se guarda en el KV local; en el sitio publicado, se guarda en el espacio KV de Cloudflare durante 90 días. Cloudflare procesa metadatos normales de conexión, como la dirección IP, pero no los añade al registro del reporte. Si las notificaciones del equipo están configuradas, el reporte también se envía a Slack.
Qué significa «local»
El navegador puede conservar las herramientas públicas, fuentes e imágenes durante dos años para acelerar visitas posteriores. Cada versión usa una dirección distinta cuando cambia su contenido. La página, la lista de preparación y el controlador de recursos locales se mantienen actualizados para cargar las nuevas versiones. Esta caché contiene recursos del sitio, no tus documentos, certificados ni contraseñas.
La dirección del servicio es https://docufirma.org. Si entras por www.docufirma.org, el servidor te redirige a esa dirección antes de cargar las herramientas. Esta redirección no recibe tus archivos ni la contraseña.
Cuando visitas DocuFirma en docufirma.org, nuestro sitio entrega las herramientas a tu navegador. Todo el trabajo con tus archivos ocurre en tu equipo: leer el PDF, desbloquear el certificado con tu contraseña y generar el documento firmado. No enviamos tu PDF, certificado, clave privada ni contraseña a nuestros servidores, ni los guardamos allí.
La respuesta inicial incluye la hora del servidor para compararla localmente con el reloj de tu dispositivo. Si difieren por más de cinco minutos, mostramos un aviso, pero puedes continuar. La comparación se repite al volver a la pestaña y antes de firmar. No enviamos al servidor la hora del dispositivo ni datos del documento para esta comprobación. El PDF usa la hora del dispositivo; este aviso no certifica cuándo se hizo la firma.
El servicio es gratuito y no requiere cuenta ni instalar software. Necesitas tu propio certificado vigente; obtenerlo o renovarlo puede tener un costo con su emisor. Esta versión admite certificados en archivos .p12, .pfx y PEM. No ofrece integración con tokens USB.
Del archivo al PDF firmado
- Seleccionas el PDF y tu certificado. El selector de archivos no los sube a internet.
- La aplicación lee esos archivos en la memoria del navegador. La contraseña sirve para desbloquear la clave privada localmente.
- Tu navegador genera la firma electrónica con tu clave privada y la incorpora al PDF.
- Guardas el PDF firmado directamente desde tu navegador en tu equipo.
El PDF final sí incluye el certificado público y datos de identidad necesarios para verificar la firma. No incluye la contraseña, la clave privada ni una copia del archivo .p12.
¿Cómo funciona técnicamente?
JavaScript no trae una función única para firmar PDF. DocuFirma combina APIs estándar del navegador con bibliotecas JavaScript especializadas. Las herramientas se preparan antes de habilitar los archivos; después, el documento y el certificado se procesan en la sesión del navegador.
APIs del navegador
- Leer archivos:
File.arrayBuffer()obtiene los bytes del PDF y del certificado.TextDecoderconvierte el PEM en texto yTextEncodercodifica en bytes el contenido gráfico que se añade al PDF. Consulta la API File y Blob. - Criptografía:
crypto.subtle.importKey(),sign()yverify()importan una clave PEM y comprueban que corresponda al certificado.crypto.getRandomValues()genera el reto de comprobación;crypto.randomUUID()crea identificadores de campos. Web Crypto API. - Trabajo en segundo plano:
WorkerypostMessage()permiten crear y actualizar el PDF sin bloquear la interfaz. El worker recibe los bytes del PDF y los datos públicos del certificado, pero no la contraseña ni la clave privada. Cuando necesita una firma, la solicita al firmante que permanece en la página principal. Consulta Web Workers. - Preparación sin conexión: un
Service Workery laCache APIguardan antes de elegir archivos los recursos públicos de PDF.js, workers y fuentes que necesita la aplicación. Durante la lectura y firma, esos recursos se sirven desde la caché; si falta uno, no se descarga de internet. Consulta Service Workers y Cache API. - Descargar el resultado:
BlobyURL.createObjectURL()entregan al navegador el PDF terminado para guardarlo en tu equipo.URL.revokeObjectURL()libera esa URL temporal. Consulta la API URL.
Bibliotecas de esta versión
@libpdf/core(0.4.2) lee y modifica el PDF;PDF.sign()crea firmas PAdES B-B con SHA-256.P12Signer.create()desbloquea certificados .p12 y .pfx protegidos con contraseña.pdfjs-dist(6.3.289) dibuja la vista previa del documento y sus páginas.pkijs(3.4.1) yasn1js(3.0.10) interpretan certificados X.509 y estructuras ASN.1/DER usadas por los certificados y las claves PEM.
Qué descargamos antes de firmar
Al abrir la página, descargamos las herramientas para leer y firmar PDF, junto con las tipografías disponibles. Son recursos del sitio, iguales para todos los usuarios. Esta preparación ocurre antes de que puedas seleccionar tus archivos.
Las herramientas quedan disponibles en tu navegador. Después de la preparación, abrir tu PDF, desbloquear el certificado y firmar no requieren conexión con nuestros servidores. El PDF se genera en segundo plano dentro de tu navegador para que puedas ver el avance si la operación tarda. Tus archivos no se envían a otro equipo. Si la preparación falla, te mostramos cómo reintentar antes de continuar.
Puedes firmar con internet conectado o desconectado. En ambos casos, tus archivos y tu contraseña se procesan localmente. La conexión inicial sirve para cargar el sitio y sus herramientas.
Haz la prueba sin internet
- Abre DocuFirma con conexión y espera la preparación automática antes de elegir archivos personales. Puedes revisar su estado en «Todo se procesa en tu equipo localmente.».
- Espera el mensaje «Listo sin conexión». Se descargan herramientas de PDF y fuentes; se guardan únicamente recursos públicos en la caché de tu navegador.
- Desconecta el Wi-Fi y cualquier otra conexión de internet de tu equipo. Mantén abierta la pestaña, sin recargarla.
- Ahora selecciona un PDF y tu certificado, escribe la contraseña, ubica las firmas y confirma.
- Al abrir el PDF puedes ubicar firmas de inmediato. Después de firmar, la vista queda en modo de solo lectura. Selecciona «Editar de nuevo» sobre el PDF para editar el original. Al volver a editar, desaparece la confirmación y puedes firmar de nuevo mientras el certificado siga abierto.
- Descarga el PDF firmado. Cierra la pestaña de DocuFirma antes de volver a conectar internet si deseas completar la prueba sin conexión.
Esta función prepara la sesión actual. No promete abrir el sitio desde cero sin internet. No hay una cola de documentos o contraseñas pendiente de enviar al reconectarte. El navegador puede administrar o eliminar su caché; si la preparación falla, no mostramos que está lista.
Comprueba las solicitudes de red
Puedes desbloquear tu certificado antes de elegir el PDF: ese paso no necesita descargas. La preparación termina antes de habilitar los archivos y la contraseña. No descargamos herramientas al abrir tu PDF, desbloquear o firmar.
- Abre las herramientas de desarrollo y entra a Network / Red. La consola no muestra por sí sola todo el tráfico.
- Activa «Preserve log / Conservar registro» y observa la carga inicial y la preparación. Verás recursos de la aplicación, fuentes y herramientas PDF.
- Limpia el registro y realiza una firma con documentos de prueba. Revisa todas las solicitudes, no solo Fetch/XHR: su destino, método, parámetros y contenido enviado.
- No deben aparecer el contenido del documento, nombres de archivos personales, certificados, claves ni contraseñas en esas solicitudes.
- Para una prueba más clara, desconecta físicamente la red después de preparar la sesión. Un recurso servido por un service worker o por caché puede aparecer en el panel sin haber viajado por internet.
Evita compartir un archivo HAR o capturas que contengan datos personales. No pegues comandos de terceros en la consola. Una inspección de red demuestra el comportamiento observado en esa sesión; no certifica cualquier versión futura ni descarta extensiones maliciosas.
Solicitudes de extensiones: cómo distinguirlas
Extensiones que tengas instaladas, como 1Password, Bitwarden o herramientas de traducción, pueden añadir elementos a la página y cargar sus propios recursos. No son componentes incluidos por DocuFirma. El nombre de un archivo no basta para saber de dónde viene.
- Selecciona la entrada en Network / Red y revisa la URL completa en Headers / Encabezados. Una URL
chrome-extension://…identifica un recurso del paquete local de una extensión en Chrome y otros navegadores Chromium. Firefox usamoz-extension://…. Otros navegadores pueden usar esquemas distintos. - Revisa Initiator / Iniciador y la cadena de llamadas para saber qué código inició la carga. Compara el identificador con las extensiones instaladas. Una URL local de extensión no es, por sí misma, una conexión a un servidor de internet.
- No confundas el iniciador con el destino. Una extensión también puede hacer solicitudes
https://o conexioneswss://a servidores externos. Eso sí puede ser tráfico saliente, aunque no lo origine DocuFirma. No garantizamos el comportamiento de tus extensiones. - Para aislar la prueba, utiliza un perfil sin extensiones. En modo incógnito o privado, comprueba que ninguna extensión tenga permiso para ejecutarse. El panel de una pestaña no necesariamente muestra toda la actividad de fondo de las extensiones.
Fuentes: recursos de extensiones en Chrome y URLs de extensiones en Firefox.
Recordar tu certificado es opcional
Si marcas «Recordar mi archivo .p12 o .pfx», el navegador te pide seleccionar ese archivo mediante un permiso de lectura. Tu navegador guarda una referencia de acceso al archivo en los datos locales de este sitio. No guardamos una copia del certificado, su contraseña ni la clave descifrada. La referencia puede identificar el archivo y permitir volver a leerlo: no es una ruta de texto ni acceso a toda tu carpeta.
En la siguiente sesión intentamos leerlo solo si el permiso sigue concedido. Si no, verás un botón para autorizar el acceso. Durante esa comprobación local, el selector permanece visible y deshabilitado. Al terminar, mostramos el certificado recordado si pudimos abrirlo; de lo contrario, puedes autorizar el acceso o elegir otro archivo. La contraseña y el botón «Desbloquear certificado» permanecen deshabilitados hasta que autorices el acceso. Después podrás ingresar la contraseña y desbloquearlo. Mover, eliminar o reemplazar un archivo puede invalidar la referencia, según el navegador y el sistema operativo. En ese caso debes seleccionarlo nuevamente. No buscamos en otras carpetas ni conocemos su ruta absoluta.
Pulsa «Olvidar y elegir otro» para eliminar la referencia. También puedes borrar los datos del sitio y revocar sus permisos desde el navegador. Cerrar la sesión borra el trabajo de esa sesión, pero no elimina una preferencia que decidiste recordar. Úsala solo en tu equipo personal. Los navegadores sin esta función y los archivos PEM mantienen la selección manual.
Qué se guarda y qué no
- En memoria: archivos seleccionados, certificado abierto, clave de firma y PDF generado durante la sesión. La contraseña del formulario se limpia al intentar abrir el certificado.
- En tu navegador: recursos públicos de la aplicación en caché y, solo si lo autorizas, la referencia al archivo del certificado, además de una marca local para recordar que ya viste el mensaje de bienvenida.
- En tu disco: el PDF que tú decides descargar y los archivos originales que ya tenías.
- En el alojamiento web: solicitudes normales para entregar la aplicación. El proveedor puede recibir tu IP y datos técnicos de conexión. Eso es distinto de subir documentos o certificados.
No hay cuentas, base de documentos, publicidad, analítica de comportamiento ni grabación de sesiones en esta versión. Liberamos las referencias de trabajo al cerrar la sesión; JavaScript no puede garantizar un borrado forense inmediato de toda la memoria.
En la primera visita aparece un mensaje de bienvenida sobre el procesamiento local. Al cerrarlo o elegir cualquiera de sus dos opciones, guardamos una marca en el almacenamiento local del navegador para no mostrarlo de nuevo automáticamente. Puedes volver a abrir la explicación detallada desde «Todo se procesa en tu equipo localmente» en la página principal.
Límites de seguridad y validación
El código de la página puede leer los archivos que autorizas y la contraseña que ingresas. Debes confiar en la versión que recibes, tu navegador y tu equipo. Ni una promesa de privacidad ni una política de seguridad sustituyen una revisión independiente. Un equipo comprometido o una extensión maliciosa quedan fuera de esta garantía de funcionamiento.
La clave importada para firmar se configura como no exportable. Esto reduce la posibilidad de extraerla mediante la API, pero no impide que código con acceso a ella la use para firmar. Tampoco significa que el archivo original nunca estuvo en memoria.
La firma usa el reloj del equipo, no un sello de tiempo de una autoridad. Esta versión no consulta revocación ni afirma que una firma previa sea válida. Comprueba el documento final con FirmaEC y los requisitos de la entidad que lo recibirá. Detectar una firma o mostrar su apariencia no equivale a validarla.