Verwenden Sie Zertifikate mit Microsoft. Identity.Web

Microsoft. Identity.Web unterstützt zertifikatbasierte Authentifizierung als sichere Alternative zu geheimen Clientschlüsseln für vertrauliche Clientanwendungen. Zertifikate verwenden asymmetrische Kryptografie, sodass sich nur der private Schlüsselinhaber authentifizieren kann.

In diesem Artikel konfigurieren Sie Zertifikatanmeldeinformationen aus verschiedenen Quellen, registrieren sie bei Ihrer App und verwalten sie in der Produktion.

Warum Zertifikate verwenden?

Faktor Geheimer Clientschlüssel Zertifikat
Security Gemeinsames Geheimnis (symmetrisch) Asymmetrisches Schlüsselpaar
Drehung Erfordert eine erneute Bereitstellung oder Konfigurationsänderung der App Kann über Key Vault automatisiert werden
Expositionsrisiko Geheimer Schlüssel in der Konfiguration kann durchleckt werden Privater Schlüssel bleibt im sicheren Speicher
Konformität Erfüllen möglicherweise keine Unternehmensrichtlinien Erfüllt die meisten Sicherheitsanforderungen für Unternehmen
Empfohlen für Entwicklung, Prototyperstellung Produktionsworkloads

Von Bedeutung

Microsoft empfiehlt Zertifikate über geheime Clientschlüssel für Produktionsanwendungen. Verwenden Sie für den höchsten Sicherheitsstatus die zertifikatlose Authentifizierung (Managed Identity or Workload Identity Federation), wenn Ihre Hostingumgebung sie unterstützt.

So funktioniert es

  1. Sie generieren oder erhalten ein X.509-Zertifikat mit einem privaten Schlüssel.
  2. Sie registrieren den public-Schlüssel (oder Fingerabdruck) des Zertifikats bei Ihrer Microsoft Entra App-Registrierung.
  3. Zur Laufzeit Microsoft. Identity.Web lädt das Zertifikat (einschließlich des privaten Schlüssels) aus Ihrer konfigurierten Quelle.
  4. Die Bibliothek verwendet den privaten Schlüssel, um eine Client assertion zu signieren, die an Microsoft Entra ID gesendet wird, um Token abzurufen.

Zertifikatquellen

Microsoft. Identity.Web unterstützt das Laden von Zertifikaten aus mehreren Quellen:

Quelltyp SourceType-Wert Am besten geeignet für
Azure Key Vault KeyVault Produktion (empfohlen)
Zertifikatspeicher StoreWithThumbprint oder StoreWithDistinguishedName Windows-Server lokal
Dateipfad Path Entwicklung, containerisierte Apps
Base64-codierte Zeichenfolge Base64Encoded Kubernetes-Secrets, CI/CD-Pipelines

Sie konfigurieren Zertifikatanmeldeinformationen im Array in ClientCertificates Ihrem AzureAd (oder AzureAdB2C) Konfigurationsabschnitt. Sie können mehrere Zertifikate für Drehungsszenarien angeben – Microsoft. Identity.Web verwendet das erste gültige Zertifikat, das gefunden wird.


Azure Key Vault ist die empfohlene Quelle für Zertifikate in der Produktion. Es bietet zentrale Verwaltung, Zugriffssteuerung, Überwachung und automatische Rotationsfunktionen.

Konfiguration

