Compartir a través de


Firmas authenticode de marca de tiempo

Las firmas de Microsoft Authenticode proporcionan garantías de autoría e integridad para los datos binarios. La marca de tiempo authenticode se basa en contrafirmas PKCS #7 estándar. Las herramientas de firma de Microsoft permiten a los desarrolladores fijar marcas de tiempo al mismo tiempo que se agregan firmas Authenticode. La marca de tiempo permite que las firmas Authenticode sean verificables incluso después de que los certificados usados para la firma hayan expirado.

Una breve introducción a Authenticode

Authenticode aplica tecnología de firma digital para garantizar la autoría e integridad de los datos binarios, como el software instalable. Un explorador web cliente, u otros componentes del sistema, puede 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, incluidos .cab, .exe, .ocx y .dll.

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

Acerca de la marca de tiempo criptográfica

En el pasado, se han propuesto una variedad de métodos de marca de tiempo criptográficos. Véase, por ejemplo, Haber y Stornetta "Cómo Time-Stamp un documento digital" en el Journal of Cryptology (1991) y Benaloh y de Mare "Acumuladores unidireccionales: Una alternativa descentralizada a 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 cantidad matemática, estos métodos suelen preocuparse por cómo vincular objetos para que su orden de creación se pueda determinar 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 requieren alguna forma de confianza. En una configuración fuertemente adversario, se pueden usar protocolos complejos para garantizar cierto grado de sincronización. Sin embargo, estos protocolos requieren una interacción extensa entre las partes afectadas. En la práctica, si solo necesita una certificación de tiempo de una fuente de confianza, el origen puede simplemente actuar como notario proporcionando una declaración firmada (certificación) que el objeto se presentó para la firma en el momento indicado.

El método de contrafirma de la marca de tiempo implementado a continuación permite comprobar las firmas incluso después de que el certificado de firma haya expirado o revocado. La marca de tiempo permite al comprobador conocer de forma confiable el momento en que se afijo la firma y, por tanto, confiar en la firma si era válida en ese momento. El marcador de tiempo debe tener un origen de tiempo confiable y protegido.

PKCS #7 Documentos firmados y contrafirmas

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 la marca de tiempo es 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 bloques de firma SignerInfo. Un SignerInfo puede contener una contrafirma, que de forma recursiva es otra SignerInfo. En principio, puede haber una secuencia de tales contrafirmas. La contrafirma es un atributo no autenticado con respecto a la firma en SignerInfo; es decir, se puede agregar después de la firma original. En forma de esquema:

SignedData (PKCS #7)

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

SignerInfo (bloque de firma)

  • Versión (de PKCS n.º 7, generalmente versión 1)
  • Certificado (emisor y número de serie para identificar de forma única el certificado del firmante en SignedData)
  • DigestAlgorithm más DigestEncryptionAlgorithm más el digest (hash), más EncryptedDigest (firma real)
  • OPTIONAL 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 firma (OID 1.2.840.113549.1.9.5) porque forma parte de lo que firma el servicio de marca de tiempo. Un ejemplo de un atributo no autenticado es la contrafirma (OID 1.2.840.113549.1.9.6) porque se puede agregar después de la firma. En este caso, el propio SignerInfo contiene un SignerInfo (countersignature).

Nota

El objeto que está firmado en la contrafirma es la firma original (es decir, encryptedDigest del signerInfo original).

 

SignTool y el proceso Authenticode

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

La firma y la marca de tiempo de los datos binarios son relativamente sencillas mediante SignTool. El publicador debe obtener un certificado de firma de código de una ENTIDAD de certificación de firma de código comercial. Para mayor comodidad, Microsoft publica y actualiza una lista de entidades de certificación públicas, incluidas las que emiten certificados Authenticode. Cuando esté listo para publicarse, los archivos de objeto se firman y se marcan la hora mediante los parámetros de línea de comandos adecuados con la herramienta SignTool. El resultado de cualquier operación de SignTool siempre es un formato PKCS #7 SignedData.

SignTool acepta como entrada datos binarios sin formato que se van a firmar y marcar la hora, o bien los datos binarios firmados previamente para ser marcados de tiempo. Los datos que se han firmado anteriormente pueden marcarse de tiempo mediante el comando signtool timestamp .

Argumento Descripción
/tHTTPAddress Indica que el archivo debe marcarse de tiempo. Se debe proporcionar una dirección URL que especifique una 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 ser útiles en este contexto, vea Cryptography Tools and SignTool.

Detalles de implementación y formato de conexión

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

El proceso de contrafirma tiene lugar en cuatro pasos:

  1. Copie la firma (es decir, encryptedDigest) de SignerInfo del PKCS #7 SignedData.
  2. Construya una solicitud de marca de tiempo cuyo contenido sea la firma original. Envíe esto al servidor de marca de tiempo Notación abstracta de sintaxis uno (ASN.1) codificado como TimeStampRequest.
  3. Reciba una marca de tiempo, con el formato PKCS #7 SignedData, devuelto desde el servidor de marca de tiempo.
  4. Copie SignerInfo de la marca de tiempo directamente en el PKCS #7 SignedData original, como contrafirma PKCS #9 (es decir, un atributo no autenticado en signerInfo del original).

Solicitud de marca de tiempo

La solicitud de marca de tiempo se envía dentro de un mensaje POST HTTP 1.1. En el encabezado HTTP, la directiva CacheControl se establece en sin caché y la directiva Content-Type se establece en application/octet-stream. El cuerpo del mensaje HTTP es una codificación base64 de codificación de 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 construir el mensaje HTTP porque ayuda al servidor de marca de tiempo a localizar dónde se encuentra la solicitud dentro de HTTP POST.

Otros encabezados HTTP también pueden estar presentes y deben omitirse si el solicitante o el servidor de marca de tiempo no los entienden.

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

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

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 incluyen atributos en la solicitud de marca de tiempo.

El contenido es un ContentInfo definido por PKCS #7. El contenido es los datos que se van a firmar. Para la marca de tiempo de firma, ContentType debe ser Data y el contenido debe ser encryptedDigest (signerInfo) del contenido PKCS #7 que se marcará 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 se establece en application/octet-stream. El cuerpo del mensaje HTTP es una codificación base64 de la codificación DER de la respuesta de la marca de tiempo.

La respuesta de la marca de tiempo es un mensaje firmado PKCS #7 firmado por el marcador de tiempo. ContentInfo del mensaje PKCS #7 es idéntico al contentInfo recibido en la marca de tiempo. El contenido de PKCS #7 contiene el atributo autenticado de hora de 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 incorpora la marca de tiempo en el PKCS #7 SignedData original como contrafirma. Para ello, se descarta ContentInfo del PKCS #7 SignedData devuelto y signerInfo de la marca de tiempo devuelta se copia como contrafirma en signerInfo del PKCS #7 SignedData original. La cadena de certificados del stamper de tiempo también se copia en Certificados en el PKCS #7 SignedData original como un atributo no autenticado del firmante original.