83

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

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月,我不确定他是否会回复。如果有人可以帮助我解决这个问题,我将不胜感激。

PS:将证书从.cer导出到.pfx时,我更改了导出文件的标题。尽管我怀疑它对问题的影响,但我宁愿提一下。

4

5 回答 5

262

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

  1. 转到 IIS 管理器
  2. 转到应用程序池实例
  3. 点击高级设置
  4. 在流程模型下,将加载用户配置文件设置为 true

请参阅此堆栈问题以进一步阅读:当我设置 IIS 池的 LoadUserProfile 时会发生什么?

于 2014-12-02T05:27:54.863 回答
19

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

X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase, 
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
于 2018-01-12T21:43:00.040 回答
9

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

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

我在这里建立了解决方案:

链接到信息资源

于 2017-05-20T00:55:38.040 回答
6

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

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

    X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
于 2015-09-15T23:32:28.720 回答
4

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

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
于 2019-06-26T05:59:32.967 回答