Hinzufügen eines Zertifikats zu einer App mithilfe von Microsoft Graph
Artikel
Die Microsoft Identity Platform unterstützt drei Arten von Anmeldeinformationen zum Authentifizieren von Apps und Dienstprinzipalen: Kennwörter (App-Geheimnisse), Zertifikate und Anmeldeinformationen für Verbundidentitäten. Wenn Sie keine Anmeldeinformationen für Verbundidentitäten für Ihre App verwenden können, wird dringend empfohlen, Zertifikate anstelle von Geheimnissen zu verwenden.
Dieser Artikel enthält Anleitungen zur Verwendung von Microsoft Graph- und PowerShell-Skripts zum programmgesteuerten Aktualisieren von Zertifikatanmeldeinformationen für eine App-Registrierung.
Voraussetzungen
Für dieses Tutorial benötigen Sie die folgenden Ressourcen und Berechtigungen:
Ein aktiver Microsoft Entra Mandant.
Ein API-Client wie Graph Explorer. Melden Sie sich als Benutzer an, der Anwendungen im Mandanten erstellen und verwalten darf. Die Rollen Anwendungsentwickler (einer App, die er besitzt) und Anwendungsadministrator sind die Rollen mit den geringsten Berechtigungen, die diesen Vorgang ausführen können.
Die Verwendung von Zertifikaten wird dringend gegenüber Geheimnissen empfohlen; Es wird jedoch nicht empfohlen, selbstsignierte Zertifikate zu verwenden. Sie können die Sicherheitsleiste Ihrer Anwendung aufgrund verschiedener Faktoren wie der Verwendung veralteter Hash- und Verschlüsselungssammlungen oder fehlender Validierung verringern. Es wird empfohlen, Zertifikate von einer bekannten vertrauenswürdigen Zertifizierungsstelle zu beschaffen.
Schritt 1: Lesen der Zertifikatdetails
Zum programmgesteuerten Hinzufügen eines Zertifikats mit Microsoft Graph benötigen Sie den Schlüssel des Zertifikats. Optional können Sie den Fingerabdruck des Zertifikats hinzufügen.
[Optional] Abrufen des Zertifikatfingerabdrucks
Es ist optional, den Zertifikatfingerabdruck der Anforderungsnutzlast hinzuzufügen. Wenn Sie den Fingerabdruck hinzufügen möchten, können Sie die folgende PowerShell-Anforderung ausführen, um den Fingerabdruck des Zertifikats zu lesen. Bei dieser Anforderung wird davon ausgegangen, dass Sie das Zertifikat generiert und auf Ihr lokales Laufwerk exportiert haben.
Anforderung
## Replace the file path with the source of your certificate and output path with the location where you want to save the thumprint details
Get-PfxCertificate -Filepath "C:\Users\admin\Desktop\20230112.cer" | Out-File -FilePath "C:\Users\admin\Desktop\20230112.cer.thumbprint.txt"
Antwort
Die Ausgabe in der .txt-Datei kann in etwa wie folgt aussehen.
Führen Sie die folgende Anforderung aus, um den Schlüssel des Zertifikats zu lesen und ihn mithilfe von PowerShell in einer .txt-Datei zu speichern.
Anforderung
PowerShell < 6:
## Replace the file path with the location of your certificate
[convert]::ToBase64String((Get-Content C:\Users\admin\Desktop\20230112.cer -Encoding byte)) | Out-File -FilePath "C:\Users\admin\Desktop\20230112.key.txt"
PowerShell >= 6:
## Replace the file path with the location of your certificate
[convert]::ToBase64String((Get-Content C:\Users\admin\Desktop\20230112.cer -AsByteStream)) | Out-File -FilePath "C:\Users\admin\Desktop\20230112.key.txt"
Antwort
Die Ausgabe in der .txt-Datei kann in etwa wie folgt aussehen.
Anmerkung: Der hier gezeigte Schlüssel wurde aus Gründen der Lesbarkeit gekürzt.
Schritt 2: Hinzufügen der Zertifikatdetails mithilfe von Microsoft Graph
Anforderung
Die folgende Anforderung fügt die Zertifikatdetails zu einer App hinzu. Die Einstellungen sind wie folgt:
StartDateTime ist das Datum, an dem oder nachdem das Zertifikat erstellt wurde.
EndDateTime kann maximal 1 Jahr ab startDateTime sein. Wenn keine Angabe erfolgt, weist das System automatisch ein Datum 1 Jahr nach startDateTime zu.
Der Typ und die Verwendung müssen bzwVerify. seinAsymmetricX509Cert.
Weisen Sie den Zertifikatantragstellernamen der displayName-Eigenschaft zu.
Der Schlüssel ist der Base64-codierte Wert, den Sie im vorherigen Schritt generiert haben. Der Fingerabdruck ist im codierten Schlüssel enthalten, und durch hinzufügen des Schlüssels wird auch der Fingerabdruck hinzugefügt.
Hinweis
Wenn Ihre App über ein vorhandenes gültiges Zertifikat verfügt, das Sie weiterhin für die Authentifizierung verwenden möchten, fügen Sie sowohl die aktuellen als auch die neuen Zertifikatdetails in das keyCredentials-Objekt der App ein. Da dies ein PATCH-Aufruf ist, der den Inhalt der Eigenschaft durch die neuen Werte ersetzt, wobei nur das neue Zertifikat die vorhandenen Zertifikate durch das neue ersetzt.
Im folgenden Beispiel wird ein neues Zertifikat hinzugefügt und alle vorhandenen Zertifikate ersetzt.
Anmerkung: Der hier gezeigte Schlüssel wurde aus Gründen der Lesbarkeit gekürzt.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Application
{
KeyCredentials = new List<KeyCredential>
{
new KeyCredential
{
EndDateTime = DateTimeOffset.Parse("2024-01-11T15:31:26Z"),
StartDateTime = DateTimeOffset.Parse("2023-01-12T15:31:26Z"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQP6HEGDdZ65xJTcK4dCBvZzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMjAeFw0yMzAxMTIwODExNTZaFw0yNDAxMTIwODMxNTZaMBMxETAPBgNVBAMMCDIwMjMwMTEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseKf1weEacJ67D6/...laxQPUbuIL+DaXVkKRm1V3GgIpKTBqMzTf4tCpy7rpUZbhcwAFw6h9A=="),
DisplayName = "CN=20230112",
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Applications["{application-id}"].PatchAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
Application application = new Application();
LinkedList<KeyCredential> keyCredentials = new LinkedList<KeyCredential>();
KeyCredential keyCredential = new KeyCredential();
OffsetDateTime endDateTime = OffsetDateTime.parse("2024-01-11T15:31:26Z");
keyCredential.setEndDateTime(endDateTime);
OffsetDateTime startDateTime = OffsetDateTime.parse("2023-01-12T15:31:26Z");
keyCredential.setStartDateTime(startDateTime);
keyCredential.setType("AsymmetricX509Cert");
keyCredential.setUsage("Verify");
byte[] key = Base64.getDecoder().decode("base64MIIDADCCAeigAwIBAgIQP6HEGDdZ65xJTcK4dCBvZzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMjAeFw0yMzAxMTIwODExNTZaFw0yNDAxMTIwODMxNTZaMBMxETAPBgNVBAMMCDIwMjMwMTEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseKf1weEacJ67D6/...laxQPUbuIL+DaXVkKRm1V3GgIpKTBqMzTf4tCpy7rpUZbhcwAFw6h9A==");
keyCredential.setKey(key);
keyCredential.setDisplayName("CN=20230112");
keyCredentials.add(keyCredential);
application.setKeyCredentials(keyCredentials);
Application result = graphClient.applications().byApplicationId("{application-id}").patch(application);
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.models.application import Application
from msgraph.generated.models.key_credential import KeyCredential
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = Application(
key_credentials = [
KeyCredential(
end_date_time = "2024-01-11T15:31:26Z",
start_date_time = "2023-01-12T15:31:26Z",
type = "AsymmetricX509Cert",
usage = "Verify",
key = base64.urlsafe_b64decode("base64MIIDADCCAeigAwIBAgIQP6HEGDdZ65xJTcK4dCBvZzANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMjAeFw0yMzAxMTIwODExNTZaFw0yNDAxMTIwODMxNTZaMBMxETAPBgNVBAMMCDIwMjMwMTEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAseKf1weEacJ67D6/...laxQPUbuIL+DaXVkKRm1V3GgIpKTBqMzTf4tCpy7rpUZbhcwAFw6h9A=="),
display_name = "CN=20230112",
),
],
)
result = await graph_client.applications.by_application_id('application-id').patch(request_body)
Im folgenden Beispiel wird ein neues Zertifikat hinzugefügt, ohne das vorhandene Zertifikat durch den Fingerabdruck 52ED9B5038A47B9E2E2190715CC238359D4F8F73zu ersetzen.
Anmerkung: Der hier gezeigte Schlüssel wurde aus Gründen der Lesbarkeit gekürzt.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new Application
{
KeyCredentials = new List<KeyCredential>
{
new KeyCredential
{
EndDateTime = DateTimeOffset.Parse("2024-01-11T15:31:26Z"),
StartDateTime = DateTimeOffset.Parse("2023-01-12T09:31:26Z"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQejfrj3S974xI//npv7hFHTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExNDAeFw0yMzAxMTIwOTA4NThaFw0yNDAxMTIwOTI4NThaMBMxETAPBgNVBAMMCDIwMjMwMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5vEj6j1l5wOVHR4eDGe77HWslaIVJ1NqxrXPm/...+R+U7sboj+kUvmFzXI+Ge73Liu8egL2NzOHHpO43calWgq36a9YW1yhBQR1ioEchu6jmudW3rF6ktmVqQ=="),
DisplayName = "CN=20230114",
},
new KeyCredential
{
CustomKeyIdentifier = Convert.FromBase64String("52ED9B5038A47B9E2E2190715CC238359D4F8F73"),
Type = "AsymmetricX509Cert",
Usage = "Verify",
Key = Convert.FromBase64String("base64MIIDADCCAeigAwIBAgIQfoIvchhpToxKEPI4iMrU1TANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMzAeFw0yMzAxMTIwODI3NTJaFw0yNDAxMTIwODQ3NTJaMBMxETAPBgNVBAMMCDIwMjMwMTEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw+iqg1nMjYmFcFJh/.../S5X6qoEOyJBgtfpSBANWAdA=="),
DisplayName = "CN=20230113",
},
},
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Applications["{application-id}"].PatchAsync(requestBody);
# Code snippets are only available for the latest version. Current version is 1.x
from msgraph import GraphServiceClient
from msgraph.generated.models.application import Application
from msgraph.generated.models.key_credential import KeyCredential
# To initialize your graph_client, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=python
request_body = Application(
key_credentials = [
KeyCredential(
end_date_time = "2024-01-11T15:31:26Z",
start_date_time = "2023-01-12T09:31:26Z",
type = "AsymmetricX509Cert",
usage = "Verify",
key = base64.urlsafe_b64decode("base64MIIDADCCAeigAwIBAgIQejfrj3S974xI//npv7hFHTANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExNDAeFw0yMzAxMTIwOTA4NThaFw0yNDAxMTIwOTI4NThaMBMxETAPBgNVBAMMCDIwMjMwMTE0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt5vEj6j1l5wOVHR4eDGe77HWslaIVJ1NqxrXPm/...+R+U7sboj+kUvmFzXI+Ge73Liu8egL2NzOHHpO43calWgq36a9YW1yhBQR1ioEchu6jmudW3rF6ktmVqQ=="),
display_name = "CN=20230114",
),
KeyCredential(
custom_key_identifier = base64.urlsafe_b64decode("52ED9B5038A47B9E2E2190715CC238359D4F8F73"),
type = "AsymmetricX509Cert",
usage = "Verify",
key = base64.urlsafe_b64decode("base64MIIDADCCAeigAwIBAgIQfoIvchhpToxKEPI4iMrU1TANBgkqhkiG9w0BAQsFADATMREwDwYDVQQDDAgyMDIzMDExMzAeFw0yMzAxMTIwODI3NTJaFw0yNDAxMTIwODQ3NTJaMBMxETAPBgNVBAMMCDIwMjMwMTEzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw+iqg1nMjYmFcFJh/.../S5X6qoEOyJBgtfpSBANWAdA=="),
display_name = "CN=20230113",
),
],
)
result = await graph_client.applications.by_application_id('application-id').patch(request_body)
Sie haben Microsoft Graph verwendet, um Zertifikatanmeldeinformationen für ein App-Objekt zu aktualisieren. Dieser Prozess ist eine programmgesteuerte Alternative zur Verwendung des Microsoft Entra Admin Center. Sie können auch Zertifikatanmeldeinformationen für einen Dienstprinzipal aktualisieren, indem Sie einen ähnlichen Prozess ausführen und den https://graph.microsoft.com/v1.0/servicePrincipals/ Endpunkt aufrufen.