Fügen Sie die Zertifikatkonfiguration zu Ihrer appsettings.json hinzu:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}
Eigentum Beschreibung
SourceType Muss "KeyVault" sein.
KeyVaultUrl Der URI Ihrer Azure Key Vault (z. B. https://myapp-kv.vault.azure.net).
KeyVaultCertificateName Der Name des Zertifikats, wie in Key Vault gespeichert.

Einrichten von Key Vault Zugriffsrichtlinien

Die Identität Ihrer Anwendung muss über die Berechtigung zum Lesen von Zertifikaten aus dem Key Vault verfügen. Wie Sie dies gewähren, hängt davon ab, ob Sie das Richtlinienmodell für den Tresorzugriff oder Azure rollenbasierte Zugriffssteuerung (Role-Based Access Control, RBAC) verwenden.

Option 1: Tresorzugriffsrichtlinie

az keyvault set-policy \
  --name your-keyvault-name \
  --object-id <app-or-managed-identity-object-id> \
  --certificate-permissions get list \
  --secret-permissions get

Hinweis

Die berechtigung --secret-permissions get ist erforderlich, da Azure Key Vault den privaten Schlüssel als geheimer Schlüssel speichert, der mit dem Zertifikat verknüpft ist. Microsoft. Identity.Web benötigt Zugriff auf das Zertifikat und den privaten Schlüssel.

Option 2: Azure RBAC

Weisen Sie die Rolle Key Vault Zertifikatbenutzer der Identität Ihrer Anwendung zu:

az role assignment create \
  --role "Key Vault Certificate User" \
  --assignee <app-or-managed-identity-object-id> \
  --scope /subscriptions/<sub-id>/resourceGroups/<rg>/providers/Microsoft.KeyVault/vaults/<vault-name>

Verwenden der verwalteten Identität für den Zugriff auf Key Vault

Wenn Ihre App in Azure ausgeführt wird (App Service, Azure Functions, Azure Kubernetes Service, VMs), verwenden Sie verwaltete Identität, um sich bei Key Vault zu authentifizieren. Dadurch wird die Notwendigkeit von Anmeldeinformationen für den Zugriff auf den Tresor selbst beseitigt.

Vom System zugewiesene verwaltete Identität

Wenn Ihre App eine vom System zugewiesene verwaltete Identität aktiviert hat, Microsoft. Identity.Web verwendet automatisch DefaultAzureCredential, um sich bei Key Vault zu authentifizieren. Über den ClientCertificates Eintrag hinaus ist keine zusätzliche Konfiguration erforderlich:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name"
      }
    ]
  }
}

Benutzerdefinierte verwaltete Identität

Geben Sie für eine vom Benutzer zugewiesene verwaltete Identität den ManagedIdentityClientId für den Key Vault Zertifikatdeskriptor an:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault-name.vault.azure.net",
        "KeyVaultCertificateName": "your-certificate-name",
        "ManagedIdentityClientId": "user-assigned-managed-identity-client-id"
      }
    ]
  }
}

Tipp

Bei der lokalen Ausführung während der Entwicklung fällt DefaultAzureCredential auf Ihre Azure CLI oder Visual Studio Anmeldeinformationen zurück. Stellen Sie sicher, dass Sie mit az login angemeldet sind und dass Ihr Entwicklerkonto über die entsprechenden Key Vault Berechtigungen verfügt.


Aus dem Zertifikatspeicher (nur Windows)

Auf Windows können Sie Zertifikate aus dem Windows Zertifikatspeicher laden. Dies ist üblich für lokale oder von IIS gehostete Bereitstellungen.

Durch Fingerabdruck

Wird StoreWithThumbprint verwendet, um das Zertifikat anhand seines SHA-1-Fingerabdrucks zu identifizieren:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "StoreWithThumbprint",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateThumbprint": "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2"
      }
    ]
  }
}
Eigentum Beschreibung
SourceType Muss "StoreWithThumbprint" sein.
CertificateStorePath Der Speicherort des Zertifikatspeichers. Allgemeine Werte: "CurrentUser/My", "LocalMachine/My".
CertificateThumbprint Der SHA-1-Fingerabdruck des Zertifikats (40 Hexzeichen).

Nach dem Distinguished Name

Verwenden Sie StoreWithDistinguishedName, um das Zertifikat anhand des Betreffnamens zu identifizieren:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "StoreWithDistinguishedName",
        "CertificateStorePath": "CurrentUser/My",
        "CertificateDistinguishedName": "CN=MyAppCertificate"
      }
    ]
  }
}
Eigentum Beschreibung
SourceType Muss "StoreWithDistinguishedName" sein.
CertificateStorePath Der Speicherort des Zertifikatspeichers. Allgemeine Werte: "CurrentUser/My", "LocalMachine/My".
CertificateDistinguishedName Der Antragstellername des Zertifikats (z. B "CN=MyAppCertificate". ).

Zertifikatspeicherorte

In der folgenden Tabelle sind allgemeine Zertifikatspeicherpfade und die berechtigungen aufgeführt, die für den Zugriff erforderlich sind:

Pfad Beschreibung Erforderliche Berechtigungen
CurrentUser/My Persönlicher Store des aktuellen Benutzers Zugriff auf Benutzerebene
LocalMachine/My Systemweiter persönlicher Store Administrator-Zugang
LocalMachine/Root Vertrauenswürdige Stamm-CAs Administrator-Zugang
CurrentUser/Root Aktuelle vom Benutzer als vertrauenswürdig eingestufte Stamm-CAs Zugriff auf Benutzerebene

Hinweis

Beim Hosten in IIS muss die Anwendungspoolidentität über Lesezugriff auf den privaten Schlüssel des Zertifikats verfügen. Sie können dies mithilfe der Option "Private Schlüssel verwalten " im MMC-Snap-In "Zertifikate" gewähren.


Vom Dateipfad

Sie können ein Zertifikat direkt aus einer .pfx (PKCS#12)-Datei auf dem Datenträger laden.

Warnung

Das Speichern von Zertifikatdateien auf dem Datenträger mit Kennwörtern in der Konfiguration wird für die Produktion nicht empfohlen. Verwenden Sie diesen Ansatz nur für die lokale Entwicklung oder in Umgebungen, in denen das Dateisystem gesichert ist (z. B. bereitgestellte geheime Schlüssel in Containern).

Konfiguration

Fügen Sie den Zertifikatdateipfad und das Kennwort zu Ihrem appsettings.json:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "Path",
        "CertificateDiskPath": "/path/to/certificate.pfx",
        "CertificatePassword": "your-certificate-password"
      }
    ]
  }
}
Eigentum Beschreibung
SourceType Muss "Path" sein.
CertificateDiskPath Absoluter oder relativer Pfad zur .pfx Datei.
CertificatePassword Kennwort für die .pfx Datei. Wenn das Zertifikat kein Kennwort aufweist, lassen Sie diese Eigenschaft aus, oder legen Sie sie auf eine leere Zeichenfolge fest.

Tipp

Um zu vermeiden, dass das Kennwort im Klartext in appsettings.json gespeichert wird, verweisen Sie darauf aus einer Umgebungsvariablen oder einem Secrets-Manager.

Verwendung von .NET-Benutzergeheimnissen (Entwicklung):

dotnet user-secrets set "AzureAd:ClientCertificates:0:CertificatePassword" "your-password"

Verwenden einer Umgebungsvariable:

export AzureAd__ClientCertificates__0__CertificatePassword="your-password"

Von Base64-enkodiertem Wert

Sie können das Zertifikat als base64-codierte Zeichenfolge bereitstellen. Dieser Ansatz ist nützlich, wenn Sie Zertifikate über Umgebungsvariablen, Kubernetes-Schlüssel oder CI/CD-Pipelinevariablen einfügen.

Konfiguration

Fügen Sie den Base64-codierten Zertifikatwert zu Ihrem appsettings.json:

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "your-tenant-id",
    "ClientId": "your-client-id",

    "ClientCertificates": [
      {
        "SourceType": "Base64Encoded",
        "Base64EncodedValue": "MIIKcQIBAzCCCi0GCSqGSIb3DQEHAaCCCh4Egg..."
      }
    ]
  }
}
Eigentum Beschreibung
SourceType Muss "Base64Encoded" sein.
Base64EncodedValue Das vollständige Zertifikat (einschließlich privatem Schlüssel) codiert als Base64-Zeichenfolge.

Generieren des Base64-Werts

Konvertieren einer .pfx Datei in eine Base64-Zeichenfolge:

PowerShell:

$certBytes = [System.IO.File]::ReadAllBytes("path/to/certificate.pfx")
$base64 = [System.Convert]::ToBase64String($certBytes)
$base64 | Set-Clipboard  # Copies to clipboard

Bash:

base64 -w 0 path/to/certificate.pfx

Verwendung mit Geheimschlüsseln von Kubernetes

Speichern Sie das Base64-codierte Zertifikat in einem Kubernetes-Schlüssel, und ordnen Sie es einer Umgebungsvariable zu:

apiVersion: v1
kind: Secret
metadata:
  name: app-cert-secret
