Freigeben über


MSIX und CI/CD Pipeline signieren mit Azure Key Vault

Das Signieren ist eine der wichtigsten Aufgaben, die sie ausführen müssen, wenn Sie mit MSIX-Paketen arbeiten. Wenn ein MSIX-Paket nicht mit einem vertrauenswürdigen Zertifikat signiert ist, können Benutzer die Anwendung nicht installieren. Gleichzeitig ist signieren eine der wichtigsten Aufgaben auch bei der Sicherheit. Zertifikate müssen sicher gespeichert werden, um zu vermeiden, dass böswillige Akteure sie wiederverwenden könnten, um ihre Anwendungen mit unserer Identität zu signieren. Azure Key Vault ist die beste Option, um diese Anforderung zu unterstützen.

In diesem Artikel werden wir sehen, wie Sie Azure Key Vault in einer CI/CD-Pipeline nutzen können, damit wir unser MSIX-Paket automatisch als Teil des Prozesses signieren können.

Von Bedeutung

Der in diesem Artikel beschriebene Prozess basiert auf einem Open Source-Tool namens Azure SignTool, das sowohl mit Azure-Pipelines als auch mit GitHub-Aktionen funktioniert. Wenn Sie Azure-Pipelines verwenden, können Sie auch die MSIX-Erweiterungen in Kombination mit der Azure Key Vault-Aufgabe nutzen.

Voraussetzungen

  • Ein Azure-Konto. Wenn Sie noch nicht über ein Azure-Konto verfügen, beginnen Sie hier.
  • Ein Azure Key Vault. Weitere Informationen finden Sie unter Erstellen eines Key Vault.
  • Ein gültiges Paketsignaturzertifikat, das in Azure Key Vault importiert wurde. Das von Azure Key Vault generierte Standardzertifikat funktioniert nicht für die Codesignatur. Ausführliche Informationen zum Erstellen eines Paketsignaturzertifikats finden Sie unter Erstellen eines Zertifikats für die Paketsignierung.
  • Eine CI/CD-Pipeline, die ein MSIX-Paket generiert, das in Azure-Pipelines oder GitHub-Aktionen gehostet wird. Weitere Informationen finden Sie unter Configure CI/CD pipeline with YAML file.

Registrieren einer Anwendung in Azure

Um das Paket als Teil der CI/CD-Pipeline zu signieren, verwenden wir ein Tool namens Azure SignTool. Es funktioniert wie das standardmäßige SignTool-Hilfsprogramm, das im Windows 10 SDK enthalten ist, aber anstelle eines lokalen Zertifikats eine Verbindung mit Azure Key Vault herstellt, um eines der verfügbaren Zertifikate zu verwenden. Um die Verbindung herzustellen, müssen wir jedoch zuerst eine Anwendung in Azure registrieren, um die Anmeldeinformationen zu erhalten, die wir benötigen, damit das Azure SignTool sich bei unserem Azure Key Vault-Dienst authentifizieren kann.

Öffnen Sie das Azure-Portal, und wählen Sie Azure Active Directory unter den verfügbaren Diensten aus. Klicken Sie auf App-Registrierungen , und wählen Sie "Neue Registrierung" aus, um den Vorgang zu starten. Geben Sie der Anwendung einen Namen (z. B. SignToolForContoso in der Abbildung unten) und lassen Sie dann die Standardeinstellungen wie sie sind.

Registrieren einer Anwendung in Azure

Der nächste Schritt besteht darin, die Anwendung als öffentlicher Client zu behandeln, da wir in einem Szenario sind, in dem kein Umleitungs-URI erforderlich ist. Wechseln Sie zum Abschnitt "Authentifizierung ", und ändern Sie unter "Erweiterte Einstellungen" den Schalter "Anwendung behandeln" als öffentlicher Client in "Ja".

Festlegen erweiterter Einstellungen

