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


70

我试图掩盖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时,我已更改了导出文件的标题。尽管我怀疑它对问题的影响,但我还是想提一下。


1
您是否在指定文件的完整路径名?
gtrig

1
哇...现在我感觉像个白痴。在指定了完整路径之后,它可以正常工作……客户说,证书无效,但这可能是因为它是为我的旧计算机颁发的。因此,谢谢...我认为,本主题可以被认为是非建设性的。
风暴

Answers:


229

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

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

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



谢谢你,先生!我已经为这个错误苦苦挣扎了几个月。必须重新启动服务器或重新启动IIS才能重新开始出现错误之前的“时间”。
Miquel Coll

1
哦,我的上帝。多么荒谬的错误!我尝试检查并检查,但找不到文件名有任何问题。***有关错误的文件路T加密异常生动而实际上它不是
晃龙

如果这对您不起作用,请仔细检查您是否在正确的应用程序池上将其设置为true。(首先检查为您的应用程序分配了哪个应用程序池)
Iman

1
在Azure中:使用应用程序设置->添加值为“ 1”的“ WEBSITE_LOAD_USER_PROFILE”。
hanzolo

13

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

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

只要做到这一点,就可以开心。在Windows 10 2004中,使用IIS扭曲对我不起作用。我尝试了所有可能的组合。这像魅力一样运作
Daniel Dolz

7

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

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

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

链接到信息资源


我没有足够的词来形容我对这个简单的解决方法的感激之情!谢谢!!就我而言,在本地一切正常,但是在天蓝色下,我收到“ ..找不到指定的文件”错误。这解决了它
Reath

6

因为此问题的搜索排名很高,所以我想提出一种方法,用一种绝对路径(仅接受)呈现给X509Certificate2,该绝对路径指向ASP.net应用程序中相对定位的pxf密钥文件。

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

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

1
史诗般的收获。事实证明,我收到此错误的全部原因是因为通往证书的路径略有偏离。
Suamere '18

3

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

AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.