Timestamp RFC 3161 · guía técnica

Qué es un timestamp RFC 3161 y cómo se verifica

Una autoridad de sellado de tiempo (TSA) firma la huella de un archivo junto con una fecha y una hora. Aquí tienes qué contiene esa respuesta, cómo comprobarla con OpenSSL o en el navegador y cómo pedirla por API.

¿Buscabas convertir un timestamp Unix a fecha? Esto es otra cosa: aquí se le pone fecha a un archivo.

Verificar un .tsr

Abre el validador: pones el archivo y su sello, y la huella se calcula en tu navegador.

Emitirlos desde tu sistema: la API →
Solo viaja la huella La petición lleva un SHA-256: la autoridad nunca ve el archivo.
Estándar abierto RFC 3161, el protocolo de la IETF que usan las autoridades de sellado desde 2001.
Se verifica sin nadie Con OpenSSL o con cualquier validador, sin depender de quien lo emitió.

Qué es

Una petición, una autoridad y un token.

RFC 3161 es el estándar para el sellado de tiempo, y lo que hace es más simple de lo que parece.

La petición lleva la huella

El cliente calcula el SHA-256 del archivo y envía a la autoridad solo esa huella, con un número aleatorio (nonce) para reconocer la respuesta. El archivo no viaja.

La TSA firma la hora

La autoridad de sellado de tiempo une esa huella a una fecha y una hora de su reloj, y lo firma con un certificado habilitado solo para sellar.

La respuesta es el token

Devuelve un .tsr: el estado de la petición y, si la concede, el token firmado. Con el archivo y el token, cualquiera puede comprobarlo después.

Dentro del .tsr

Qué hay dentro de un .tsr.

Un .tsr es una estructura ASN.1 codificada en DER. Estos son los campos que importan, con el nombre que les da el estándar.

status
El estado de la petición: concedida o rechazada, entre otros. Va delante del token, y es lo que hace fallar a los validadores que solo esperan un .tst.
messageImprint
El algoritmo (SHA-256) y la huella del archivo. Es el dato que se compara con el archivo que tienes.
genTime
La fecha y la hora que firma la autoridad, en UTC. Es la hora del sello.
serialNumber
El número que la autoridad asigna a ese token, único entre todos los que emite.
policy
El identificador (OID) de la política de sellado bajo la que se emitió.
nonce
El número aleatorio de la petición, devuelto tal cual: demuestra que esa respuesta corresponde a esa petición.
SignedData
El envoltorio CMS: la firma de la autoridad sobre todo lo anterior y, si la petición lo pidió, su certificado. Sellat siempre lo pide.

Un .tst es solo el token, sin el estado. Los dos llevan la misma prueba: cambia el envoltorio, no lo que demuestra.

Cualificado o no

El mismo token, dos niveles legales.

Técnicamente, un token RFC 3161 es igual lo emita quien lo emita: la huella, la hora y la firma se comprueban de la misma manera. Lo que cambia es quién lo firma.

El Reglamento (UE) 910/2014 (eIDAS) llama cualificado al sello de tiempo que cumple su artículo 42: vincula la fecha y la hora a los datos de forma que impide razonablemente modificarlos sin que se detecte, se basa en una fuente de tiempo exacta vinculada al tiempo universal coordinado y lo firma o sella un prestador cualificado de servicios de confianza, que figura como tal en la lista de confianza de un Estado miembro.

A ningún sello de tiempo se le pueden negar efectos jurídicos ni admisibilidad como prueba solo por ser electrónico o por no ser cualificado (art. 41.1). El cualificado goza además de la presunción de exactitud de la fecha y la hora y de integridad de los datos (art. 41.2).

Cómo conseguir un sello de tiempo cualificado emitido por la FNMT-RCM →

Verificar con OpenSSL

Tres comandos, en tu ordenador.

Necesitas el archivo, el .tsr y el certificado de la autoridad que lo firmó (en un paquete de Sellat, autoridad-sellado.pem). Nada sale de tu máquina.

  1. 01

    Lee lo que dice el sello

    openssl ts -reply -in sello.tsr -text

    Muestra el estado y el contenido del token: la política, la huella («Message data»), el número de serie, la hora y el nonce.

  2. 02

    Calcula la huella del archivo

    openssl dgst -sha256 archivo

    Tiene que coincidir con el «Message data» del paso anterior, que OpenSSL muestra en bloques hexadecimales. Si cambia un solo byte del archivo, no coincide.

  3. 03

    Verifica firma y huella a la vez

    openssl ts -verify -in sello.tsr -data archivo -CAfile autoridad-sellado.pem -partial_chain

    Si todo cuadra, responde «Verification: OK».

