===== Cómo crear una TSA (sellar, verificar y consultar sellados de tiempo) con OpenSSL =====
La Autoridad de sellado de tiempo (del inglés //Timestamping Authority//, TSA) es un prestador de servicios de certificación que proporciona certeza sobre la preexistencia de determinados documentos electrónicos a un momento dado, cuya indicación temporal junto con el hash del documento se firma por la Autoridad de sellado de tiempo. El sellado de tiempo es uno de los servicios más importantes en relación con la firma electrónica.
* **Sellado de tiempo**: [[http://es.wikipedia.org/wiki/Sellado_de_tiempo]]
* **Sellado de tiempo confiable**: [[http://es.wikipedia.org/wiki/Sellado_de_tiempo_confiable]]
* **OpenSSL TSA**: [[https://www.openssl.org/docs/apps/ts.html]]
De acuerdo al estándar RFC 3161, un sellado de tiempo confiable es un Sellado de tiempo emitido por un Tercero Confiable (TTP por sus siglas en inglés) que actúa como una autoridad de sellado de tiempo (AST). Es usado para demostrar la existencia de alguna información antes de cierta fecha (ej. contratos, información de investigación, registros médicos, etc.) sin la posibilidad de que el dueño pueda cambiar el sellado de tiempo. Múltiples ASTs pueden ser usadas para aumentar la confiabilidad y reducir la vulnerabilidad del sistema.
El nuevo estándar ANSI ASC X9.95 para Sellado de tiempo mejora el estándar RFC 3161 con nuevos requerimientos asociados a la seguridad de la información para asegurar la integridad de los datos contra una fuente confiable de tiempo comprobable ante terceros. Este estándar ha sido aplicado para autentificar información firmada digitalmente para conformidad reguladora, transacciones financieras, y evidencia legal.
NOTA: En esta guía se configurará los certificados con sha512 como algoritmo de firma ya que es el más alto actualmente disponible.
==== Crear la CA de la autoridad de sellado de tiempo (TSA). ====
Crear un directorio de trabajo donde tenerlo todo ordenado.
mkdir $HOME/TSA
Editar la configuración de openssl para indicar el directorio de trabajo. Fichero ///etc/ssl/openssl.cnf//, variable "dir".
[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir = /home/peter/TSA # TSA root directory
# Desactivar estas opciones para respetar el estándar RFC 2459 y usar el formato YYYYMMDDHHMMSSZ
# accuracy = secs:1, millisecs:500, microsecs:100 # (optional)
# clock_precision_digits = 0 # number of digits after dot. (optional)
# Digest de las firmas siempre con sha512 (digest de la firma entregada en la respuesta).
signer_digest = sha512 # Disponible a partir de OpenSSL 1.1.1.
# Aceptar únicamente peticiones con hashes en sha1, sha224, sha256, sha384, sha512.
digests = sha1, sha224, sha256, sha384, sha512
Entrar en la carpeta TSA, crear la llave privada (4096 bits / Firma SHA512) y certificado para la CA.
# /usr/lib/ssl/misc/CA.pl -newcert Por defecto la seguridad es baja (SHA1)
# RSA
openssl req -sha512 -new -x509 -newkey rsa:4096 -keyout cakey.pem -out cacert.pem -days 365
# EC (recomendado)
openssl req -sha512 -new -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout cakey.pem -out cacert.pem -days 365
# Test
openssl x509 -in cacert.pem -text -noout | grep -i sha
Signature Algorithm: sha512WithRSAEncryption
Signature Algorithm: sha512WithRSAEncryptio
NOTA: Por defecto el certificado es válido 365 días.
Generar una clave privada (4096 bits) y un CSR a partir de la misma. Cifrado camellia256 para el ejemplo.
# RSA
openssl genrsa -camellia256 -out tsa.key 4096
# EC (recomendado)
openssl ecparam -name prime256v1 -genkey -noout -out tsa.key
openssl req -sha512 -new -key tsa.key -out tsa.csr -days 3650
Generar un fichero serial con contenido aleatorio.
echo "C1E986160DA8E970" > serial
Creamos un fichero con los parámetros de configuración para la TSA: //tsa.param//
## tsa.param file snippet ##
[tsa_ext]
basicConstraints=CA:FALSE
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
keyUsage = nonRepudiation, digitalSignature
extendedKeyUsage=critical,timeStamping
#### Necesario si se quiere insertar la URL OCSP en el certificado: https://www.busindre.com/crear_servidor_ocsp_para_certificados_ssl
#authorityInfoAccess = @ocsp_section
#[ocsp_section]
#caIssuers;URI.0 = http://www.XXX.com/tsa.crt
#OCSP;URI.0 = http://www.XXX.com:2560
Se firma el certificado que se usará para las tareas TSA (tsa.crt). Ejemplo de 3650 días.
openssl x509 -days 3650 -req -sha512 -in tsa.csr -CAserial serial -CA cacert.pem -CAkey cakey.pem -out tsa.crt -extensions tsa_ext -extfile tsa.param
NOTA: Insertar en el certificado la "OCSP Respuesta URI" no es obligatorio.
==== Sellado de tiempo. ====
Si se va a automatizar el proceso sería interesante liberar a la clave de su passphrase.
# RSA
openssl rsa -in tsa.key -out newtsa.key && cp tsa.key tsa.key.passphrase && mv newtsa.key tsa.key
# EC: Consultar https://www.busindre.com/comandos_openssl_utiles_para_certificados si se cifró la llave privada EC.
Generamos un fichero llamado prueba con el contenido que queramos.
echo hola > prueba
Solicitamos un sellado de tiempo para ese fichero (Fichero solicitud: //prueba.tsq//).
openssl ts -query -data prueba -no_nonce -sha512 -out prueba.tsq
# NOTA: Es recomendable siempre especificar el uso de algoritmos de hash no predeterminados, en este caso sha512.
# Si se desea indicar que en la respuesta (fichero tsr) se proporcione la cadena de certificados, es decir se agreuen los certificados Root CA e intermedios).
openssl ts -query -data prueba -no_nonce -cert -out prueba.tsq
**El sellado de tiempo tiene dos formatos para elegir igual de válidos**:
- Time stamp response (Normalmente tienen extensión .tsr).
- Time stamp token (Normalmente tienen extensión .der).
Sellado TSR. El servidor TSA sella la solicitud devolviendo el sello prueba.tsr.
openssl ts -reply -config /etc/ssl/openssl.cnf -queryfile prueba.tsq -inkey tsa.key -signer tsa.crt -chain cacert.pem -out prueba.tsr
Sellado por token. El servidor TSA sella la solicitud devolviendo el sello prueba.der.
openssl ts -reply -config /etc/ssl/openssl.cnf -queryfile prueba.tsq -inkey tsa.key -signer tsa.crt -out prueba.der -token_out
# NOTA: La opción "-chain XXXX.pem" es optativa, debe contener el certificado raíz y los intermedios (si existen).
# Recordar que no todas las solicitudes (tsq) exigen obtener dicha información, por lo que solo son agregados cuando el cliente lo indique, en el caso de openssl con "-cert".
# Muchas aplicaciones que implementan LTV exigen de dicha información, por lo que se recomienda usarla siempre al generar respuestas tsr.
Trasformar el formato de la respuesta de TSR a Token y viceversa.
#TSR > TOKEN
openssl ts -reply -in prueba.tsr -out prueba.der -token_out
#TOKEN > TSR
openssl ts -reply -in prueba.der -token_in -out prueba.tsr
==== Verificación y consulta de sellados de tiempo. ====
Verificamos el sello (firma) con el certificado de la CA del servidor (varias formas).
# TSR
openssl ts -verify -queryfile prueba.tsq -in prueba.tsr -CAfile cacert.pem -untrusted tsa.crt
Verification: OK
openssl ts -verify -data prueba -in prueba.tsr -CAfile cacert.pem -untrusted tsa.crt
Verification: OK
#Obtenemos el Hash SHA1 del fichero prueba.
sha1sum prueba
80fccdc7ca54c7da1bb6bb95b2e13bddf9f5aeea prueba
openssl ts -verify -digest 80fccdc7ca54c7da1bb6bb95b2e13bddf9f5aeea -in prueba.tsr -CAfile cacert.pem -untrusted tsa.crt
Verification: OK
# Ejemplo de verificación fallida.
Verification: FAILED
139836919719592:error:2F06D064:time stamp routines:TS_VERIFY_CERT:certificate verify error:ts_rsp_verify.c:246:Verify error:unable to get local issuer certificate
Mostrar información sobre la solicitud de sellado.
openssl ts -query -in file.tsq -text
Using configuration from /etc/ssl/openssl.cnf
Version: 1
Hash Algorithm: sha512
Message data:
0000 - 17 77 2e f5 65 61 99 b2-5e 0d 20 65 d8 e8 0d e3 .w..ea..^. e....
0010 - 31 63 0f a8 30 a7 d0 9e-03 3e 47 45 c1 16 f7 b6 1c..0....>GE....
0020 - 5a 58 6a 58 41 86 14 60-6a 5b f7 c7 28 80 63 22 ZXjXA..`j[..(.c"
0030 - c2 32 9c 61 09 ba 9a 44-b6 2b f8 34 ca 55 28 d8 .2.a...D.+.4.U(.
Policy OID: unspecified
Nonce: unspecified
Certificate required: no
Extensions:
Mostrar información sobre el sellado obtenido (TSR y Token). La fecha se muestra en UTC/GMT.
#TSR
openssl ts -reply -in prueba.tsr -text
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified
TST info:
Version: 1
Policy OID: 1.2.3.4.1
Hash Algorithm: sha1
Message data:
0000 - 80 fc cd c7 ca 54 c7 da-1b b6 bb 95 b2 e1 3b dd .....T........;.
0010 - f9 f5 ae ea ....
Serial number: 0x01
Time stamp: Dec 14 01:04:25 2010 GMT
Accuracy: 0x01 seconds, 0x01F4 millis, 0x64 micros
Ordering: yes
Nonce: unspecified
TSA: DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Extensions:
#TOKEN
openssl ts -reply -in prueba.der -token_in -text -token_out
Version: 1
Policy OID: 1.2.3.4.1
Hash Algorithm: sha1
Message data:
0000 - 80 fc cd c7 ca 54 c7 da-1b b6 bb 95 b2 e1 3b dd .....T........;.
0010 - f9 f5 ae ea ....
Serial number: 0x02
Time stamp: Dec 14 01:55:17 2010 GMT
Accuracy: 0x01 seconds, 0x01F4 millis, 0x64 micros
Ordering: yes
Nonce: unspecified
TSA: DirName:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
Extensions:
Se puede usar la opción ASN.1 de openssl para obtener información completa sobre las solicitudes (tsr) y respuestas (tsr/ .der). Al final los ficheros están en formato DER y por tanto pueden ser completamente depurados- Posibilitando de esta manera obtener más información de que la ofrecen los comandos anteriormente vistos.
# El fichero XXX puede ser un fichero tsq o tsr en cualquiera de sus dos formatos.
openssl asn1parse -inform DER -in XXX
**Información sobre el certificado de la TSA**.
openssl x509 -subject -issuer -enddate -noout -in tsa.crt
subject= /C=DE/ST=Bayern/L=Wurzburg/O=Free TSA/OU=TSA/CN=www.dominio.org/emailAddress=usuario@dominio.com
issuer= /C=DE/ST=Bayern/L=W\xC3\x83\xC2\xBCrzburg/O=XXX/OU=TSA/CN=www.dominio.com/emailAddress=usuario@dominio.com
notAfter=Jan 29 03:00:12 2025 GMT
##################
openssl x509 -in tsa.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 13972846748170250611 (0xc1e986160da8e973)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=DE, ST=Bayern, L=W\xC3\x83\xC2\xBCrzburg, O=XXX, OU=TSA, CN=www.dominio.org/emailAddress=usuario@dominio.com
Validity
Not Before: Feb 1 03:00:12 2015 GMT
Not After : Jan 29 03:00:12 2025 GMT
Subject: C=DE, ST=Bayern, L=Wurzburg, O=Free TSA, OU=TSA, CN=www.dominio.org/emailAddress=usuario@dominio.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:aa:39:df:85:37:79:ca:02:7e:98:af:06:d6:d1:
1e:43:19:70:c9:ff:b8:1f:00:01:ea:0b:c4:19:ff:
25:3c:a1:dc:24:91:9b:4d:57:9e:9c:3c:df:60:3d:
b1:d3:b8:db:ec:11:a4:bd:3f:ec:3e:5f:c7:18:7c:
54:b8:61:00:01:8f:a0:4d:42:8b:79:f2:3e:45:3f:
92:14:12:29:06:78:e7:78:3c:db:04:9f:7f:db:eb:
25:cb:58:61:03:f4:b8:cc:4f:2c:79:fd:68:1d:44:
c4:19:b0:16:c6:be:e3:ef:d2:1c:a9:af:f1:97:e0:
58:98:6b:e8:a0:03:0f:80:f8:00:d6:b8:d9:b3:0c:
e2:88:96:58:5a:1b:f8:5b:ef:77:f2:6d:34:cc:86:
16:53:1f:29:f6:d7:d4:17:ff:91:67:07:81:bf:28:
3f:dd:8a:10:30:8b:e2:78:5e:29:06:61:34:2c:79:
f1:6f:d3:4d:0d:56:36:d6:6a:42:70:96:8a:48:06:
53:5e:d5:82:58:2a:33:f4:e6:17:e6:89:06:60:3b:
a7:7c:f5:c6:50:d1:13:fc:da:59:60:06:09:0a:a7:
7d:bb:53:1b:d4:d0:31:42:b6:db:aa:db:3d:4a:08:
da:88:f7:76:30:15:c8:59:a2:8c:da:a4:ae:bc:14:
fe:09:a4:0d:18:b7:8b:63:c0:ac:89:24:50:44:08:
f9:ff:28:92:82:28:72:b4:e8:ee:97:0e:8f:69:2e:
67:16:1a:79:3b:9c:ad:f9:73:32:b1:69:c3:2c:3a:
c1:33:5a:5d:e0:b1:13:42:26:37:11:89:e5:ed:2b:
9a:11:05:2f:b5:d6:3d:f9:6e:92:15:6c:51:37:0b:
3c:c7:2f:99:a9:06:c2:89:8d:ce:cf:29:49:ec:61:
16:78:2c:11:a4:91:24:53:12:fa:8f:34:af:0d:99:
a0:7d:b6:13:5a:43:61:54:66:21:00:91:e7:49:0e:
24:18:b7:a7:a6:79:30:4a:e4:43:14:65:bb:8c:9d:
a9:98:a3:47:e0:55:d1:21:04:bf:7f:b1:9e:b1:34:
1d:94:eb:58:c0:03:ed:98:d7:a9:1f:c4:99:5e:dc:
c3:c7:66:58:05:8e:fd:fb:48:44:52:d0:e6:c5:5f:
84:e2:c8:52:62:67:af:1a:16:0b:4f:56:c1:6e:d5:
74:9e:10:a6:4c:bd:dd:b7:de:ba:0c:fb:7d:76:e0:
f2:26:a8:6e:7c:05:56:4a:0e:23:33:e3:16:9d:e9:
b2:26:b0:ab:fc:05:41:89:dd:2d:43:11:9b:05:05:
81:af:50:12:0e:bc:5f:9b:b5:49:b8:05:c7:3f:f7:
c0:1d:af
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
25:94:7C:5F:26:AA:C8:AC:A9:BA:35:CC:5E:10:50:2C:AD:C3:25:51
X509v3 Authority Key Identifier:
keyid:EC:1D:59:97:4A:5C:5A:D3:43:16:E9:43:9F:36:FB:26:7A:01:B1:BD
X509v3 Key Usage:
Digital Signature, Non Repudiation
X509v3 Extended Key Usage: critical
Time Stamping
Signature Algorithm: sha1WithRSAEncryption
45:5e:c3:16:c5:cb:bb:46:60:05:d0:14:ff:4e:b8:dc:05:8d:
b3:c5:cd:41:48:bd:1f:52:70:ca:76:82:98:29:55:1c:14:96:
bd:8d:86:cb:77:cd:6b:b8:3e:8e:04:5e:fb:94:81:3c:16:10:
a8:6d:7b:37:12:17:44:83:9a:d0:3a:f8:42:19:29:64:8b:52:
ed:06:fa:75:13:ca:4b:6b:8a:e6:d2:1f:09:4f:b7:18:63:7c:
9e:f9:c7:92:5b:b6:7b:35:9b:13:0c:4a:f0:df:ca:1e:bd:68:
5a:4a:a2:13:c0:82:07:e2:ec:78:64:a7:83:6f:1c:c0:43:1a:
7b:10:db:f6:33:03:8e:d8:de:e4:e5:42:ca:40:57:db:a5:a8:
42:f6:71:9c:e8:b1:6e:8d:c5:1d:23:03:70:16:18:cc:3b:ee:
db:06:7b:4b:98:6a:69:ed:3d:47:c9:23:8b:d3:99:c6:72:df:
17:54:a9:a3:0a:8b:61:60:a9:b5:fd:7a:61:9b:8f:ee:70:a1:
a4:ec:34:60:b6:a9:93:a2:6e:39:8b:a1:65:c1:56:d9:a0:c3:
3c:48:f5:eb:6d:37:a7:18:b6:31:9d:4b:84:59:60:dd:03:07:
55:a4:2a:bc:a1:7f:1e:9a:21:7c:07:d1:27:05:31:3a:a2:af:
50:35:80:65
NOTA: Recordar que los certificados tanto PEM como DER usan una estructura ASN.1 y pueden ser consultados también mediante estos comandos.
openssl asn1parse -in certificado.pem # PEM
openssl asn1parse -inform DER -in certificado.der # DER
**Servicio en linea de sellado de tiempo**: [[http://www.freetsa.org|freetsa.org]]