CryptographicException wurde nicht behandelt: Das System kann die angegebene Datei nicht finden

70

Ich versuche, die Geheimnisse der SSL-Kommunikation zu verstehen und habe auf dieser Website ein großartiges Tutorial gefunden . Ich habe versucht, mein eigenes Zertifikat zu testen. Mit Visual Studio 2012 habe ich einfach eine vorhandene Datei hinzugefügt (mein Zertifikat im PFX-Format) und dann die Einstellungen für "Zertifikat" und "Kennwort" in app.config geändert. Beim Versuch, es auszuführen, wurde jedoch eine Fehlermeldung angezeigt:

CryptographicException wurde nicht behandelt: Das System kann die angegebene Datei nicht finden

Dann habe ich dasselbe in meinem Webdienst versucht. Dort habe ich einige Details zum Fehler erhalten:

System.Security.Cryptography.CryptographicException: System cannot find specified file.

   at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr)
   at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertFileType(String fileName)
   at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
   v System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
   v TestServer.DataService.LoadSoap() v c:\Users\Administrator\Documents\Visual Studio 2012\Projects\TestServer\TestServer\DataService.asmx.cs:line 48

Ich habe diese Frage an den Autor des Artikels geschrieben, aber da seine letzte Antwort im März 2012 war, bin ich mir nicht sicher, ob er antworten wird. Wenn mir jemand bei diesem Problem helfen könnte, wäre ich sehr dankbar.

PS: Beim Exportieren des Zertifikats von .cer nach .pfx habe ich den Titel der exportierten Datei geändert. Obwohl ich bezweifle, dass es sich auf das Problem auswirkt, möchte ich es lieber erwähnen.

Sturm
quelle
1
Geben Sie den vollständigen Pfadnamen zur Datei an?
Gtrig
1
Wow ... jetzt fühle ich mich wie ein Vollidiot. Nachdem Sie den vollständigen Pfad angegeben haben, funktioniert es ... Nun, der Client sagt, dass das Zertifikat nicht gültig ist, aber das liegt wahrscheinlich daran, dass es für meinen alten Computer ausgestellt wurde. Also, danke ... Ich denke, dieses Thema kann als nicht konstruktiv abgeschlossen werden.
Sturm

Antworten:

229

Haben Sie im Anwendungspool in IIS Folgendes festgelegt?

  1. Wechseln Sie zum IIS-Manager
  2. Wechseln Sie zur Anwendungspoolinstanz
  3. Klicken Sie auf Erweiterte Einstellungen
  4. Setzen Sie unter Prozessmodell Benutzerprofil laden auf true

Weitere Informationen finden Sie in dieser Stapelfrage : Was genau passiert, wenn ich LoadUserProfile des IIS-Pools einstelle?

kein Logo
quelle
Danke mein Herr! Ich habe seit Monaten mit diesem Fehler zu kämpfen. Sie müssen den Server neu starten oder den IIS neu starten, um Zeit zu haben, bevor der Fehler erneut auftritt.
Miquel Coll
1
Ach du lieber Gott. Was für ein absurder Fehler! Ich habe versucht zu überprüfen und zu überprüfen und konnte nichts falsch mit dem Dateinamen finden. *** t Kryptographie-Ausnahme, die über falschen Dateipfad berichtet, obwohl dies nicht der
Fall
Wenn dies für Sie nicht funktioniert, überprüfen Sie einfach, ob Sie dies für den richtigen Anwendungspool auf true setzen (überprüfen Sie zuerst, welcher App-Pool Ihrer App zugewiesen ist)
Iman
1
In Azure: Verwenden Sie Anwendungseinstellungen -> Fügen Sie "WEBSITE_LOAD_USER_PROFILE" mit dem Wert "1" hinzu.
Hanzolo
13

Für diejenigen unter Ihnen, die beim Versuch, ein X509Certificate2 mithilfe der Importmethode zu importieren, die kryptografische Ausnahme erhalten haben, stellte ich fest, dass die Verwendung der Option Enum für MachineKeySet die Notwendigkeit zum Erstellen eines Benutzerkontexts in IIS umging und somit einfacher zu implementieren war.

X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
Salomon Arias
quelle
Tu das einfach und sei glücklich. Twerking mit IIS funktionierte in Windows 10 2004 nicht für mich. Ich habe jede mögliche Kombination ausprobiert. Dies funktionierte wie ein Zauber
Daniel Dolz
7

Durch Übergeben von CspParameters mit dem Flag csdMachineKeyKeyStore kann IIS die Einschränkung umgehen, die die Ausnahme auslöst.

CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(cspParams);

Ich habe hier eine Lösung gegründet:

Link zur Informationsquelle

Alejandro PC
quelle
Ich habe nicht genug Worte, um die Dankbarkeit zu beschreiben, die ich Ihnen gegenüber für diese einfache Lösung empfinde! Vielen Dank!! In meinem Fall hat lokal alles gut funktioniert, aber auf Azure wurde der Fehler ".. kann die angegebene Datei nicht finden" angezeigt. Dies hat es behoben
Reath
6

Da diese Frage ein hohes Suchranking aufweist, möchte ich eine Möglichkeit vorstellen, X509Certificate2 mit einem absoluten Pfad (den es nur akzeptiert) zu einer relativ lokalisierten pxf-Schlüsseldatei in einer ASP.net-Anwendung zu präsentieren.

    string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
m12lrpv
quelle
1
Epischer Fang. Es stellte sich heraus, dass der Grund für diesen Fehler darin bestand, dass mein Pfad zu meinem Zertifikat leicht abweicht.
Suamere
3

Sie müssen den absoluten Pfad anstelle des relativen Pfads angeben.

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"

quelle