type: Opaque
data:
  AzureAd__ClientCertificates__0__Base64EncodedValue: <base64-encoded-pfx>

Verweisen Sie in Ihrer Bereitstellung auf das Geheimnis:

env:
  - name: AzureAd__ClientCertificates__0__SourceType
    value: "Base64Encoded"
  - name: AzureAd__ClientCertificates__0__Base64EncodedValue
    valueFrom:
      secretKeyRef:
        name: app-cert-secret
        key: AzureAd__ClientCertificates__0__Base64EncodedValue

Verwendung in CI/CD-Pipelines

Speichern Sie in Azure DevOps oder GitHub Actions das base64-codierte Zertifikat als geheime Variable, und legen Sie es dann zur Laufzeit als Umgebungsvariable fest.

GitHub Actions beispiel:

env:
  AzureAd__ClientCertificates__0__SourceType: "Base64Encoded"
  AzureAd__ClientCertificates__0__Base64EncodedValue: ${{ secrets.APP_CERTIFICATE_BASE64 }}

Azure DevOps beispiel:

variables:
  AzureAd__ClientCertificates__0__SourceType: "Base64Encoded"
  AzureAd__ClientCertificates__0__Base64EncodedValue: $(AppCertificateBase64)

Von Bedeutung

Obwohl das Zertifikat base64-codiert ist, enthält es den privaten Schlüssel und muss als geheimer Schlüssel behandelt werden. Verwenden Sie immer geheime Variablen in CI/CD-Pipelines – übernehmen Sie niemals Base64-codierte Zertifikate zur Quellcodeverwaltung.


Konfigurieren von Zertifikaten im C#-Code

Zusätzlich zur JSON-Konfiguration können Sie Zertifikatanmeldeinformationen programmgesteuert mithilfe der klasse CredentialDescription aus Microsoft.Identity.Abstractions konfigurieren.

Hilfsmethoden

Die CredentialDescription Klasse stellt statische Hilfsmethoden für jeden Zertifikatquelltyp bereit:

using Microsoft.Identity.Abstractions;

// From Azure Key Vault
var kvCredential = CredentialDescription.FromKeyVault(
    "https://your-keyvault-name.vault.azure.net",
    "your-certificate-name");

// From certificate store (by thumbprint)
var thumbprintCredential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    thumbprint: "A1B2C3D4E5F6A1B2C3D4E5F6A1B2C3D4E5F6A1B2");

// From certificate store (by distinguished name)
var dnCredential = CredentialDescription.FromCertificateStore(
    "CurrentUser/My",
    distinguishedName: "CN=MyAppCertificate");

// From file path
var pathCredential = CredentialDescription.FromCertificatePath(
    "/path/to/certificate.pfx",
    "your-certificate-password");

// From Base64-encoded string
var base64Credential = CredentialDescription.FromBase64String(
    "MIIKcQIBAzCCCi0GCSqGSIb3DQEHAaCCCh4Egg...");

Verwendung in ASP.NET Core

Übergeben Sie die Beschreibungen der Anmeldeinformationen direkt beim Konfigurieren der Authentifizierung:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        options.Instance = "https://login.microsoftonline.com/";
        options.TenantId = "your-tenant-id";
        options.ClientId = "your-client-id";
        options.ClientCredentials = new[]
        {
            CredentialDescription.FromKeyVault(
                "https://your-keyvault-name.vault.azure.net",
                "your-certificate-name")
        };
    });

Tipp

Die Hilfsmethoden entsprechen dem manuellen Festlegen von Eigenschaften für ein CredentialDescription Objekt. Sie bieten eine prägnantere Syntax, wenn Sie Anmeldeinformationen im Code anstelle von appsettings.json konfigurieren.


Erstellen eines selbstsignierten Zertifikats für die Entwicklung

Für lokale Entwicklung und Tests können Sie ein selbstsigniertes Zertifikat erstellen. Verwenden Sie keine selbstsignierten Zertifikate in der Produktion.

Verwenden von PowerShell (Windows)

Führen Sie die folgenden Befehle aus, um ein selbstsigniertes Zertifikat zu erstellen, zu exportieren und den Fingerabdruck anzuzeigen:

$cert = New-SelfSignedCertificate `
  -Subject "CN=MyDevCertificate" `
  -CertStoreLocation "Cert:\CurrentUser\My" `
  -KeyExportPolicy Exportable `
  -KeySpec Signature `
  -KeyLength 2048 `
  -KeyAlgorithm RSA `
  -HashAlgorithm SHA256 `
  -NotAfter (Get-Date).AddYears(2)

# Export the .pfx file (with private key)
$password = ConvertTo-SecureString -String "YourPassword123!" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath ".\MyDevCertificate.pfx" -Password $password

# Export the .cer file (public key only — for app registration)
Export-Certificate -Cert $cert -FilePath ".\MyDevCertificate.cer"

# Display the thumbprint
Write-Host "Thumbprint: $($cert.Thumbprint)"

Verwenden von OpenSSL (plattformübergreifend)

Führen Sie die folgenden Befehle aus, um ein Zertifikat zu generieren, es als .pfx Datei zu packen und den Fingerabdruck anzuzeigen:

# Generate a self-signed certificate and private key
openssl req -x509 -newkey rsa:2048 \
  -keyout key.pem -out cert.pem \
  -days 730 -nodes \
  -subj "/CN=MyDevCertificate"

# Package into a .pfx file
openssl pkcs12 -export \
  -out MyDevCertificate.pfx \
  -inkey key.pem -in cert.pem \
  -passout pass:YourPassword123!

# Get the thumbprint
openssl x509 -in cert.pem -noout -fingerprint -sha1

Verwenden der .NET CLI

Exportieren eines HTTPS-Entwicklungszertifikats als .pfx Datei:

dotnet dev-certs https --export-path ./MyDevCertificate.pfx --password YourPassword123!

Hinweis

Der dotnet dev-certs Befehl generiert ein HTTPS-Entwicklungszertifikat. Sie kann zwar zum Testen des Ladens von Zertifikaten verwendet werden, ist jedoch in erster Linie für lokale HTTPS vorgesehen und eignet sich möglicherweise nicht für alle Authentifizierungstests.


Registrieren des Zertifikats in Microsoft Entra ID

Nachdem Sie ein Zertifikat erstellt oder erhalten haben, müssen Sie den öffentlichen Schlüssel bei Ihrer App-Registrierung in Microsoft Entra ID registrieren.

Verwenden des Azure-Portals

  1. Wechseln Sie zum portal Azure und navigieren Sie zu Microsoft Entra ID>App-Registrierungen.
  2. Wählen Sie Ihre Anwendung aus.
  3. Wählen Sie Zertifikate und Geheimnisse>Zertifikate>Zertifikat hochladen aus.
  4. Laden Sie die .cer oder .pem Datei hoch, die nur den öffentlichen Schlüssel enthält. Laden Sie die .pfx Datei nicht hoch, die den privaten Schlüssel enthält.
  5. Notieren Sie sich den Fingerabdruckwert , der nach dem Upload angezeigt wird . Möglicherweise benötigen Sie ihn für die Konfiguration.

Verwenden von Azure CLI

az ad app credential reset \
  --id <application-client-id> \
  --cert @/path/to/certificate.pem \
  --append

Das --append Flag fügt das Zertifikat hinzu, ohne vorhandene Anmeldeinformationen zu entfernen.

Verwenden von Microsoft Graph PowerShell

$certData = [System.IO.File]::ReadAllBytes(".\MyDevCertificate.cer")
$base64Cert = [System.Convert]::ToBase64String($certData)

$keyCredential = @{
    type = "AsymmetricX509Cert"
    usage = "Verify"
    key = [System.Convert]::FromBase64String($base64Cert)
    displayName = "MyAppCertificate"
}

Update-MgApplication -ApplicationId <app-object-id> -KeyCredentials @($keyCredential)

Von Bedeutung

Laden Sie nur den öffentlichen Schlüssel (.cer oder .pem) in die App-Registrierung hoch. Laden Sie die .pfx Datei niemals hoch, die den privaten Schlüssel enthält. Der private Schlüssel muss sicher gespeichert und nur für Ihre Anwendung zugänglich sein.


Rotation für Zertifikate