Der letzte Schritt besteht darin, einen geheimen Clientschlüssel zu erstellen, bei dem es sich um das Kennwort handelt, das wir vom Azure SignTool authentifizieren müssen. Wechseln Sie zum Abschnitt "Zertifikate und Geheime Schlüssel", und klicken Sie dann auf "Neuer geheimer Clientschlüssel". Geben Sie ihm einen Namen, wählen Sie ein Ablaufdatum, und drücken Sie dann die Schaltfläche "Hinzufügen". Sie werden zurück zur Hauptseite umgeleitet, auf der der geheime Schlüssel zusammen mit seinem Wert aufgeführt wird. Achten Sie darauf, sie zu kopieren und an einem sicheren Ort zu speichern. Sie können sie nicht erneut abrufen. Sobald Sie die Seite aktualisieren, wird der geheime Schlüssel maskiert, und es gibt keine Möglichkeit, sie anzuzeigen. Ihre einzige Option ist das Generieren eines neuen geheimen Schlüssels.

Es gibt eine letzte Information, die Sie zusammen mit dem geheimen Clientschlüssel speichern müssen: der Anwendungsbezeichner. Wechseln Sie zurück zur Startseite der Applikation (indem Sie auf Übersicht klicken) und suchen Sie im oberen Abschnitt nach der Anwendungs-ID (Client-ID).

Anwendungs-ID

Aktivieren des Zugriffs auf Azure Key Vault

Der nächste Schritt besteht darin, die Azure-Anwendung zu konfigurieren, die wir soeben erstellt haben, um auf unseren Azure Key Vault-Dienst zuzugreifen. Wechseln Sie im Azure-Portal zur Azure Key Vault-Instanz, die das Zertifikat enthält, das Sie zum Signieren Ihres MSIX-Pakets verwenden möchten. Wechseln Sie zum Abschnitt "Zugriffsrichtlinien ", und klicken Sie auf "Zugriffsrichtlinie hinzufügen". Das Tool unterstützt die Auswahl einer der verfügbaren Vorlagen, um die Berechtigungen zu definieren, die wir gewähren möchten, aber in unserem Szenario ist niemand von ihnen die richtige Passende. Daher müssen wir mithilfe der Dropdowns die folgenden Optionen manuell festlegen:

  • Aktivieren Sie unter "Schlüsselberechtigungen" die Option " Signieren ".
  • Aktivieren Sie unter Zertifikatberechtigungen die Option " Abrufen ".

Der letzte wichtige Schritt besteht darin, festzulegen, welche Anwendung auf diese Richtlinie zugreifen wird. Klicken Sie auf " Prinzipal auswählen" , und suchen Sie mithilfe des Namens nach der Azure-Anwendung, die Sie im vorherigen Schritt erstellt haben. Im Beispiel wird signToolForContoso genannt.

Prinzipal auswählen

Nachdem Sie es gefunden haben, drücken Sie Auswählen. So sollte die Richtlinie aussehen.

Zugriffsrichtlinie hinzufügen

Wenn Sie den Vorgang abgeschlossen haben, klicken Sie auf "Hinzufügen" , um die Richtlinie zu erstellen.

Verwenden von Azure SignTool zum lokalen Signieren des Pakets

Nachdem die Azure-Konfiguration abgeschlossen ist, können wir azure SignTool verwenden, um das Paket zu signieren. In diesem Abschnitt verwenden wir das Tool lokal, um sich damit vertraut zu machen. In den nächsten Abschnitten verwenden wir sie als Teil einer CI/CD-Pipeline.

Das Tool ist als globales .NET-Tool verfügbar. Stellen Sie sicher, dass das neueste .NET SDK installiert ist, öffnen Sie dann eine Eingabeaufforderung, und starten Sie den folgenden Befehl:

dotnet tool install --global AzureSignTool 

