Timestamp delle firme Authenticode

Le firme Microsoft Authenticode offrono garanzie di autorizzazione e integrità per i dati binari. Il timestamp Authenticode è basato su controfirmhe PKCS #7 standard. Gli strumenti di firma di Microsoft consentono agli sviluppatori di affiggere i timestamp contemporaneamente all'affissione delle firme Authenticode. Il timestamp consente di verificare le firme Authenticode anche dopo la scadenza dei certificati usati per la firma.

Breve introduzione a Authenticode

Authenticode applica la tecnologia di firma digitale per garantire l'autorizzazione e l'integrità dei dati binari, ad esempio il software installabile. Un Web browser client o altri componenti di sistema può usare le firme Authenticode per verificare l'integrità dei dati quando il software viene scaricato o installato. Le firme Authenticode possono essere usate con molti formati software, tra cui .cab, .exe, .ocx e .dll.

Microsoft gestisce un elenco di autorità di certificazione pubbliche. Le autorità emittenti di certificati Authenticode includono attualmente SSL.com, Digicert, Sectigo(Comodo)e GlobalSign.

Informazioni sul timestamp crittografico

In passato sono stati proposti diversi metodi di timestamp crittografici. Vedere, ad esempio, Haber e Stornetta "How to Time-Stamp a Digital Document" nel Journal of Cryptologia (1991) e Benaloh e de Mare "One-WayCentrals: A Decented Alternative to Digital Signatures" in Springer-Verlag Lecture Notes in Computer Science vol. 765 (EUROCRYPT '93). Un'astrazione estesa di questo articolo è disponibile in Microsoft Research. Queste risorse potrebbero non essere disponibili in alcune lingue e paesi o aree geografiche. Poiché il tempo è fisico, anziché matematico, quantità, questi metodi riguardano in genere come collegare gli oggetti in modo che l'ordine di creazione possa essere determinato o come raggruppare in modo efficiente gli oggetti che possono essere tutti descritti come creati contemporaneamente.

I sistemi che richiedono l'autenticazione del tempo come quantità richiedono sempre una qualche forma di attendibilità. In un'impostazione fortemente antagonista, è possibile usare protocolli complessi per garantire un certo grado di sincronizzazione. Tuttavia, questi protocolli richiedono un'interazione estesa tra le parti interessate. In pratica, se è necessaria una sola certificazione di tempo da un'origine attendibile, l'origine può semplicemente fungere da notario fornendo un'istruzione firmata (certificazione) che l'oggetto è stato presentato per la firma al momento indicato.

Il metodo di controfirma dell'timestamp implementato di seguito consente la verifica delle firme anche dopo la scadenza o la revoca del certificato di firma. Il timestamp consente al verificatore di conoscere in modo affidabile l'ora in cui la firma è stata affissa e quindi considerare attendibile la firma se è valida in quel momento. Il timestamper deve avere un'origine ora affidabile e protetta.

Documenti e controfirmi firmati PKCS #7

PKCS #7 è un formato standard per i dati crittografici, inclusi i dati firmati, i certificati e gli elenchi di revoche di certificati (CRL). Il particolare tipo di interesse PKCS #7 nel contesto del timestamp è costituito da dati firmati, corrispondenti al tipo di contenuto SignedData definito PKCS #7.

Il pacchetto PKCS #7 è costituito da SignedData che identifica il contenuto effettivo e alcune informazioni su di esso e blocchi di firma SignerInfo. Un elemento SignerInfo può contenere una controfirma, che in modo ricorsivo è un altro SignerInfo. In linea di principio, può essere presente una sequenza di tali controfirmhe. La controfirma è un attributo non autenticato rispetto alla firma in SignerInfo; vale a dire, potrebbe essere affissa successiva alla firma originale. In formato struttura:

SignedData (PKCS #7)

  • Versione (di PKCS #7, in genere versione 1)
  • DigestAlgorithms (raccolta di tutti gli algoritmi usati dai blocchi di firma SignerInfo, per l'elaborazione ottimizzata)
  • ContentInfo (contentType è uguale a SignedData, più contenuto o riferimento al contenuto)
  • CERTIFICATI FACOLTATIVI (raccolta di tutti i certificati usati)
  • CRL FACOLTATIVI (raccolta di tutti i CRL)
  • Blocchi di firma SignerInfo (la firma effettiva, composta da uno o più blocchi di firma SignerInfo)

SignerInfo (blocco di firma)

  • Versione (di PKCS #7, in genere versione 1)
  • Certificato (emittente e numero di serie per identificare in modo univoco il certificato del firmatario in SignedData)
  • DigestAlgorithm più DigestEncryptionAlgorithm più digest (hash), oltre a EncryptedDigest (firma effettiva)
  • OPTIONAL AuthenticatedAttributes (ad esempio, firmato da questo firmatario)
  • OPTIONAL UnauthenticatedAttributes (ad esempio, non firmato da questo firmatario)

Un esempio di attributo autenticato è l'ora di firma (OID 1.2.840.113549.1.9.5) perché fa parte dei segni del servizio timestamp. Un esempio di attributo non autenticato è la controfirma (OID 1.2.840.113549.1.9.6) perché può essere affissa dopo la firma. In questo caso, SignerInfo contiene un elemento SignerInfo (countersignature).

Nota

L'oggetto firmato nella controfirma è la firma originale, ovvero EncryptedDigest dell'oggetto SignerInfo originale.

 

SignTool e il processo Authenticode

SignTool è disponibile per la firma Authenticode e il timestamp dei dati binari. Lo strumento viene installato nella cartella \Bin del percorso di installazione di Microsoft Windows Software Development Kit (SDK).

La firma e il timestamp dei dati binari sono relativamente semplici tramite SignTool. L'editore deve ottenere un certificato di firma del codice da una CA di firma del codice commerciale. Per praticità, Microsoft pubblica e aggiorna un elenco di ca pubbliche, incluse quelle che rilasciano certificati Authenticode. Quando si è pronti per la pubblicazione, i file oggetto vengono firmati e contrassegnati con il timestamp usando i parametri della riga di comando appropriati con lo strumento SignTool. Il risultato di qualsiasi operazione SignTool è sempre un formato PKCS #7 SignedData.

SignTool accetta come input dati binari non elaborati da firmare e timestamp o dati binari firmati in precedenza per essere contrassegnati come timestamp. I dati firmati in precedenza possono essere contrassegnati come timestamp usando il comando signtool timestamp .

Argomento Descrizione
/t HTTPAddress Indica che il file deve essere contrassegnato come timestamp. È necessario specificare un URL che specifica un indirizzo di un server di timestamp. /t può essere usato sia con i comandi signtool signtool che signtool timestamp .

 

Per altre informazioni sugli strumenti che possono essere utili in questo contesto, vedere Strumenti di crittografia e SignTool.

Dettagli implementazione e formato wire

SignTool si basa sull'implementazione di Windows Authenticode per creare firme timestamp e . Authenticode opera su file binari, ad esempio .cab, .exe, .dll o .ocx. Authenticode crea prima di tutto la firma, producendo un pkCS #7 SignedData. Si tratta di signedData che deve essere controfirmato, come descritto in PKCS #9.

Il processo di controfirma avviene in quattro passaggi:

  1. Copiare la firma (ovvero encryptedDigest) da SignerInfo di PKCS #7 SignedData.
  2. Costruire una richiesta timestamp il cui contenuto è la firma originale. Invia questo valore al server timestamp Abstract Syntax Notation One (ASN.1) codificato come TimeStampRequest.
  3. Ricevere un timestamp, formattato come secondo PKCS #7 SignedData, restituito dal server timestamp.
  4. Copiare SignerInfo dal timestamp direttamente nell'elemento PKCS #7 SignedData originale, come controfirma PKCS #9, ovvero un attributo non autenticato nell'elemento SignerInfo dell'originale.

Richiesta timestamp

La richiesta timestamp viene inviata all'interno di un messaggio POST HTTP 1.1. Nell'intestazione HTTP la direttiva CacheControl è impostata su no-cache e la direttiva Content-Type è impostata su application/octet-stream. Il corpo del messaggio HTTP è una codifica base64 della codifica DER (Distinguished Encoding Rules ) della richiesta timestamp.

Sebbene non sia attualmente utilizzata, la direttiva Content-Length deve essere usata anche per costruire il messaggio HTTP perché consente al server timestamp di individuare dove si trova la richiesta all'interno di HTTP POST.

Anche altre intestazioni HTTP possono essere presenti e devono essere ignorate se non vengono riconosciute dal richiedente o dal server timestamp.

La richiesta timestamp è un messaggio con codifica ASN.1. Il formato della richiesta è il seguente.

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

CountersignatureType è l'identificatore dell'oggetto (OID) che lo identifica come controfirma timestamp e deve essere l'OID esatto 1.3.6.1.4.1.311.3.2.1.

Nella richiesta timestamp non sono attualmente inclusi attributi.

Il contenuto è contentInfo come definito da PKCS #7. Il contenuto è i dati da firmare. Per il timestamp della firma, ContentType deve essere Data e il contenuto deve essere crittografatoDigest (firma) dal SignerInfo del contenuto PKCS #7 per essere contrassegnato come timestamp.

Risposta timestamp

La risposta timestamp viene inviata anche all'interno di un messaggio HTTP 1.1. Nell'intestazione HTTP la direttiva Content-Type è impostata anche su application/octet-stream. Il corpo del messaggio HTTP è una codifica base64 della codifica DER della risposta timestamp.

La risposta timestamp è un messaggio firmato PKCS #7 firmato dal timestamper. ContentInfo del messaggio PKCS #7 è identico a ContentInfo ricevuto nel timestamp. Il contenuto PKCS #7 contiene l'attributo autenticato dell'ora di firma (definito in PKCS #99, OID 1.2.840.113549.9.5).

Dopo che Authenticode riceve il timestamp dal server, Authenticode incorpora il timestamp nell'originale PKCS #7 SignedData come controfirma. A tale scopo, l'elemento ContentInfo dell'elemento PKCS #7 SignedData restituito viene rimosso e SignerInfo del timestamp restituito viene copiato come controfirma nell'elemento SignerInfo dell'oggetto SignedData PKCS #7 originale. La catena di certificati del timestamper viene copiata anche in Certificati nell'originale PKCS #7 SignedData come attributo non autenticato del firmatario originale.