Die Zertifikatrotation ersetzt ein ablaufendes Zertifikat durch ein neues Zertifikat, bevor es abläuft, und stellt einen unterbrechungsfreien Dienst sicher.

Strategie: Überlappende Zertifikate

Der empfohlene Ansatz verwendet überlappende Gültigkeitszeiträume:

  1. Generieren Sie ein neues Zertifikat , bevor das aktuelle Zertifikat abläuft (z. B. 30 bis 60 Tage im Voraus).
  2. Registern Sie das neue Zertifikat in Ihrer Microsoft Entra App-Registrierung zusammen mit dem vorhandenen. Microsoft Entra ID akzeptiert Token, die von einem registrierten Zertifikat signiert sind.
  3. Stellen Sie das neue Zertifikat bereit in der Zertifikatsquelle Ihrer Anwendung (Key Vault, Zertifikatspeicher usw.).
  4. Aktualisieren Sie die Konfiguration (falls erforderlich), um auf das neue Zertifikat zu verweisen.
  5. Entfernen Sie das alte Zertifikat aus der App-Registrierung, nachdem Sie bestätigt haben, dass alle Instanzen das neue Zertifikat verwenden.

Mehrere Zertifikate in der Konfiguration

Microsoft. Identity.Web unterstützt das Angeben mehrerer Zertifikate. Die Bibliothek probiert sie der Reihe nach aus und verwendet das erste gültige Zertifikat.

{
  "AzureAd": {
    "ClientCertificates": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "new-cert-2026"
      },
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://your-keyvault.vault.azure.net",
        "KeyVaultCertificateName": "current-cert-2025"
      }
    ]
  }
}

Automatische Rotation mit Azure Key Vault

Azure Key Vault unterstützt die automatische Zertifikatverlängerung. Wenn Sie die automatische Drehung aktivieren:

  1. Key Vault generiert vor Ablauf eine neue Zertifikatversion.
  2. Microsoft. Identity.Web nimmt die neueste Version automatisch auf (beim nächsten Zertifikatabruf).
  3. Die alte Zertifikatversion bleibt gültig, bis sie abläuft.

So konfigurieren Sie die automatische Drehung in Key Vault:

az keyvault certificate set-attributes \
  --vault-name your-keyvault-name \
  --name your-certificate-name \
  --policy @rotation-policy.json

Tipp

Bei Anwendungen mit lang andauernden Prozessen sollten Sie eine regelmäßige Zertifikataktualisierung implementieren. Microsoft.Identity.Web speichert das Zertifikat im Arbeitsspeicher. Wenn das Zertifikat in Key Vault gedreht wird, nimmt die Anwendung das neue Zertifikat bei der nächsten Erstellung einer neuen vertraulichen MSAL-Clientanwendungsinstanz auf.


Beheben von Zertifikatfehlern

In diesem Abschnitt werden allgemeine Fehlermeldungen und deren Lösungen aufgeführt.

Häufige Fehler

Das Zertifikat wurde nicht gefunden

Fehlermeldung:

System.Security.Cryptography.CryptographicException: The certificate cannot be found.

Mögliche Ursachen und Lösungen:

Ursache Lösung
Falscher Fingerabdruck Überprüfen Sie, ob der Fingerabdruck in Ihrer Konfiguration mit dem installierten Zertifikat übereinstimmt. Entfernen Sie alle ausgeblendeten Zeichen (Leerzeichen, unsichtbares Unicode).
Falscher Zertifikatspeicher Bestätigen Sie, dass CertificateStorePath übereinstimmt, wobei das Zertifikat installiert ist (CurrentUser/My vs LocalMachine/My).
Zertifikat nicht installiert Importieren Sie das Zertifikat mit certmgr.msc (CurrentUser) oder certlm.msc (LocalMachine) in den richtigen Speicher.
Key Vault Namensabweichung Überprüfen Sie, ob KeyVaultUrl und KeyVaultCertificateName korrekt sind.
Datei nicht gefunden Bestätigen Sie, dass CertificateDiskPath auf eine vorhandene .pfx Datei verweist und die Anwendung Lesezugriff hat.

Zugriff verweigert auf Key Vault

Fehlermeldung:

Azure.RequestFailedException: The user, group or application '...' does not have certificates get permission on key vault '...'

