CryptographicException未处理:系统找不到指定的文件

时间:2013-07-24 17:23:18

标签: c# .net x509certificate cryptographicexception

我正在尝试接受SSL通信的奥秘,并在this site上找到了一个很棒的教程。我试图测试我自己的证书。使用Visual Studio 2012,我只是添加了一个现有文件(我的证书为.pfx格式),然后更改了app.config中的“certificate”和“password”设置。但是,在尝试运行它时,我收到了一个错误:

  

CryptographicException未处理:系统找不到指定的文件

然后,我在我的Web服务中尝试了相同的操作。我在那里得到了关于错误的更多细节:

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

我已经把这个问题写给了文章的作者,但自从他上次回复是在2012年3月,我不确定他是否会回复。如果有人可以帮我解决这个问题,我将非常感激。

P.S。:将证书从.cer导出到.pfx时,我更改了导出文件的标题。虽然我怀疑它对这个问题的影响,但我更愿意提及它。

5 个答案:

答案 0 :(得分:177)

您是否在IIS中的应用程序池中设置了以下内容?

  1. 转到IIS管理器
  2. 转到应用程序池实例
  3. 点击高级设置
  4. 在Process model下,将Load User Profile设置为true
  5. 请参阅此堆栈问题以获取进一步阅读:What exactly happens when I set LoadUserProfile of IIS pool?

答案 1 :(得分:7)

对于那些在尝试使用Import方法导入X509Certificate2时收到Cryptographic Exception的人,我发现使用MachineKeySet的Enum选项绕过了在IIS中创建userContext的需要,因此更容易实现。

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

答案 2 :(得分:6)

因为这个问题有很高的搜索排名,所以我想提出一种方法,用一个绝对路径(它只接受)向一个ASP.net应用程序中相对定位的pxf密钥文件提供X509Certificate2。

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

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);

答案 3 :(得分:6)

通过传递带有标志csdMachineKeyKeyStore的CspParameters,IIS可以绕过抛出异常的限制。

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

我在这里找到了解决方案:

Link to Information Resource

答案 4 :(得分:1)

您需要指定绝对路径而不是相对路径。

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