El certificado de la autoridad es una hoja, no una CA: sin -partial_chain OpenSSL busca a su emisor y falla. Es el motivo más común por el que un validador rechaza un sello correcto. Si lo que tienes es un .tst, añade -token_in a los comandos.

Verificar en el navegador

El validador de sellos de tiempo acepta el .tsr o el .tst junto con el archivo. La huella se calcula en tu dispositivo y solo viajan la huella y el sello. Te dice por separado si se cumplen la estructura, la huella, la firma, el certificado firmante y la lista de confianza de la UE.

Verificar un .tsr

Por API

Cómo obtenerlo por API con Sellat.

Sellat no es una autoridad de sellado: el token RFC 3161 que obtienes a través de Sellat es el sello de tiempo cualificado emitido por la FNMT-RCM. Sellat lo pide sobre la huella que envías, lo verifica contra la lista de confianza de la UE y lo guarda dentro de tu prueba.

  1. 01

    Calcula la huella

    El SHA-256 del archivo, en tu sistema. Es lo único que se envía.

  2. 02

    Crea la prueba con el sello

    POST /api/v2/proofs con "qualified": true, o POST /api/v2/proofs/{id}/qualified sobre una prueba que ya existe. Con Idempotency-Key, un reintento no cuenta dos veces ni sella dos veces.

  3. 03

    Descarga el .tsr

    GET /api/v2/proofs/{id}/qualified.tsr devuelve la respuesta de la autoridad tal cual, en DER, lista para OpenSSL.

curl https://sellat.app/api/v2/proofs \
  -H "Authorization: Bearer $SELLAT_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hash":"<sha256 del archivo>","qualified":true}'

Cada sello descuenta uno de los que tiene tu cuenta: el de bienvenida o uno de tus packs. Si no queda ninguno, la API responde 402 antes de crear nada.

Alcance

Qué demuestra, y qué no.

Qué demuestra

Un token RFC 3161 válido demuestra que esa huella, y por tanto ese archivo exacto, existía como tarde en la hora que firmó la autoridad, y que no ha cambiado desde entonces.

Qué no demuestra

Fija desde cuándo existe el archivo, no desde cuándo existe lo que muestra su contenido. No prueba autoría, ni titularidad, ni veracidad; y la hora vale lo que vale la autoridad que la firma.

Preguntas frecuentes

Antes de que lo preguntes.

¿Timestamp, sello de tiempo y sellado de tiempo son lo mismo?

Sí: son el mismo concepto con tres nombres. En inglés timestamp, en castellano sello de tiempo o sellado de tiempo, y en la norma europea «sello de tiempo electrónico». Lo que cambia entre unos y otros no es el nombre, sino si son cualificados.

¿Qué diferencia hay entre un .tsr y un .tst?

El .tsr es la respuesta completa de la autoridad (TimeStampResp): el estado de la petición más el token. El .tst es solo el token (TimeStampToken, un SignedData CMS). Muchos validadores solo aceptan el .tst; con OpenSSL, un .tst se lee añadiendo -token_in.

¿Por qué OpenSSL dice que no encuentra el emisor del certificado?

Porque el certificado de la autoridad que le pasas con -CAfile es una hoja, no una CA, y OpenSSL intenta construir la cadena hasta una raíz. Con -partial_chain acepta la hoja como punto de confianza y verifica el sello.

¿Me sirve una TSA gratuita?

Para demostrar técnicamente que un archivo existía, sí: un token RFC 3161 es un token RFC 3161. Lo que no obtienes es la presunción legal del artículo 41.2, que solo acompaña a un sello emitido por un prestador cualificado de la lista de confianza de la UE.

¿Qué hora es la que vale?

En el sello, la del campo genTime, que la autoridad firma en UTC. En una prueba de Sellat conviven además la hora del anclaje público: son horas distintas, de capas distintas, y se muestran siempre por separado.

¿Puedo verificar un .tsr que no es de Sellat?

Sí. OpenSSL y el validador de esta web aceptan el .tsr o el .tst de cualquier autoridad. El validador solo lo llama cualificado si la autoridad figura como servicio cualificado en la lista de confianza de la UE.

¿Puedo automatizarlo?

Sí. La API acepta huellas por HTTP y devuelve una prueba por cada una, sin enviar los originales; hay además una herramienta de línea de comandos de código abierto. Es lo que usamos nosotros para sellar logs cada hora.

¿Tienes un .tsr delante?

Compruébalo en el navegador con su archivo. Si lo que quieres es emitirlos desde tu sistema, empieza por la API.

Abrir el validador Emitirlos desde tu sistema: la API →