Compartir a través de


Marcas de tiempo de firmas Authenticode

Las firmas de Microsoft Authenticode dan garantías de autoría e integridad para los datos binarios. El uso de marcas de tiempo de Authenticode se basa en las contrafirmas PKCS #7 estándar. Las herramientas de firma de Microsoft permiten a los desarrolladores insertar marcas de tiempo al mismo tiempo que anexan firmas Authenticode. Las marcas de tiempo permiten que las firmas Authenticode sean verificables incluso después de que expiren los certificados usados para firmar.

Breve introducción sobre Authenticode

Authenticode aplica tecnología de firma digital para garantizar la autoría e integridad de los datos binarios, como el software instalable. Un navegador web cliente u otros componentes del sistema pueden usar las firmas Authenticode para comprobar la integridad de los datos cuando se descarga o instala el software. Las firmas Authenticode se pueden usar con muchos formatos de software, como .cab, .exe, .ocx y .dll.

Microsoft mantiene una lista de entidades de certificación públicas (CA). Actualmente, los emisores de certificados Authenticode incluyen SSL.com, Digicert, Sectigo(Comodo) y GlobalSign.

Información sobre la marca de tiempo criptográfica

En el pasado, se han propuesto diversos métodos de marcas de tiempo criptográficas. Consulte, por ejemplo, de Haber y Stornetta, "How to Time-Stamp a Digital Document" ("Cómo añadir marcas de tiempo a un documento digital") en el Journal of Cryptology (1991) y, de Benaloh y de Mare, "One-Way Accumulators: A Decentralized Alternative to Digital Signatures" ("Acumuladores unidireccionales: Una alternativa descentralizada a las firmas digitales") en Springer-Verlag Lecture Notes in Computer Science vol. 765 (EUROCRYPT '93). Hay disponible un resumen extendido de este artículo en Microsoft Research. (Es posible que estos recursos no estén disponibles en algunos idiomas y países o regiones). Dado que el tiempo es físico, en lugar de una cifra matemática, estos métodos suelen centrarse en cómo vincular objetos para que se pueda determinar el orden de creación o cómo agrupar de forma eficaz los objetos que se pueden describir como creados simultáneamente.

Los sistemas que pretenden autenticar el tiempo como cantidad siempre necesitan algún método de confianza. En una configuración muy conflictiva, se pueden usar protocolos complejos para garantizar cierto grado de sincronización. Sin embargo, para estos protocolos se necesita mucha interacción entre las partes afectadas. En la práctica, si solo necesita una certificación de tiempo de una fuente de confianza, esta puede actuar como fedatario facilitando una declaración firmada (certificación) de que el objeto se ha presentado para la firma en el momento indicado.

El método de contrafirma de la marca de tiempo que se implementa a continuación permite comprobar las firmas aun después de que el certificado de firma haya expirado o se haya revocado. La marca de tiempo permite al método de verificación conocer de forma fiable el momento en que se anexó la firma y, por tanto, confiar en la firma si era válida en ese momento. El servicio de marca de tiempo debe tener una fuente del tiempo fiable y protegido.

Documentos firmados y contrafirmas PKCS #7

PKCS #7 es un formato estándar para los datos criptográficos, incluidos los datos firmados, los certificados y las listas de revocación de certificados (CRL). El tipo PKCS #7 concreto de interés en el contexto de las marcas de tiempo son datos firmados, correspondientes al tipo de contenido SignedData definido por PKCS #7.

El paquete PKCS #7 consta de SignedData que identifica el contenido real y cierta información sobre él y los bloques de firma SignerInfo. Un SignerInfo puede incluir una contrafirma, que es de forma recurrente otro SignerInfo. En principio, puede haber una secuencia de estas contrafirmas. La contrafirma es un atributo no autenticado relacionado con la firma en el SignerInfo; es decir, se puede insertar posteriormente a la firma original. En forma de esquema:

SignedData (PKCS #7)

  • Versión (de PKCS #7, generalmente la versión 1)
  • DigestAlgorithms (colección de todos los algoritmos usados por los bloques de firma SignerInfo para un procesamiento optimizado)
  • ContentInfo (el contentType es igual a SignedData, aparte del contenido o la referencia al contenido)
  • OPCIONAL: Certificados (colección de todos los certificados usados)
  • OPCIONAL: CRL (colección de todas las CRL)
  • Bloques de firma SignerInfo (la firma real, compuesta por uno o varios bloques de firma SignerInfo)

SignerInfo (el bloque de firma)

  • Versión (de PKCS #7, generalmente la versión 1)
  • Certificado (emisor y número de serie para identificar de forma única el certificado del firmante en SignedData)
  • El DigestAlgorithm, el DigestEncryptionAlgorithm y el Digest (hash), además del EncryptedDigest (firma real)
  • OPCIONAL: AuthenticatedAttributes (por ejemplo, firmado por este firmante)
  • OPCIONAL: UnauthenticatedAttributes (por ejemplo, no firmado por este firmante)

Un ejemplo de un atributo autenticado es la hora de la firma (OID 1.2.840.113549.1.9.5), ya que forma parte de lo que firma el servicio de marcas de tiempo. Un ejemplo de un atributo no autenticado es la contrafirma (OID 1.2.840.113549.1.9.6), ya que se puede fijar después de la firma. En este caso, el propio SignerInfo contiene un SignerInfo (la contrafirma).

Nota:

El objeto que está firmado en la contrafirma es la firma original (es decir, el EncryptedDigest del SignerInfo original).

 

SignTool y el proceso Authenticode

SignTool está disponible para el sistema de firma Authenticode y los datos binarios de marcas de tiempo. La herramienta se instala en la carpeta \Bin de la ruta de instalación del Kit de desarrollo de software (SDK) de Microsoft Windows.

Las firmas y las marcas de tiempo de los datos binarios son relativamente sencillos si se usa SignTool. El editor debe obtener un certificado de firma de código de una entidad de certificación de firma de código comercial. Para que sea más cómodo, Microsoft publica y actualiza la lista de entidades de certificación públicas, incluidas las que emiten certificados Authenticode. Cuando estén listos para publicarse, los archivos de objeto se firman y se añade la marca de tiempo mediante los parámetros de la línea de comandos correspondientes con la herramienta SignTool. El resultado de cualquier operación de SignTool siempre tiene un SignedData con formato PKCS #7.

SignTool acepta como entrada los datos binarios sin formato que se vayan a firmar y a los que se vaya a asignar una marca de tiempo, o bien los datos binarios firmados previamente a los que se les vaya a insertar una marca de tiempo. A los datos que se han firmado anteriormente se les puede añadir una marca de tiempo mediante el comando signtool timestamp.

Argumento Descripción
/t HTTPAddress Indica que al archivo se le va a asignar una marca de tiempo. URL que indica que se debe dar la dirección de un servidor de marca de tiempo. /t se puede usar con los comandos signtool sign y signtool timestamp.

 

Para obtener más información sobre las herramientas que pueden resultar útiles en este contexto, consulte Herramientas de criptografía y SignTool.

Detalles de implementación y formato de conexión

SignTool se basa en la implementación de Windows Authenticode para crear firmas y añadirles marcas de tiempo. Authenticode funciona con archivos binarios, por ejemplo, .cab, .exe, .dll, o .ocx. Authenticode crea primero la firma, lo que genera un SignedData de PKCS #7. Es este SignedData el que se debe contrafirmar, tal como se describe en PKCS #9.

El proceso de contrafirma se realiza en cuatro pasos:

  1. Copie la firma (es decir, encryptedDigest) del SignerInfo del SignedData basado en PKCS #7.
  2. Cree una solicitud de marca de tiempo cuyo contenido sea la firma original. Envíe esto al servidor de marca de tiempo con codificación Abstract Syntax Notation One (ASN.1) como un TimeStampRequest.
  3. Reciba la marca de tiempo, con el formato SignedData basado en PKCS #7 y devuelto del servidor de marca de tiempo.
  4. Copie el SignerInfo de la marca de tiempo directamente en el SignedData original basado en PKCS #7, a modo de contrafirma PKCS #9 (es decir, un atributo no autenticado en el SignerInfo del original).

Solicitud de marca de tiempo

La solicitud de marca de tiempo se envía dentro de un mensaje POST de HTTP 1.1. En el encabezado HTTP, la directiva CacheControl pasa a sin caché y la directiva Content-Type pasa a application/octet-stream. El cuerpo del mensaje HTTP es una codificación con formato base64 de codificación basada en las reglas de codificación distinguida (DER) de la solicitud de marca de tiempo.

Aunque no se usa actualmente, la directiva Content-Length también debe usarse para crear el mensaje HTTP, puesto que ayuda al servidor de marca de tiempo a localizar dónde se encuentra la solicitud dentro de POST de HTTP.

También puede haber otros encabezados HTTP y deben omitirse si el solicitante o el servidor de marca de tiempo no los entiende.

La solicitud de marca de tiempo es un mensaje codificado en ASN.1. El formato de la solicitud es el siguiente.

TimeStampRequest ::= SEQUENCE {
   countersignatureType OBJECT IDENTIFIER,
   attributes Attributes OPTIONAL, 
   content  ContentInfo
}

El countersignatureType es el identificador de objeto (OID) que lo identifica como una contrafirma de marca de tiempo y debe ser el OID exacto 1.3.6.1.4.1.311.3.2.1.

Actualmente no se incluye ningún atributo en la solicitud de marca de tiempo.

El contenido es un ContentInfo definido por PKCS #7. El contenido se corresponde con los datos que se van a firmar. Para añadir la marca de tiempo a la firma, el ContentType debe ser Data y el contenido debe ser encryptedDigest (firma) en el SignerInfo del contenido definido por PKCS #7 al que se va a añadir la marca de tiempo.

Respuesta de marca de tiempo

La respuesta de marca de tiempo también se envía dentro de un mensaje HTTP 1.1. En el encabezado HTTP, la directiva Content-Type también pasa a application/octet-stream. El cuerpo del mensaje HTTP es una codificación con formato base64 basada en DER de la respuesta de marca de tiempo.

La respuesta de marca de tiempo es un mensaje firmado de PKCS #7 firmado por el servicio de marca de tiempo. El ContentInfo del mensaje PKCS #7 es idéntico al ContentInfo recibido en la marca de tiempo. El contenido PKCS #7 incluye el atributo autenticado de la hora de la firma (definido en PKCS #99, OID 1.2.840.113549.9.5).

Después de que Authenticode reciba la marca de tiempo del servidor, Authenticode insertará la marca de tiempo en el SignedData basado en PKCS #7 original como contrafirma. Para ello, se descartará el ContentInfo del SignedData de PKCS #7 devuelto y el SignerInfo de la marca de tiempo devuelto se copiará como contrafirma en el SignerInfo del SignedData basado en PKCS #7 original. La cadena de certificados del servicio de marca de tiempo también se copia en Certificados en el SignedData original basado en PKCS #7 como un atributo no autenticado del firmante original.