Signieren eines App-Pakets mithilfe von SignTool

Hinweis

Informationen zum Signieren eines Windows-App-Pakets finden Sie unter Signieren eines App-Pakets mit SignTool.

Erfahren Sie, wie Sie SignTool verwenden, um Ihre Windows-App-Pakete zu signieren, damit sie bereitgestellt werden können. SignTool ist Teil des Windows Software Development Kit (SDK).

Alle Windows-App-Pakete müssen digital signiert sein, bevor sie bereitgestellt werden können. Während Microsoft Visual Studio 2012 und höher ein App-Paket während seiner Erstellung signieren kann, werden Pakete, die Sie mit dem App-Packager-Tool (MakeAppx.exe) aus dem Windows SDK erstellen, nicht signiert.

Hinweis

Sie können SignTool nur verwenden, um Ihre Windows-App-Pakete unter Windows 8 und höher oder Windows Server 2012 und höher zu signieren. Sie können SignTool nicht verwenden, um App-Pakete auf heruntergefahrenen Betriebssystemen wie Windows 7 oder Windows Server 2008 R2 zu signieren.

Wichtige Informationen

Technologien

Voraussetzungen

Weitere Überlegungen

Das Zertifikat, das Sie zum Signieren des App-Pakets verwenden, muss die folgenden Kriterien erfüllen:

  • Der Antragstellername des Zertifikats muss mit dem Publisher-Attribut übereinstimmen, das im Identity-Element der AppxManifest.xml-Datei enthalten ist, die im Paket gespeichert ist. Der Herausgebername ist Teil der Identität einer gepackten Windows-App, daher müssen Sie den Antragstellernamen des Zertifikats mit dem Herausgebernamen der App übereinstimmen. Dadurch kann die Identität signierter Pakete mit der digitalen Signatur überprüft werden. Informationen zu Signaturfehlern, die beim Signieren eines App-Pakets mit SignTool auftreten können, finden Sie im Abschnitt Hinweise zum Erstellen eines Signaturzertifikats für ein App-Paket.

  • Das Zertifikat muss für die Codesignatur gültig sein. Dies bedeutet, dass beide Elemente wahr sein müssen:

    • Das Feld Erweiterte Schlüsselverwendung (Extended Key Usage, EKU) des Zertifikats muss entweder nicht festgelegt sein oder den EKU-Wert für die Codesignatur enthalten (1.3.6.1.5.5.7.3.3).
    • Das Feld Schlüsselverwendung (Key Usage, KU) des Zertifikats muss entweder nicht festgelegt sein oder das Nutzungsbit für die digitale Signatur (0x80) enthalten.
  • Das Zertifikat enthält einen privaten Schlüssel.

  • Das Zertifikat ist gültig. Sie ist aktiv, nicht abgelaufen und wurde nicht widerrufen.

Instructions

Schritt 1: Bestimmen des zu verwendenden Hashalgorithmus

Wenn Sie das App-Paket signieren, müssen Sie denselben Hashalgorithmus verwenden, den Sie beim Erstellen des App-Pakets verwendet haben. Wenn Sie zum Erstellen des App-Pakets Standardeinstellungen verwendet haben, ist der verwendete Hashalgorithmus SHA256.

Wenn Sie den App-Packager mit einem bestimmten Hashalgorithmus zum Erstellen des App-Pakets verwendet haben, verwenden Sie denselben Algorithmus, um das Paket zu signieren. Um den Hashalgorithmus zu bestimmen, der zum Signieren eines Pakets verwendet werden soll, können Sie den Paketinhalt extrahieren und die AppxBlockMap.xml-Datei überprüfen. Das HashMethod-Attribut des BlockMap-Elements gibt den Hashalgorithmus an, der beim Erstellen des App-Pakets verwendet wurde. Beispiel:

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

Das vorherige BlockMap-Element gibt an, dass der SHA256-Algorithmus verwendet wurde. In dieser Tabelle wird die Zuordnung der derzeit verfügbaren Algorithmen aufgeführt:

HashMethod-Wert zu verwendende hashAlgorithm
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx default)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

Schritt 2: Führen Sie SignTool.exe aus, um das Paket zu signieren

So signieren Sie das Paket mit einem Signaturzertifikat aus einer PFX-Datei

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

SignTool setzt den /fd hashAlgorithm-Parameter standardmäßig auf SHA1, wenn er nicht angegeben ist, und SHA1 ist nicht für das Signieren von App-Paketen gültig. Daher müssen Sie diesen Parameter angeben, wenn Sie ein App-Paket signieren. Um ein App-Paket zu signieren, das mit dem SHA256-Standardhash erstellt wurde, geben Sie den Parameter /fd hashAlgorithm als SHA256 an:

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

Sie können den Kennwortparameter /p weglassen, wenn Sie eine PFX-Datei verwenden, die nicht kennwortgeschützte ist. Sie können auch andere Zertifikatauswahloptionen verwenden, die von SignTool unterstützt werden, um App-Pakete zu signieren. Weitere Informationen zu diesen Optionen finden Sie unter SignTool.

Hinweis