Jetzt können Sie Ihr Paket mit dem AzureSignTool-Befehl signieren, der die folgenden Parameter erfordert:

  • kvu ist die URL Ihres Azure Key Vault. Sie finden ihn auf der Hauptseite des Diensts im Azure-Portal unter DNS-Name.
  • kvi ist die Anwendungs-ID der Azure-App, die Sie registriert haben und die Sie zuvor erwähnt haben.
  • kvs ist der geheime Clientschlüssel, den Sie zuvor generiert haben und die Sie zuvor erwähnt haben.
  • kvc ist der Anzeigename des Zertifikats, das Sie verwenden möchten.
  • tr ist die URL eines Zeitstempelservers. Mit dieser Option können wir das Paket auch dann aktivieren, wenn das Zertifikat abläuft.
  • v ist der Pfad des MSIX-Pakets, das signiert werden soll.

Dies ist ein Beispielbefehl:

AzureSignTool sign -kvt "<tenantID>" -kvu "https://contosoexpenses-blog.vault.azure.net/" -kvi "aaaabbbb-0000-cccc-1111-dddd2222eeee" -kvs "this-is-the-secret" -kvc "MyCertificate" -tr http://timestamp.digicert.com -v .\MyContosoApp.msix

Hinweis

Um mehr über AzureSignTool zu erfahren, führen Sie den Befehl AzureSignTool sign --help aus.

Verwenden von Azure SignTool mit Azure-Pipelines

In diesem Abschnitt wird davon ausgegangen, dass Sie bereits über eine CI/CD-Pipeline für eine Windows-Anwendung verfügen, die mit einer YAML-Datei auf Azure Pipelines konfiguriert ist, wie hier erläutert.

Zunächst müssen Sie einige Variablen erstellen, um die von Azure SignTool zum Herstellen einer Verbindung mit Azure Key Vault erforderlichen Informationen zu speichern. Wählen Sie in Azure DevOps Ihre Pipeline aus, und drücken Sie oben die Schaltfläche "Bearbeiten ". Sobald Sie sich im YAML-Editor befinden, klicken Sie oben auf die Schaltfläche "Variablen ", um den Bereich zu öffnen. Klicken Sie auf die Schaltfläche +, um die folgenden Variablen hinzuzufügen:

  • AzureKeyVaultName, mit dem benutzerfreundlichen Namen Ihres Tresors.
  • AzureKeyVaultUrl mit der URL Ihres Schlüsseltresors.
  • AzureKeyVaultClientId mit der Anwendungs-ID Ihrer Azure-Anwendung.
  • AzureKeyVaultClientSecret mit dem geheimen Clientschlüssel Ihrer Azure-Anwendung.

Wenn Sie jede Variable erstellen, müssen Sie die Option "Diesen Wert geheim halten " aktivieren. Es wird sichergestellt, dass andere Personen, die Zugriff auf die Pipeline haben, ihre Werte nicht sehen können.

Variable hinzufügen

Jetzt können Sie Ihre vorhandene YAML-Pipeline anpassen, indem Sie eine .NET Core-Aufgabe hinzufügen, um Azure SignTool auf dem Agent zu installieren. Hier ist das YAML, das hinzugefügt werden soll:

- task: DotNetCoreCLI@2
  displayName: 'Install Azure SignTool'
  inputs:
    command: custom
    custom: tool
    arguments: 'install --global AzureSignTool'

Der nächste Schritt besteht darin, eine PowerShell-Aufgabe hinzuzufügen, um den Befehl auszuführen, der das Paket signiert. Sie müssen diese Aufgabe nur am Ende des Buildprozesses ausführen, sobald das MSIX-Paket erstellt wurde.

- powershell: '& AzureSignTool sign -kvu $(AzureKeyVaultUrl) -kvi $(AzureKeyVaultClientId) -kvs $(AzureKeyVaultClientSecret) -kvc $(AzureKeyVaultName) -tr http://timestamp.digicert.com -v "$(System.DefaultWorkingDirectory)\MyPipeline\MyContosoApp\MyContosoApp.msix"'
  displayName: 'Sign the package'

Der Befehl ähnelt dem Befehl, mit dem wir das Paket lokal signieren. Die einzigen Unterschiede sind:

  • Anstatt feste Werte für die verschiedenen Parameter zu verwenden, verwenden wir die Variablen, die wir mit der Syntax $(Variable-Name) erstellt haben.
  • Der Pfad des MSIX-Pakets verweist auf den Ordner im Agent, in dem das MSIX-Paket am Ende des Builds erstellt wird.

