2013-07-24 5 views
34

Ich versuche die Geheimnisse der SSL-Kommunikation zu umarmen und haben ein großes Tutorial auf this site gefunden. Ich habe versucht, mein eigenes Zertifikat zu testen. Mit Visual Studio 2012 habe ich einfach eine vorhandene Datei (mein Zertifikat im PFX-Format) hinzugefügt und dann die Einstellungen für "Zertifikat" und "Kennwort" in app.config geändert. Wenn jedoch versucht, es zu laufen, ich einen Fehler bekam:Cryptographic wurde nicht behandelt: System die angegebene Datei nicht finden kann

CryptographicException was unhandled: System cannot find the specified file

Dann habe ich versucht, das gleiche in meinem Web-Service. Dort bekam ich ein paar mehr Details über den Fehler:

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 diese Frage an den Autor des Artikels geschrieben haben, aber seit seiner letzten Antwort März 2012 war, ich bin nicht sicher, ob er antwortet. Wenn mir jemand bei diesem Problem helfen könnte, wäre ich sehr dankbar.

P. S .: Wenn das Zertifikat von cer Export in PFX, ich habe den Titel der Datei exportiert geändert. Obwohl ich seine Auswirkung auf das Problem bezweifle, erwähne ich es lieber.

+1

angeben Sie den vollständigen Pfadnamen in die Datei? – gtrig

+1

Wow ... jetzt fühle ich mich wie ein kompletter Idiot. Nachdem der vollständige Pfad angegeben wurde, 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 geschlossen werden. – Storm

Antwort

139

Haben Sie Folgendes im Anwendungspool in IIS festgelegt?

  1. Zum IIS-Manager
  2. Zum Anwendungspool Instanz
  3. Klicken Sie erweiterte Einstellungen
  4. unter Prozessmodell gesetzt Load User Profile auf true

für weitere diesen Stapel Frage Siehe Lesung: What exactly happens when I set LoadUserProfile of IIS pool?

+0

Wenn Sie die Kommentare unter dem ersten Beitrag lesen, werden Sie feststellen, dass jemand die Frage bereits vor mehr als einem Jahr beantwortet hat. Wie auch immer, danke für deine Mühe. – Storm

+8

keine Sorgen - es war mehr für andere, die darüber stolpern. ich hatte den gleichen fehler und vermisste die iis-einstellung, die ich schrieb :) – nologo

+6

Du bist großartig! Danke für die Berücksichtigung "es war mehr für andere, die darüber stolpern. – ilter

5

Da diese Frage eine hohe Suche Ranking hat, würde Ich mag an präsentieren eine Möglichkeit, X509Certificate2 mit einem absoluten Pfad (der es nur akzeptiert) zu einer relativ positionierten 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); 
+0

Epischer Fang. Es stellt sich heraus, dass der Grund, warum ich diesen Fehler erhalten habe, darin liegt, dass mein Pfad zu meinem Zertifikat leicht abweicht. – Suamere

2

von CspParameters mit Flag csdMachineKeyKeyStore IIS Passieren der Beschränkung umgehen kann, der die Ausnahme auslöst.

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

I gegründete Lösung hier:

Link to Information Resource

0

Für diejenigen unter Ihnen, die die Cryptographic Exception empfangen werden, wenn eine X509Certificate2 mit der Import-Methode zu importieren versuchen, fand ich, dass die Enum-Option für MachineKeySet Umgehung der Notwendigkeit, einen userContext in IIS zu erstellen und somit einfacher zu implementieren.

X509Certificate2 cert = new X509Certificate2(); 
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);