Condividi tramite


Come firmare un pacchetto dell'app con SignTool

Nota

Per firmare un pacchetto di app di Windows, vedere Firmare un pacchetto di app con SignTool.

Informazioni su come usare SignTool per firmare i pacchetti delle app di Windows in modo che possano essere distribuiti. SignTool fa parte di Windows Software Development Kit (SDK).

Prima di poter essere distribuiti, tutti i pacchetti di app di Windows devono essere firmati digitalmente. Anche se Microsoft Visual Studio 2012 e versioni successive possono firmare un pacchetto dell'app durante la creazione, i pacchetti creati usando lo strumento di creazione di pacchetti di app (MakeAppx.exe) da Windows SDK non sono firmati.

Nota

Puoi usare solo SignTool per firmare i pacchetti delle app di Windows in Windows 8 e versioni successive o Windows Server 2012 e versioni successive. Non è possibile usare SignTool per firmare pacchetti di app in sistemi operativi di livello inferiore, ad esempio Windows 7 o Windows Server 2008 R2.

Cosa è necessario sapere

Tecnologie

Prerequisiti

Considerazioni aggiuntive

Il certificato usato per firmare il pacchetto dell'app deve soddisfare questi criteri:

  • Il nome del soggetto del certificato deve corrispondere all'attributo Publisher contenuto nell'elemento Identity del file AppxManifest.xml archiviato all'interno del pacchetto. Il nome dell'editore fa parte dell'identità di un'app di Windows in pacchetto, quindi devi fare in modo che il nome del soggetto del certificato corrisponda al nome dell'editore dell'app. Ciò consente di verificare l'identità dei pacchetti firmati rispetto alla firma digitale. Per informazioni sugli errori di firma che possono verificarsi dalla firma di un pacchetto dell'app tramite SignTool, vedere la sezione Osservazioni di Come creare un certificato di firma del pacchetto dell'app.

  • Il certificato deve essere valido per la firma del codice. Ciò significa che entrambi gli elementi devono essere veri:

    • Il campo Utilizzo chiavi esteso (EKU) del certificato deve essere non impostato o contenere il valore EKU per la firma del codice (1.3.6.1.5.5.7.3.3).
    • Il campo Utilizzo chiavi (KU) del certificato deve essere non impostato o contenere il bit di utilizzo per la firma digitale (0x80).
  • Il certificato contiene una chiave privata.

  • Il certificato è valido. È attivo, non è scaduto e non è stato revocato.

Disposizioni

Passaggio 1: Determinare l'algoritmo hash da usare

Quando si firma il pacchetto dell'app, è necessario usare lo stesso algoritmo hash usato durante la creazione del pacchetto dell'app. Se sono state usate le impostazioni predefinite per creare il pacchetto dell'app, l'algoritmo hash usato è SHA256.

Se è stato usato il packager dell'app con un algoritmo hash specifico per creare il pacchetto dell'app, usare lo stesso algoritmo per firmare il pacchetto. Per determinare l'algoritmo hash da usare per la firma di un pacchetto, è possibile estrarre il contenuto del pacchetto ed esaminare il file AppxBlockMap.xml. L'attributo HashMethod dell'elementoBlockMapindica l'algoritmo hash usato durante la creazione del pacchetto dell'app. Per esempio:

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

L'elemento BlockMap precedente indica che è stato usato l'algoritmo SHA256. Questa tabella elenca il mapping degli algoritmi attualmente disponibili:

HashMethod valore Algoritmo di hashing da usare
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (impostazione predefinita .appx)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

Passaggio 2: Eseguire SignTool.exe per firmare il pacchetto

Firmare il pacchetto utilizzando un certificato di firma da un file .pfx

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool imposta di default il parametro /fd hashAlgorithm su SHA1 se non è specificato, e SHA1 non è valido per la firma dei pacchetti dell'app. È quindi necessario specificare questo parametro quando si firma un pacchetto dell'app. Per firmare un pacchetto dell'app creato con l'hash SHA256 predefinito, specificare il parametro /fd hashAlgorithm come SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

È possibile omettere il parametro /p password se si usa un file con estensione pfx che non è protetto da password. È anche possibile usare altre opzioni di selezione dei certificati supportate da SignTool per firmare i pacchetti dell'app. Per altre informazioni su queste opzioni, vedere SignTool.

Nota

