Ich habe einen Code, der einen Webdienst eines Drittanbieters aufruft, der mit der X.509-Zertifizierung gesichert ist.
Wenn ich den Code direkt aufrufe (mit einem Unit-Test), funktioniert er problemlos.
Bei der Bereitstellung wird dieser Code über einen WCF-Dienst aufgerufen. Ich habe einen zweiten Komponententest hinzugefügt, der den WCF-Dienst aufruft. Dies schlägt jedoch mit einer CryptographicException
Meldung fehl , "Keyset does not exist"
wenn ich eine Methode für den Webdienst eines Drittanbieters aufrufe.
Ich gehe davon aus, dass dies darauf zurückzuführen ist, dass mein WCF-Dienst versucht, den Webdienst eines Drittanbieters mit einem anderen Benutzer als mir selbst aufzurufen.
Kann jemand zusätzliches Licht auf dieses Thema werfen?
Dies liegt höchstwahrscheinlich daran, dass der IIS-Benutzer keinen Zugriff auf den privaten Schlüssel für Ihr Zertifikat hat. Sie können dies einstellen, indem Sie die folgenden Schritte ausführen ...
quelle
Ich hatte letzte Nacht ein identisches Problem. Die Berechtigungen für den privaten Schlüssel wurden korrekt festgelegt. Anscheinend war alles in Ordnung, außer dass der Keyset-Fehler nicht vorhanden ist. Am Ende stellte sich heraus, dass das Zertifikat zuerst in den aktuellen Benutzerspeicher importiert und dann in den lokalen Computerspeicher verschoben wurde. Der private Schlüssel, der sich noch im
C: \ Dokumente und Einstellungen \ Administrator ...
anstatt
C: \ Dokumente und Einstellungen \ Alle Benutzer ...
Obwohl die Berechtigungen für den Schlüssel korrekt festgelegt wurden, konnte ASPNET nicht darauf zugreifen. Als wir das Zertifikat erneut importierten, sodass der private Schlüssel im Zweig Alle Benutzer abgelegt wurde, verschwand das Problem.
quelle
So lösen Sie das Problem "Keyset existiert nicht" beim Surfen über IIS: Möglicherweise ist dies eine private Berechtigung
So zeigen Sie die Berechtigung an und geben sie ab:
Um die Erlaubnis zu geben:
quelle
Hatte das gleiche Problem beim Versuch, die WCF-App in Visual Studio auszuführen. Es wurde behoben, indem Visual Studio als Administrator ausgeführt wurde.
quelle
Ich bin mit diesem Problem konfrontiert. Meine Zertifikate hatten einen privaten Schlüssel, aber ich habe diesen Fehler erhalten ( "Keyset existiert nicht" ).
Ursache: Ihre Website wird unter dem Konto "Netzwerkdienste" ausgeführt oder verfügt über weniger Berechtigungen.
Lösung : Ändern Sie die Identität des Anwendungspools in "Lokales System", setzen Sie IIS zurück und überprüfen Sie es erneut. Wenn es funktioniert, handelt es sich um ein Problem mit Berechtigungen / weniger Berechtigungen. Sie können sich dann auch als andere Konten ausgeben.
quelle
Völlig frustrierend, hatte ich das gleiche Problem und versuchte die meisten der oben genannten. Das exportierte Zertifikat hatte die Berechtigung zum Einlesen der Datei
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, es stellte sich jedoch heraus, dass es keine Berechtigung für den Ordner hatte. Fügte es hinzu und es funktioniertequelle
IISAPPPool\www.mywebsite.com
welches der Windows-Benutzername für meinen Appool ist und es hat funktioniert :-)Ich habe auch genau ein ähnliches Problem. Ich habe den Befehl verwendet
Das Ergebnis zeigt, dass sich der private Schlüssel im Ordner c: \ ProgramData anstelle von C: \ Documents and Settngs \ All users befindet.
Wenn ich den Schlüssel aus dem Ordner c: \ ProgramData lösche, wird der Befehl findPrivatekey erneut erfolgreich ausgeführt. dh. es findet den Schlüssel nicht.
Aber wenn ich den gleichen Schlüssel suche, der von einem früheren Befehl zurückgegeben wurde, kann ich den Schlüssel immer noch finden
C: \ Dokumente und Einstellungen \ Alle Benutzer ..
Nach meinem Verständnis findet IIS oder die gehostete WCF den privaten Schlüssel nicht unter C: \ Dokumente und Einstellungen \ Alle Benutzer.
quelle
Ich habe die Fehlermeldung erhalten: CryptographicException 'Keyset existiert nicht', wenn ich die MVC-Anwendung ausführe.
Die Lösung bestand darin, dem Konto, unter dem der Anwendungspool ausgeführt wird, Zugriff auf die persönlichen Zertifikate zu gewähren. In meinem Fall war es das Hinzufügen von IIS_IUSRS und die Auswahl des richtigen Speicherorts, um dieses Problem zu beheben.
quelle
Die Antwort von Steve Sheldon hat das Problem für mich behoben. Da ich jedoch Zertifikatsberechtigungen ohne GUI schreibe, brauchte ich eine skriptfähige Lösung. Ich bemühte mich herauszufinden, wo mein privater Schlüssel gespeichert war. Der private Schlüssel war nicht in
-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, schließlich stellte ich fest, dass er tatsächlich in warC:\ProgramData\Microsoft\Crypto\Keys
. Im Folgenden beschreibe ich, wie ich das herausgefunden habe:Ich habe es versucht,
FindPrivateKey
aber es konnte den privaten Schlüssel nicht finden, und mit Powershell$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
war das null / leer.Zum Glück
certutil -store my
habe ich das Zertifikat aufgelistet und mir die Details gegeben, die ich zum Schreiben der Lösung benötigte.Ich habe dann den
c\ProgramData\Microsoft\Crypto\
Ordner gescannt und die Datei 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a in C: \ ProgramData \ Microsoft \ Crypto \ Keys gefunden .Indem ich meinem Dienstkonto Lesezugriff auf diese Datei gewährte, wurden die Probleme für mich behoben
quelle
Ich habe einige fehlende Informationen gefunden, die mir geholfen haben, meinen WCF-Dienst mit Sicherheit auf Nachrichtenebene über das "Keyset existiert nicht" hinaus zu erhalten, auf das ich trotz der Erteilung von Berechtigungen für alle aus den Beispielen im Internet generierten Schlüssel immer wieder gestoßen bin.
Ich habe schließlich den privaten Schlüssel in den Speicher für vertrauenswürdige Personen auf dem lokalen Computer importiert und dem privaten Schlüssel dann die richtigen Berechtigungen erteilt.
Dies füllte die Lücken für mich und ermöglichte mir schließlich, den WCF-Dienst mit Sicherheit auf Nachrichtenebene zu implementieren. Ich baue eine WCF, die HIPPA-konform sein muss.
quelle
Ich habe gerade mein Zertifikat auf dem lokalen Computer neu installiert und dann funktioniert es einwandfrei
quelle
Wenn Sie ApplicationPoolIdentity für Ihren Anwendungspool verwenden, haben Sie möglicherweise Probleme beim Angeben der Berechtigung für diesen "virtuellen" Benutzer im Registrierungseditor (es gibt keinen solchen Benutzer im System).
Verwenden Sie also das Befehlszeilentool subinacl , mit dem Sie die Registrierungs-ACLs festlegen können, oder ähnliches.
quelle
Ich wollte nur eine Antwort auf die Überprüfung der geistigen Gesundheit hinzufügen. Ich habe genau den gleichen Fehler erhalten, selbst nachdem ich die Zertifikate in den richtigen Speichern auf meinen Computern installiert hatte und über die richtigen Sicherheitsrechte für den Client verfügte. Es stellte sich heraus, dass ich mein clientCertificate und mein Service Certificate verwechselt habe. Wenn Sie alle oben genannten Punkte ausprobiert haben, würde ich überprüfen, ob Sie diese beiden gerade haben. Sobald ich das getan habe, hat meine Anwendung den Webdienst erfolgreich aufgerufen. Wieder nur ein Sanity Checker.
quelle
Dieser Fehler wurde bei Verwendung des openAM-Fedlets auf IIS7 empfangen
Durch Ändern des Benutzerkontos für die Standardwebsite wurde das Problem behoben. Idealerweise möchten Sie, dass dies ein Dienstkonto ist. Vielleicht sogar das IUSR-Konto. Schlagen Sie vor, nach Methoden für die IIS-Härtung zu suchen, um sie vollständig festzunageln.
quelle
Ich habe dies in meinem Service Fabric-Projekt getroffen, nachdem das zur Authentifizierung bei unserem Schlüsseldepot verwendete Zertifikat abgelaufen und gedreht wurde, wodurch sich der Fingerabdruck geändert hat. Ich habe diesen Fehler erhalten, weil ich die Aktualisierung des Fingerabdrucks in der Datei applicationManifest.xml in diesem Block verpasst habe, der genau das tut, was andere Antworten vorgeschlagen haben - um NETWORK SERVICE (auf dem alle meine Exes als Standardkonfiguration für Azure Servicefabric Cluster ausgeführt werden) zu erteilen Greifen Sie auf den Speicherort LOCALMACHINE \ MY cert zu.
Beachten Sie den Attributwert "X509FindValue".
quelle
Dies ist die einzige Lösung, die für mich funktioniert hat.
Referenz 1
Referenz 2
quelle
quelle