Marcatura temporale delle firme Authenticode

Le firme Microsoft Authenticode offrono garanzie di autorizzazione e integrità per i dati binari. La marcatura temporale Authenticode si basa sulle controfirme standard PKCS #7. 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.

Importante

Apponi sempre una marca temporale alle firme Authenticode. Senza un timestamp, la firma diventa non valida alla scadenza del certificato di firma e Windows considererà il file binario come non firmato. Il timestamp garantisce la validità della firma a lungo termine.

Raccomandazioni per l'algoritmo di firma

Quando si firma il codice con Authenticode, usare le procedure consigliate seguenti:

Impostazione Raccomandazione
Algoritmo di digest SHA-256 (/fd SHA256). Le firme SHA-1 sono deprecate e non attendibili dalle versioni Windows moderne per la firma del codice.
Protocollo di marca temporale RFC 3161 (/tr flag con /td SHA256). I timestamp RFC 3161 usano un protocollo standard con un digest SHA-256, offrendo garanzie più avanzate rispetto al protocollo timestamp Authenticode legacy (/t).
Doppia firma Se è necessario supportare Windows versioni che non possono convalidare le firme SHA-256 (Windows Vista e versioni precedenti senza aggiornamenti), considerare i file binari con doppia firma con SHA-1 e SHA-256. Per le destinazioni che eseguono Windows 7 SP1 o versione successiva, la firma solo SHA-256 è sufficiente.

Comando di esempio signtool :

signtool sign /fd SHA256 /tr https://timestamp.example.com /td SHA256 /a MyApp.exe

Avvertimento

Non usare SHA-1 come unico algoritmo di firma per le nuove versioni. SHA-1 è crittograficamente compromesso e Windows 10 e versioni successive considerano progressivamente SHA-1 non attendibile per la firma del codice. Usare sempre SHA-256 o più forte per le nuove firme. Si noti che i timestamp SHA-1 esistenti datati prima del 2016 potrebbero essere ancora rispettati per scenari specifici; per informazioni dettagliate, vedere Windows Applicazione dei certificati SHA1.

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. Si veda, ad esempio, Haber e Stornetta, "How to Time-Stamp a Digital Document" nel Journal of Cryptology (1991) e Benaloh e de Mare, "One-Way Accumulators: A Decentralized Alternative to Digital Signatures" negli 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 serve soltanto una certificazione temporale da una fonte attendibile, la fonte può semplicemente fungere da notaio fornendo una dichiarazione firmata (certificazione) che l'oggetto è stato presentato per essere firmato nel 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 marcatore temporale deve disporre di una fonte temporale 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 PKCS #7 di interesse nel contesto della marcatura temporale è quello dei dati firmati, corrispondente al tipo di contenuto SignedData definito in 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 SignerInfo può contenere una controfirma, che a sua volta è, ricorsivamente, 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 forma schematica:

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 è pari a SignedData, più il contenuto o un 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ù il digest (hash), oltre a EncryptedDigest (firma vera e propria)
  • OPZIONALE Attributi autenticati (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, lo stesso SignerInfo contiene un elemento SignerInfo (la controfirma).

Nota

L'oggetto firmato nella controfirma è la firma originale (cioè l'EncryptedDigest del 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 in input dati binari grezzi da firmare e a cui apporre una marca temporale, oppure dati binari precedentemente firmati a cui apporre una marca temporale. I dati firmati in precedenza possono essere contrassegnati come timestamp usando il comando signtool timestamp .

Argomento Descrizione
/tHTTPAddress Indica che al file deve essere applicata una marcatura temporale. È necessario specificare un URL che specifica un indirizzo di un server di timestamp. /t può essere usato con entrambi i comandi signtool sign e signtool timestamp.

 

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

Dettagli dell'implementazione e formato di trasmissione

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

Il processo di controfirma avviene in quattro passaggi:

  1. Copiare la firma (ovvero, encryptedDigest) dal SignerInfo del PKCS #7 SignedData.
  2. Creare una richiesta di marca temporale il cui contenuto sia la firma originale. Invia questo al server di marcatura temporale Abstract Syntax Notation One (ASN.1), con codifica come TimeStampRequest.
  3. Riceve una marcatura temporale, nel formato di un secondo PKCS #7 SignedData, restituita dal server di marcatura temporale.
  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 di marca temporale

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
}

Il countersignatureType è l'identificatore di oggetto (OID) che la identifica come controfirma con indicazione temporale 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 è costituito dai dati da firmare. Per la marcatura temporale della firma, il ContentType deve essere Data e il contenuto deve essere l’encryptedDigest (firma) presente nel SignerInfo del contenuto PKCS #7 a cui applicare la marcatura temporale.

Risposta della marca temporale

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, il ContentInfo dell'elemento PKCS #7 SignedData restituito viene scartato e il SignerInfo della marca temporale restituita viene copiato come controfirma nel SignerInfo dell'elemento PKCS #7 SignedData originale. La catena di certificati del marcatore temporale viene inoltre copiata nel campo Certificates del PKCS #7 originale SignedData come attributo non autenticato del firmatario originale.