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.
Antworten:
Haben Sie im Anwendungspool in IIS Folgendes festgelegt?
Weitere Informationen finden Sie in dieser Stapelfrage : Was genau passiert, wenn ich LoadUserProfile des IIS-Pools einstelle?
quelle
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);
quelle
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
quelle
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);
quelle
Sie müssen den absoluten Pfad anstelle des relativen Pfads angeben.
AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
quelle