Lösungen :

  • Überprüfen Sie, ob Zugriffsrichtlinien Berechtigungen für get und geheime Schlüssel erteilen.
  • Stellen Sie bei Verwendung Azure RBAC sicher, dass die Identität über die Rolle Key Vault Certificate User verfügt.
  • Bestätigen Sie bei verwalteter Identität, dass die Identität aktiviert ist und die richtige Objekt-ID in der Richtlinie verwendet wird.

Auf den privaten Zertifikatschlüssel kann nicht zugegriffen werden

Fehlermeldung:

System.Security.Cryptography.CryptographicException: Keyset does not exist.

Lösungen :

  • Stellen Sie bei Windows/IIS sicher, dass die Anwendungspoolidentität über read Zugriff auf den privaten Schlüssel verfügt. Verwenden Sie das MMC-Snap-In "Zertifikate", um zugriff über "Private Schlüssel verwalten" zu gewähren.
  • Überprüfen Sie unter Linux, ob die .pfx Datei über entsprechende Dateiberechtigungen verfügt (chmod 600).
  • Stellen Sie sicher, dass das Zertifikat mit dem privaten Schlüssel (Export-PfxCertificate oder openssl pkcs12 -export) exportiert wurde.

Das Zertifikat ist abgelaufen.

Fehlermeldung:

AADSTS700027: Client assertion contains an invalid signature. The key was expired.

Lösungen :

  • Überprüfen Sie den Gültigkeitszeitraum des Zertifikats: openssl x509 -in cert.pem -noout -dates.
  • Generieren Sie ein neues Zertifikat, und aktualisieren Sie sowohl die App-Registrierung als auch die Konfiguration Ihrer Anwendung.
  • Implementieren Sie die Zertifikatrotation, um zukünftige Ablaufprobleme zu verhindern. Siehe Zertifikatswechsel.

Falsches Zertifikatkennwort

Fehlermeldung:

System.Security.Cryptography.CryptographicException: The specified network password is not correct.

Lösungen :

  • Überprüfen Sie, ob CertificatePassword mit dem Kennwort übereinstimmt, das beim Exportieren der .pfx Datei verwendet wurde.
  • Wenn Sie Umgebungsvariablen verwenden, überprüfen Sie auf Codierungsprobleme (nachfolgende Zeilenumbrüche, Sonderzeichen).
  • Exportieren Sie das Zertifikat mit einem bekannten Kennwort erneut.

Diagnoseprüfliste

Verwenden Sie diese Checkliste, wenn die Zertifikatauthentifizierung nicht funktioniert:

  • [ ] Gültigkeit des Zertifikats — Ist das Zertifikat innerhalb seiner Gültigkeitsdauer? Überprüfen Sie die Datumsangaben von NotBefore und NotAfter.
  • [ ] App-Registrierung – Wird der öffentliche Schlüssel des Zertifikats in die richtige App-Registrierung hochgeladen?
  • [ ] Fingerabdruck-Übereinstimmung – Stimmt der Fingerabdruck in Ihrer Konfiguration mit dem Zertifikat in der App-Registrierung überein?
  • [ ] Zugriff auf private Schlüssel – Kann der Anwendungsprozess den privaten Schlüssel des Zertifikats lesen?
  • [ ] Key Vault Berechtigungen — Für Key Vault Quellen verfügt die Identität über berechtigungen certificates/get und secrets/get?
  • [ ] Konfigurationsabschnitt – Befindet sich die Zertifikatkonfiguration im richtigen Abschnitt (AzureAd oder AzureAdB2C)?
  • [ ] NuGet-Pakete — Ist Microsoft.Identity.Web auf dem neuesten Stand? Ältere Versionen unterstützen möglicherweise bestimmte Zertifikatquellentypen nicht.

Aktivieren der Protokollierung

Um detaillierte Diagnoseinformationen zu erhalten, aktivieren Sie die MSAL-Protokollierung:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd")
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches();

builder.Logging.AddFilter("Microsoft.Identity", LogLevel.Debug);

Überprüfen Sie die Protokolle auf Nachrichten zum Laden von Zertifikaten, zur Erstellung von Client assertionen und zum Tokenerwerb.