Verwenden von Azure SignTool mit GitHub-Aktionen

In diesem Abschnitt wird davon ausgegangen, dass Sie bereits über eine CI/CD-Pipeline für eine Windows-Anwendung verfügen, die mit einer YAML-Datei auf GitHub Actions konfiguriert ist, wie hier erläutert.

Als erster Schritt müssen wir die Anmeldeinformationen wie bei der Azure-Pipeline sicher speichern. GitHub verwendet geheime Schlüssel und kann in den Einstellungen Ihres Repositorys hinzugefügt werden. Sobald Sie sich im GitHub-Repository befinden, in dem Ihre Windows-Anwendung gehostet wird, klicken Sie auf "Einstellungen ", und wechseln Sie dann zu "Geheime Schlüssel".

Ähnlich wie bei Azure Pipelines klicken Sie auf "Neuer geheimer Schlüssel ", um vier geheime Schlüssel zu erstellen:

  • AzureKeyVaultName, mit dem benutzerfreundlichen Namen Ihres Tresors.
  • AzureKeyVaultUrl mit der URL Ihres Schlüsseltresors.
  • AzureKeyVaultClientId mit der Anwendungs-ID Ihrer Azure-Anwendung.
  • AzureKeyVaultClientSecret mit dem geheimen Clientschlüssel Ihrer Azure-Anwendung.

Der Unterschied bei Azure Pipeline besteht darin, dass geheime Schlüssel implizit ausgeblendet werden, sodass Sie keine Option zum Schutz aktivieren müssen.

Jetzt können Sie über die Registerkarte "Aktionen " Ihres Repositorys Ihren vorhandenen Workflow öffnen und die Aufgaben hinzufügen, die Sie zum Durchführen der Signatur benötigen. Der erste installiert das AzureSign-Tool auf dem Agent:

- name: Install AzureSignTool
  run: dotnet tool install --global AzureSignTool

Der zweite signiert das Paket und muss ausgeführt werden, nachdem der Visual Studio-Build abgeschlossen wurde und das MSIX-Paket generiert wurde.

 - name: Sign package
   run: |
        Get-ChildItem -recurse -Include **.msix | ForEach-Object {
        $msixPath = $_.FullName
        & AzureSignTool sign -kvu "${{ secrets.AzureKeyVaultUrl }}" -kvi "${{ secrets.AzureKeyVaultClientId }}" -kvs "${{ secrets.AzureKeyVaultClientSecret }}" -kvc ${{ secrets.AzureKeyVaultName }} -tr http://timestamp.digicert.com -v $msixPath
        }

Es gibt einige Unterschiede in dieser Aufgabe im Vergleich zu dem, das wir in Azure-Pipelines verwendet haben. Der erste ist, dass GitHub eine andere Syntax verwendet, um auf die Secrets zuzugreifen, nämlich ${{ secrets.SECRET_NAME }}. Daher werden die verschiedenen Parameter mit den Werten gefüllt, die wir zuvor im Abschnitt "Geheime Schlüssel" erstellt haben. Eine weitere Möglichkeit besteht darin, dass Sie einen anderen Ansatz finden müssen, um die MSIX-Pakete zu finden und zu signieren. Die Aufgabe verwendet anstelle eines bestimmten MSIX-Pakets ein PowerShell-Skript, das alle dateien durchläuft, die in der Buildausgabe gespeichert sind. Wenn die Datei über die MSIX-Erweiterung verfügt, verwendet sie den AzureSignTool-Befehl, um sie zu signieren.

Bereitstellen des Pakets

Unabhängig von der CI/CD-Plattform Ihrer Wahl wird am Ende des Flusses ein MSIX-Paket mit Ihrem Zertifikat signiert, das auf Azure Key Vault gespeichert ist. Jetzt können Sie jede andere verfügbare Aufgabe verwenden, um das Paket mithilfe Ihrer bevorzugten Verteilungsoption bereitzustellen: microsoft Store, eine Website, Microsoft Intune usw.