2

Wir haben festgestellt, dass diese Ausnahme zeitweise auftritt, als unser Azure App Service in eine App Service-Umgebung verschoben wurde. Wir verwenden Identity Server 4 und die Ausnahme tritt während der Tokensignierung auf. Dies ist in der unten stehenden Liste ersichtlich.OpenCSP ist fehlgeschlagen mit Fehlercode 2148073494

Die Unterzeichnung cert wird nie zu einem cert Speicher gespeichert, wird es aus einer Datenbank als Byte-Array geladen:

new X509Certificate2(rawData, password, 
        X509KeyStorageFlags.MachineKeySet | 
        X509KeyStorageFlags.PersistKeySet); 

Diese Referenzen erscheinen das gleiche Problem sein:

.NET Core X509Certificate2.PrivateKey throws nte_bad_keyset error

https://github.com/dotnet/corefx/issues/2583

Bearbeiten: Ursprünglich dachten wir, dies sei etwas Spezifisches für den App Service Env in Azure, aber jetzt sehen wir die Ausnahme in Standard-App-Services. Als Test haben wir einen Azure-Web-Job erstellt, der ein Zertifikat aus einem Byte-Array lädt und JWT-Token erstellt (die einen privaten Schlüssel zum Signieren benötigen). Dies reprosiert den Fehler. Außerdem wird der Azure-Web-Job nicht einmal ausgeführt, wenn bestimmte Flags an den Ctor übergeben werden (z. B. X509KeyStorageFlags.UserKeySet).

Stapelüberwachung ist das gleiche jedes Mal: ​​

