Table of Contents
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: freetsa.org