Non è possibile usare l'operazione SignTool timestamp su un pacchetto dell'app firmato; l'operazione non è supportata.

Se desideri apporre un timestamp al pacchetto dell'app, devi farlo durante l'operazione di firma. Per esempio:

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

Impostare il parametro /tr timestampServerUrl uguale all'URL per un server timestamp RFC 3161.

Osservazioni

Questa sezione illustra la risoluzione degli errori di firma per i pacchetti dell'app.

Risoluzione degli errori di firma del pacchetto dell'app

Oltre agli errori di firma che possono restituire SignTool, SignTool possono restituire errori specifici per la firma dei pacchetti dell'app. Questi errori vengono in genere visualizzati come errori interni:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

Se il codice di errore inizia con 0x8008, ad esempio 0x80080206 APPX_E_CORRUPT_CONTENT), indica che il pacchetto firmato non è valido. In questo caso, prima di firmare il pacchetto, è necessario ricompilare il pacchetto. Per l'elenco completo degli errori 0x8008*, vedere codici di errore COM (sicurezza e installazione).

Più comunemente, l'errore è 0x8007000b (ERROR_BAD_FORMAT). In questo caso, è possibile trovare informazioni di errore più specifiche nel registro eventi:

Per eseguire ricerche nel registro eventi

  1. Eseguire Eventvwr.msc.
  2. Aprire il registro eventi: Visualizzatore eventi (Locale) > Registri applicazioni e servizi > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
  3. Cercare l'evento di errore più recente.

L'errore interno corrisponde in genere a uno di questi:

ID evento Stringa di evento di esempio Suggerimento
150 errore 0x8007000B: il nome dell'autore del manifesto dell'app (CN=Contoso) deve corrispondere al nome soggetto del certificato di firma (CN=Contoso, C=US). Il nome dell'autore del manifesto dell'app deve corrispondere esattamente al nome del soggetto della firma. Nota: Questi nomi vengono specificati tra virgolette e fanno distinzione tra maiuscole e minuscole e spazi vuoti.
È possibile aggiornare la stringa dell'attributo Publisher definita per l'elemento Identity nel file AppxManifest.xml per corrispondere al nome del soggetto del certificato di firma previsto. In alternativa, selezionare un certificato di firma diverso il cui nome del soggetto corrisponda al nome dell'editore del manifesto dell'app. Il nome dell'autore del manifesto e il nome del soggetto del certificato sono entrambi elencati nel messaggio dell'evento.
151 errore 0x8007000B: il metodo hash della firma specificato (SHA512) deve corrispondere al metodo hash usato nella mappa a blocchi del pacchetto dell'app (SHA256). HashAlgorithm specificato nel parametro /fd non è corretto (vedere Passaggio 1: Determinare l'algoritmo hash da usare). Eseguire di nuovo SignTool con l'hashAlgorithm che corrisponde alla mappa a blocchi del pacchetto dell'applicazione.
152 errore 0x8007000B: il contenuto del pacchetto dell'app deve essere convalidato rispetto alla mappa a blocchi. Il pacchetto dell'app è danneggiato e deve essere ricompilato per generare una nuova mappa a blocchi. Per altre info sulla creazione di un pacchetto dell'app, vedere Creazione di un pacchetto di app con pacchetto di app o Creazione di un pacchetto di app con Visual Studio 2012.

Considerazioni sulla sicurezza

Dopo la firma del pacchetto, il certificato usato per firmare il pacchetto deve comunque essere considerato attendibile dal computer in cui deve essere distribuito il pacchetto. Aggiungendo un certificato a archivi certificati del computer locale, si influisce sull'attendibilità del certificato di tutti gli utenti nel computer. È consigliabile installare tutti i certificati di firma del codice desiderati per testare i pacchetti dell'app nell'archivio certificati Persone attendibili e rimuovere tempestivamente tali certificati quando non sono più necessari. Se si creano certificati di test personalizzati per la firma dei pacchetti dell'app, è consigliabile limitare anche i privilegi associati al certificato di test. Per altre informazioni sulla creazione di certificati di test per la firma dei pacchetti dell'app, vedere Come creare un certificato di firma del pacchetto dell'app.

esempi di

Creare un pacchetto di app di esempio

concetti

Code-Signing procedure consigliate

Firma di un pacchetto in Visual Studio 2012

SignTool

Impacchettatore di app (MakeAppx.exe)

Come creare un certificato di firma del pacchetto dell'app