# Instructivo de verificación de firmas

> Guía para obtener la evidencia probatoria y verificar firmas emitidas por Signatura con OpenSSL y OpenTimestamps.

Fuente: https://help.signatura.co/articulos/empezar/instructivo-verificacion-firmas

Este instructivo explica cómo verificar una firma emitida por Signatura.

La verificación completa tiene dos etapas:

- Obtener los archivos necesarios para verificar.
- Ejecutar el proceso de verificación, que es común para cualquier forma de obtención.

**Importante:**

- La firma es _detached_: el archivo `.sig` está separado del documento.
- El sello de tiempo OpenTimestamps se aplica sobre el archivo `.sig`.
- Por lo tanto, el archivo `.ots` siempre debe verificarse contra la firma `.sig`, no contra el PDF.

## 1. Archivos necesarios para la verificación

Para verificar una firma de Signatura hacen falta estos elementos:

- El documento firmado, por ejemplo `documento.pdf`.
- El certificado X.509 del firmante, por ejemplo `firmante.cer`.
- La firma detached en binario, por ejemplo `firmante.sig`.
- La prueba OpenTimestamps de esa firma, por ejemplo `firmante.sig.ots`.

## 2. Cómo obtener los archivos necesarios

Existen tres formas de obtener la información probatoria necesaria para realizar la verificación.

## 3. Opción A: partiendo del archivo .zip

Si el cliente descargó el `.zip`, ya dispone de todos los archivos necesarios en formato correcto.

### 3.1. Extraer el contenido

Descomprimir el `.zip`. Dentro encontrará normalmente:

- El documento firmado.
- El certificado de auditoría en PDF.
- El certificado del firmante en `.cer`.
- La firma detached en `.sig`.
- La prueba de sello de tiempo en `.sig.ots`.

Con esos archivos ya puede pasar directamente a la sección 6.

## 4. Opción B: partiendo del certificado de auditoría

Si se dispone del documento firmado y del certificado de auditoría PDF, también es posible obtener toda la información necesaria para verificar la firma.

El certificado de auditoría incluye:

- El certificado X.509 del firmante.
- La firma detached en Base64.
- La prueba OpenTimestamps en Base64.

### 4.1. Certificado del firmante

En el PDF buscar el bloque:

```text
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
```

Copiarlo completo, incluyendo las líneas `BEGIN CERTIFICATE` y `END CERTIFICATE`, y guardarlo en un archivo llamado por ejemplo:

```text
firmante.cer
```

o bien:

```text
firmante.pem
```

OpenSSL puede trabajar con cualquiera de las dos extensiones si el contenido PEM es correcto.

### 4.2. Firma detached

En el PDF, inmediatamente después del certificado, aparece la firma digital en Base64.

Copiar únicamente el bloque Base64 de la firma, sin agregar espacios ni texto adicional, y guardarlo en un archivo de texto, por ejemplo:

```text
firma.b64
```

Convertirlo a binario:

Con OpenSSL:

```bash
openssl base64 -d -in firma.b64 -out firmante.sig
```

En Windows, también puede usarse:

```powershell
certutil -decode firma.b64 firmante.sig
```

### 4.3. Prueba OpenTimestamps

En el PDF, después de la firma en Base64, aparece la prueba OpenTimestamps en Base64.

Copiar ese bloque y guardarlo en:

```text
ots.b64
```

Convertirlo a binario:

Con OpenSSL:

```bash
openssl base64 -d -in ots.b64 -out firmante.sig.ots
```

En Windows:

```powershell
certutil -decode ots.b64 firmante.sig.ots
```

### 4.4. Resultado esperado

Al finalizar, deberían quedar:

- `documento.pdf`
- `firmante.cer` o `firmante.pem`
- `firmante.sig`
- `firmante.sig.ots`

Con esos archivos ya puede pasar a la sección 6.

## 5. Opción C: partiendo del enlace incluido en el documento

Los documentos firmados por Signatura incluyen un sello visible que indica que el documento fue firmado electrónicamente e incluye un enlace para descargar la información probatoria necesaria para realizar la verificación.

Al ingresar a ese enlace, es posible descargar directamente:

- el certificado X.509 del firmante
- la firma detached `.sig`
- la prueba OpenTimestamps `.ots`

Si se obtienen esos tres archivos desde el enlace del sello, la verificación continúa exactamente igual que en la opción del `.zip`.

Con esos archivos ya puede pasar a la sección 6.

## 6. Proceso de verificación común

Una vez obtenidos el documento, el certificado del firmante, la firma `.sig` y la prueba `.ots`, el proceso de verificación es siempre el mismo.

## 7. Verificación de la firma digital con OpenSSL

### 7.1. Requisito

Tener OpenSSL instalado.

Para comprobarlo:

```bash
openssl version
```

### 7.2. Verificar que el certificado del firmante fue emitido por Signatura

Antes de verificar la firma, conviene validar que el certificado del firmante encadena contra la Autoridad Certificante de Signatura.

Descargar el certificado CA oficial de Signatura:

- https://connect.signatura.co/ca/38065903965830328989524504126861906224/CA.pem

Guardarlo por ejemplo como:

```text
CA.pem
```

Luego verificar el certificado del firmante:

```bash
openssl verify -CAfile CA.pem -attime <timestamp> firmante.cer
```

Donde `<timestamp>` es el timestamp Unix correspondiente a la fecha de firma (puede obtenerse del sello OpenTimestamps o del certificado de auditoría). Esto es necesario cuando se realiza una pericia tiempo después de la firma, ya que el certificado del firmante puede haber expirado. El flag `-attime` indica a OpenSSL que evalúe la validez del certificado al momento de la firma, no al momento actual.

Resultado esperado:

```text
firmante.cer: OK
```

Si el resultado es `OK`, significa que el certificado del firmante fue emitido por la CA de Signatura contenida en `CA.pem`.

### 7.3. Extraer la clave pública desde el certificado

```bash
openssl x509 -in firmante.cer -pubkey -noout -out pubkey.pem
```

Esto genera el archivo `pubkey.pem`, que se utilizará para verificar la firma.

### 7.4. Verificar la firma detached

```bash
openssl dgst -sha256 -verify pubkey.pem -keyform PEM -signature firmante.sig documento.pdf
```

Resultado esperado:

```text
Verified OK
```

Si aparece `Verified OK`, significa que:

- La firma `firmante.sig` corresponde al archivo `documento.pdf`.
- La firma fue generada con la clave privada asociada al certificado `firmante.cer`.

Si el resultado no es exitoso, revisar:

- Que el documento sea exactamente el mismo que fue firmado.
- Que la firma `.sig` corresponda a ese documento.
- Que el certificado `.cer` corresponda a esa firma.
- Que no haya cambios de extensión, renombre o conversión de archivos durante la descarga o copia.

## 8. Verificación del sello de tiempo OpenTimestamps por web

Esta verificación debe hacerse sobre la firma detached y su prueba `.ots`.

No debe hacerse sobre el PDF.

### 8.1. Archivos a utilizar

- `firmante.sig`
- `firmante.sig.ots`

### 8.2. Concepto clave

OpenTimestamps no sella el documento PDF directamente. En Signatura, lo que se sella es el binario de la firma detached, es decir, el archivo `.sig`.

Por eso, para verificar el sello de tiempo:

- el archivo principal es `firmante.sig`
- la prueba asociada es `firmante.sig.ots`

### 8.3. Verificación web

Ingresar al sitio oficial:

- https://opentimestamps.org/

Luego:

- Seleccionar la opción de verificación del timestamp.
- Cargar el archivo `firmante.sig`.
- Cargar el archivo `firmante.sig.ots`.
- Ejecutar la verificación.

La validación correcta demostrará que:

- el archivo `.sig` existía al momento acreditado por OpenTimestamps
- esa prueba quedó anclada en Bitcoin

## 9. Verificación del sello de tiempo con línea de comandos

### 9.1. Instalación

Una forma habitual de instalar el cliente es con `pip`:

```bash
pip install opentimestamps-client
```

Luego verificar que el comando esté disponible:

```bash
ots --help
```

### 9.2. Verificar el sello de tiempo contra la firma

```bash
ots verify -f firmante.sig firmante.sig.ots
```

Si la prueba ya está completa y el entorno tiene acceso a la verificación de Bitcoin, el comando devolverá la fecha o la confirmación correspondiente.

Si se desea esperar una verificación completa:

```bash
ots -w verify -f firmante.sig firmante.sig.ots
```

### 9.3. Nota técnica

Según la configuración del entorno, `ots` puede intentar verificar contra un nodo Bitcoin local. Si no existe uno configurado, igualmente se puede inspeccionar la prueba:

```bash
ots info firmante.sig.ots
```

Y, si se desea una comprobación sin usar Bitcoin en forma automática:

```bash
ots --no-bitcoin verify -f firmante.sig firmante.sig.ots
```

En ese caso, la herramienta indicará el bloque y el merkle root que deberían verificarse manualmente.

## 10. Recomendaciones prácticas

- Copiar los bloques Base64 exactamente como aparecen, sin encabezados adicionales, numeración ni texto descriptivo.
- Verificar que no se inserten espacios al inicio o al final.
- No abrir ni guardar la firma `.sig` con editores que modifiquen el contenido binario.
- No intentar verificar el `.ots` contra el PDF: siempre debe verificarse contra la firma `.sig`.

## 11. Ejemplo resumido

Una vez obtenidos los archivos necesarios por cualquiera de las tres vías, la secuencia técnica de verificación es:

```bash
openssl verify -CAfile CA.pem -attime <timestamp> firmante.cer
openssl x509 -in firmante.cer -pubkey -noout -out pubkey.pem
openssl dgst -sha256 -verify pubkey.pem -keyform PEM -signature firmante.sig documento.pdf
ots verify -f firmante.sig firmante.sig.ots
```

## 12. Conclusión

Una verificación completa en Signatura consiste en comprobar tres cosas:

- Que el certificado del firmante fue emitido por la CA de Signatura.
- Que la firma detached corresponde exactamente al documento y al certificado del firmante.
- Que esa firma detached fue sellada temporalmente con OpenTimestamps.

Esto permite demostrar tanto la integridad criptográfica del documento firmado como la existencia comprobable en el tiempo de la firma generada.
