Condividi tramite


Come firmare un pacchetto dell'app con SignTool

Nota

Per la firma di un pacchetto di app di Windows, vedi Firmare un pacchetto dell'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 pacchetti di app (MakeAppx.exe) di Windows SDK non sono firmati.

Nota

Puoi usare SignTool solo per firmare i pacchetti di 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.

Informazioni importanti

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, vedi 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 unset 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 unset 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.

Istruzioni

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'elemento BlockMap indica l'algoritmo hash usato durante la creazione del pacchetto dell'app. Ad 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:

Valore HashMethod hashAlgorithm 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

Per firmare il pacchetto con un certificato di firma da un file pfx

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

SignTool defaults the /fd hashAlgorithm parameter to SHA1 if it's not specified, and SHA1 is not valid for signing app packages. È 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 info su queste opzioni, vedi SignTool.

Nota

Non è possibile usare l'operazione signtool timestamp in un pacchetto dell'app firmato. L'operazione non è supportata.

Se si vuole timestampare il pacchetto dell'app, è necessario eseguirlo durante l'operazione di firma. Ad 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 SignTool può restituire, SignTool può restituire anche 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 di 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 in modo che corrisponda al nome soggetto del certificato di firma previsto. In alternativa, selezionare un certificato di firma diverso con un nome soggetto corrispondente 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 dei blocchi del pacchetto dell'app.
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 di app, vedi Creazione di un pacchetto dell'app con il pacchetto dell'app o Creazione di un pacchetto di app con Visual Studio 2012.

Security Considerations

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 agli 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 di Persone attendibile 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

Esempio di creazione del pacchetto dell'app

Concetti

Procedure consigliate per la firma del codice

Firma di un pacchetto in Visual Studio 2012

SignTool

Packager app (MakeAppx.exe)

Come creare un certificato di firma del pacchetto di un'app