Sie können den SignTool-Zeitstempelvorgang nicht für ein signiertes App-Paket verwenden. der Vorgang wird nicht unterstützt.

Wenn Sie das App-Paket zeitstempeln möchten, müssen Sie dies während des Signierens tun. Beispiel:

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

Stellen Sie fest, dass der Parameter /tr timestampServerUrl der URL für einen RFC 3161-Zeitstempelserver entspricht.

Hinweise

In diesem Abschnitt wird die Problembehandlung bei Signaturfehlern für App-Pakete erläutert.

Problembehandlung bei Signaturfehlern bei App-Paketen

Zusätzlich zu den Signaturfehlern, die SignTool zurückgeben kann, kann SignTool auch Fehler zurückgeben, die für das Signieren von App-Paketen spezifisch sind. Diese Fehler werden normalerweise als interne Fehler angezeigt:

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

Wenn der Fehlercode mit 0x8008 beginnt, z. B. 0x80080206 APPX_E_CORRUPT_CONTENT), gibt dies an, dass das signierte Paket ungültig ist. In diesem Fall müssen Sie das Paket neu erstellen, bevor Sie das Paket signieren können. Eine vollständige Liste der 0x8008*-Fehler finden Sie unter COM-Fehlercodes (Sicherheit und Setup).

Häufiger ist der Fehler 0x8007000b (ERROR_BAD_FORMAT). In diesem Fall finden Sie spezifischere Fehlerinformationen im Ereignisprotokoll:

So durchsuchen Sie das Ereignisprotokoll

  1. Führen Sie Eventvwr.msc aus.
  2. Öffnen Sie das Ereignisprotokoll: Ereignisanzeige (lokale) > Anwendungs- und Dienstprotokolle > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
  3. Suchen Sie nach dem neuesten Fehlerereignis.

Der interne Fehler entspricht normalerweise einer der folgenden:

Ereignis-ID Beispielereigniszeichenfolge Vorschlag
150 Fehler 0x8007000B: Der Herausgebername des App-Manifests (CN=Contoso) muss mit dem Antragstellernamen des Signaturzertifikats (CN=Contoso, C=US) übereinstimmen. Der Name des App-Manifestherausgebers muss genau mit dem Antragstellernamen der Signatur übereinstimmen. Hinweis: Diese Namen werden in Anführungszeichen angegeben und beachten die Groß- und Kleinschreibung.
Sie können die Publisher-Attributzeichenfolge aktualisieren, die für das Identity-Element in der AppxManifest.xml-Datei definiert ist, um dem Antragstellernamen des beabsichtigten Signaturzertifikats zu entsprechen. Oder wählen Sie ein anderes Signaturzertifikat mit einem Antragstellernamen aus, der dem Namen des App-Manifestherausgebers entspricht. Der Name des Manifestherausgebers und der Antragstellername des Zertifikats werden in der Ereignismeldung aufgeführt.
151 Fehler 0x8007000B: Die angegebene Signaturhashmethode (SHA512) muss mit der Hashmethode übereinstimmen, die in der App-Paketblockzuordnung (SHA256) verwendet wird. Der im /fd-Parameter angegebene hashAlgorithm ist falsch (siehe Schritt 1: Bestimmen des zu verwendenden Hashalgorithmus). Führen Sie SignTool erneut mit dem hashAlgorithm aus, der der Blockzuordnung des App-Pakets entspricht.
152 Fehler 0x8007000B: Der Inhalt des App-Pakets muss anhand der Blockzuordnung überprüft werden. Das App-Paket ist beschädigt und muss neu erstellt werden, um eine neue Blockzuordnung zu generieren. Weitere Informationen zum Erstellen eines App-Pakets finden Sie unter Erstellen eines App-Pakets mit app packager oder Erstellen eines App-Pakets mit Visual Studio 2012.

Sicherheitsüberlegungen

Nachdem das Paket signiert wurde, muss das Zertifikat, das Sie zum Signieren des Pakets verwendet haben, weiterhin vom Computer vertrauenswürdig sein, auf dem das Paket bereitgestellt werden soll. Durch das Hinzufügen eines Zertifikats zu lokalen Computerzertifikatspeichern wirken Sie sich auf die Zertifikatvertrauensstellung aller Benutzer auf dem Computer aus. Es wird empfohlen, alle Codesignaturzertifikate, die Sie zum Testen von App-Paketen benötigen, im Zertifikatspeicher für vertrauenswürdige Personen zu installieren und diese Zertifikate sofort zu entfernen, wenn sie nicht mehr erforderlich sind. Wenn Sie Ihre eigenen Testzertifikate zum Signieren von App-Paketen erstellen, wird auch empfohlen, die dem Testzertifikat zugeordneten Berechtigungen einzuschränken. Weitere Informationen zum Erstellen von Testzertifikaten zum Signieren von App-Paketen finden Sie unter Erstellen eines Signaturzertifikats für App-Paketen.

Beispiele

Beispiel zum Erstellen eines App-Pakets

Konzepte

Bewährte Methoden für die Codesignierung

Signieren eines Pakets in Visual Studio 2012

SignTool

App-Objekt-Manager (MakeAppx.exe)

So erstellst du ein App-Paketsignaturzertifikat