Firma tus PDFs con tu propio certificado.
Garabato es una aplicación autoalojada para firmar PDFs con tus certificados digitales PKCS#12. Suelta un archivo, coloca la firma visible, firma y descarga. Los certificados y los documentos se guardan cifrados, y cada firma crea una versión nueva.
curl -fsSL https://raw.githubusercontent.com/Nonetss/garabato/main/scripts/bootstrap.sh | bashQué incluye
Coloca la firma y firma.
Elige un certificado, decide si la firma es visible o invisible, dibuja un rectángulo en la página y añade, si quieres, un motivo y un lugar. La firma es PAdES y lleva incrustada la cadena del certificado, y con una autoridad de sellado de tiempo configurada incluye un sello que demuestra cuándo se hizo.
Cada firma es una versión nueva.
Firmar nunca sobrescribe un documento. El visor muestra los sellos visibles, el historial de versiones, todas descargables, y quién firmó con qué certificado.
Una biblioteca que se mantiene ordenada.
Miniaturas de los PDFs en carpetas anidadas con su propio icono, etiquetas de colores y documentos fijados. Busca y filtra en toda la biblioteca, selecciona varios a la vez y muévelos arrastrando.
Tus certificados, guardados cifrados.
Importa un archivo PKCS#12 una vez y firma con él desde entonces. El archivo y su contraseña se sellan con su propia clave, y la lista muestra el titular, el NIF, el emisor y cuánto le queda de validez a cada uno.
Una traza de todo lo que haces.
Todas las firmas con su documento, certificado, versión, posición y hashes, junto a cada importación, subida, unión, edición de páginas, descarga, renombrado, movimiento y borrado, filtrables por tipo, certificado, nombre y fechas.
Y el resto de la aplicación
- Búsqueda en todas partes
- ⌘K o Ctrl+K te lleva a cualquier página, documento o carpeta de la biblioteca.
- Claro, oscuro y móvil
- Tema claro, oscuro o del sistema, una interfaz que funciona en el móvil y una PWA instalable.
- Inicia sesión como prefieras
- Email y contraseña, y además cualquier proveedor OIDC (Keycloak, Authentik, Google…), que se activa con tres variables.
- Panel de administración
- Usuarios, sesiones, organizaciones y equipos, API keys y un registro de actividad, solo para el rol admin.
- Una API tipada
- Cada procedimiento es también HTTP normal bajo /api/v1, documentado en /scalar para los administradores. Llámala desde scripts con una API key.
- Tu almacenamiento
- Los documentos van al MinIO incluido o a cualquier almacenamiento compatible con S3 que ya tengas.
Cómo está montado
Tres imágenes de la aplicación más PostgreSQL y un almacenamiento de objetos, levantados con Docker Compose. El navegador solo habla con el gateway Caddy, que manda la API al backend y todo lo demás al frontend. El backend es el dueño de la base de datos y del almacén de documentos.
Recorrido de las peticiones
- → HTTPS
- :80Caddy→ /*
- :4321Astro SSR
- → /rpc
- :80Caddy
- :3000Hono · oRPCPostgreSQL→ S3
- :9000MinIO · S3
Enrutado del gateway
| Petición | Va a |
|---|---|
| /rpc/* /api/* /scalar* /openapi.json | backend:3000 |
| /health | ok |
| cualquier otra ruta | frontend:4321 |
- Todo lo sensible se cifra en reposo.
- Cada certificado y cada documento tiene su propia clave de datos aleatoria, envuelta por la clave maestra de CERTIFICATE_ENCRYPTION_KEY. Los archivos PKCS#12, sus contraseñas y cada versión de un PDF se sellan con AES-256-GCM, ligados al registro y al hueco al que pertenecen.
- Firmas que un validador puede comprobar.
- Garabato firma en PAdES baseline (ETSI.CAdES.detached) con el atributo signing-certificate-v2 e incrusta la cadena del emisor, para que un validador pueda llegar hasta la autoridad de certificación. Con TSA_URL definida, cada firma lleva además un sello de tiempo RFC 3161 (B-T), o falla antes que guardarse sin él.
- No se sobrescribe nada.
- Una firma crea una versión nueva del documento y un registro en el historial de firmas. Las versiones anteriores siguen descargables, y los documentos y certificados de otro usuario responden como no encontrados.
En marcha con un solo comando.
En un host Linux con Docker, curl y openssl, desde un directorio vacío:
curl -fsSL https://raw.githubusercontent.com/Nonetss/garabato/main/scripts/bootstrap.sh | bash¿Prefieres montarlo a mano? Desplegar con Docker Compose
Qué hace el script
- Pregunta el puerto, la URL pública y el primer administrador, y si los documentos van al MinIO incluido o a un almacenamiento externo compatible con S3.
- Genera todos los secretos con openssl, incluida la clave maestra que cifra los certificados y los documentos.
- Escribe .env y descarga compose.prod.yml en el directorio actual.
- Arranca el stack con las imágenes de ghcr.io. El backend migra la base de datos y crea el administrador al arrancar.