System.Security.Cryptography.CryptographicException: 
    at Internal.NativeCrypto.CapiHelper.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) 
    at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeProvHandle() 
    at System.Security.Cryptography.RSACryptoServiceProvider.get_SafeKeyHandle() 
    at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 keySize, CspParameters parameters, Boolean useDefaultKeySize) 
    at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters) 
    at Internal.Cryptography.Pal.CertificatePal.<>c.<GetRSAPrivateKey>b__59_0(CspParameters csp) 
    at Internal.Cryptography.Pal.CertificatePal.GetPrivateKey[T](Func`2 createCsp, Func`2 createCng) 
    at Internal.Cryptography.Pal.CertificatePal.GetRSAPrivateKey() 
    at Internal.Cryptography.Pal.CertificateExtensionsCommon.GetPrivateKey[T](X509Certificate2 certificate, Predicate`1 matchesConstraints) 
    at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_PrivateKey() 
    at Microsoft.IdentityModel.Tokens.X509SecurityKey.get_HasPrivateKey() 
    at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider.HasPrivateKey(SecurityKey key) 
    at Microsoft.IdentityModel.Tokens.AsymmetricSignatureProvider..ctor(SecurityKey key, String algorithm, Boolean willCreateSignatures) 
    at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateSignatureProvider(SecurityKey key, String algorithm, Boolean willCreateSignatures) 
    at Microsoft.IdentityModel.Tokens.CryptoProviderFactory.CreateForSigning(SecurityKey key, String algorithm) 
    at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.CreateEncodedSignature(String input, SigningCredentials signingCredentials) 
    at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.WriteToken(SecurityToken token) 
    at IdentityServer4.Services.DefaultTokenCreationService.CreateJwtAsync(JwtSecurityToken jwt) 
    at IdentityServer4.Services.DefaultTokenCreationService.<CreateTokenAsync>d__3.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Services.DefaultTokenService.<CreateSecurityTokenAsync>d__9.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) 
    at IdentityServer4.ResponseHandling.TokenResponseGenerator.<CreateAccessTokenAsync>d__10.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessTokenRequestAsync>d__8.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.ResponseHandling.TokenResponseGenerator.<ProcessAsync>d__6.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Endpoints.TokenEndpoint.<ProcessTokenRequestAsync>d__6.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Endpoints.TokenEndpoint.<ProcessAsync>d__5.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Hosting.IdentityServerMiddleware.<Invoke>d__3.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Hosting.FederatedSignOutMiddleware.<Invoke>d__6.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Hosting.AuthenticationMiddleware.<Invoke>d__2.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.<Invoke>d__7.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at IdentityServer4.Hosting.BaseUrlMiddleware.<Invoke>d__2.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware`1.<Invoke>d__18.MoveNext() 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.ApplicationInsights.AspNetCore.ExceptionTrackingMiddleware.<Invoke>d__4.MoveNext() 

Antwort

1

Um das Problem zu lösen, haben wir von X509-Zertifikaten (X509Certificate2) zu RSA generierte Schlüssel (RSACryptoServiceProvider) gewechselt. Identity Server 4 unterstützt beides. Die Ausnahme tritt nicht mehr auf.

+0

Können Sie ein Beispiel dafür angeben, wie Sie das RSA-Zeug zum Laufen gebracht haben? –

+2

@mithun_daa Im Wesentlichen generieren wir ein RSA-Schlüsselpaar (http://stackoverflow.com/a/42006084/393179), konvertieren den Schlüssel in einen Microsoft.IdentityModel.Tokens.SecurityKey und übergeben diesen an Identity Server 4, wenn er eine Signatur anfordert Schlüssel und Validierungsschlüssel. –

0

Dieser Fehler bedeutet, dass irgendwo, nachdem das Zertifikat gelernt, wo der Schlüssel gelöscht wurde gespeichert wurde.

  • Vielleicht ruft etwas CngKey.Delete
  • Vielleicht PersistKeyInCsp-false etwas wird es in einem RSACryptoServiceProvider Klonen und Einstellung.
  • Vielleicht ist etwas nur aufräumen das Maschinenschlüssel Verzeichnis nach der Tat.
  • Der andere (sehr seltene) bekannte Fall ist, wo zwei Threads den PFX parallel laden (sie müssen nicht in demselben Prozess sein), wobei einer von ihnen nicht PersistKeySet zum Importzeitpunkt aktiviert hat.

Wenn Sie die Zertifikate laden und verwerfen, sollten Sie PersistKeySet nicht wirklich festlegen. Jedes Mal, wenn Sie ein PFX öffnen, wird für jeden darin enthaltenen privaten Schlüssel eine andere Datei auf der Festplatte erstellt ... diese Dateien werden normal bereinigt (solange der Prozess nicht abnormal beendet wird), aber PersistKeySet verhindert, dass die Bereinigung stattfindet.

Wenn nichts in der Code-Analyse die zwei offensichtlichen Schlüssellöschungsorte aufdeckt (PersistKeyInCsp=false ist die hinterhältige), dann müssen Sie die Empfehlungen für das Dateisystem-Audit in .NET Core X509Certificate2.PrivateKey throws nte_bad_keyset error befolgen.

+0

danke für die schnelle Antwort. Ich habe das 'X509KeyStorageFlags.PersistKeySet' Flag entfernt, aber die Ausnahme tritt immer noch auf. –

+0

bartonjs: Ich habe eine andere Frage gefunden, in der Sie erwähnen, dass ein 'X509Certificate2' erzeugt werden kann, mit einem Flag, um anzuzeigen, dass der private Schlüssel nicht auf der Festplatte gespeichert werden soll. Wie wird dies in .NET Core getan? Http: //stackoverflow.com/questions/40536601/azure-web-application-new-x509certificate2-causing-system-security-cryptograph –

+0

Sie müssen wahrscheinlich aktivieren, dann . Für ephemere Ladevorgänge, die nur bei nächtlichen/inoffiziellen Builds verfügbar sind: Verweise auf die aktuellen Dailies von .NET Core und ändere dein Ziel-TFM von netstandardxxx auf netcoreapp11. Dann sollte 'X509KeyStorageFlags.EphemerKeySet' verfügbar sein. – bartonjs

0

Vielleicht haben Sie IIS keinen Zugriff auf Ihre privaten Schlüssel gewährt. Ich hatte denselben Fehler, aber es war notwendig, X509 Certs anstelle von Schlüsseln zu verwenden. Ich habe gerade eine Erlaubnis erteilt, private Schlüssel vom cert für IIS_IUSRS auf MMC zu lesen. Es hilft mir.

Es gibt eine vollständige Antwort von @thames: How to give ASP.NET access to a private key in a certificate in the certificate store?

UPD:

Schritt-für-Schritt-Anleitung:

  1. erstellen/Kauf cert mit einem privaten Schlüssel
  2. Import cert auf "Lokaler Computer" Konto (nicht "Aktueller Benutzer"). Aktivieren Sie im Import-Assistenten die Option "Zulassen, dass ein privater Schlüssel exportiert wird".
  3. Öffnen Sie die MMC-Konsole und fügen Sie das Snap-In für Zertifikate hinzu. Wählen Sie "Computerkonto".
  4. Finden Sie Ihr Zertifikat und klicken Sie mit der rechten Maustaste darauf. Wählen Sie "Alle Aufgaben"> "Private Schlüssel verwalten"
  5. Hinzufügen Lesezugriff auf Ihren Schlüssel für Benutzer IIS_IUSRS oder IIS AppPool \ <AppPoolName> (hängt von IIS-Version und Konfiguration ab. Es ist besser, die Schaltfläche "Erweitert" zu verwenden, um alle möglichen anzuzeigen Optionen)
  6. Starten Sie Ihre Anwendung neu
+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/16834792) –

+0

Dieser Link enthält nur eine Schritt-für-Schritt-Anleitung. Ich denke, es gibt genug Informationen, um die Frage des Autors zu beantworten. Aber ok, ich werde eine Antwort bearbeiten –

+0

Die Frage ist über IdentityServer, die Verwendung von Zertifikaten anders als IIS –

Verwandte Themen