CryptographicException 未处理:系统找不到指定的文件
Posted
技术标签:
【中文标题】CryptographicException 未处理:系统找不到指定的文件【英文标题】:CryptographicException was unhandled: System cannot find the specified file 【发布时间】:2013-07-24 07:56:55 【问题描述】:我正在尝试了解 SSL 通信的奥秘,并在 this site 上找到了一个很棒的教程。我试图测试我自己的证书。使用 Visual Studio 2012,我只是添加了一个现有文件(我的 .pfx 格式的证书),然后更改了 app.config 中的“证书”和“密码”设置。但是,当我尝试运行它时,我得到了一个错误:
然后,我在我的 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 时,我更改了导出文件的标题。虽然我怀疑它对问题的影响,但我宁愿提一下。
【问题讨论】:
您是否指定了文件的完整路径名? 哇...现在我觉得自己像个彻头彻尾的白痴。指定完整路径后,它可以工作......好吧,客户说,证书无效,但这可能是因为它是为我的旧计算机颁发的。所以,谢谢......我认为,这个话题可以作为非建设性的结束。 对于 Azure 应用服务中的相同问题 - Certenroll on Azure - Generating self signed certificates 【参考方案1】:你是否在 IIS 中的应用程序池上设置了以下内容?
-
转到 IIS 管理器
转到应用程序池实例
点击高级设置
在进程模型下,将加载用户配置文件设置为 true
请参阅此堆栈问题以进一步阅读:What exactly happens when I set LoadUserProfile of IIS pool?
【讨论】:
***.com/questions/17149132/… 谢谢先生!几个月来我一直在努力解决这个错误。必须重新启动服务器或重新启动 IIS 才能在错误再次出现之前“有时间”。 天哪。多么荒谬的错误!!我尝试检查并检查,找不到文件名有任何问题。 ***t 密码学异常告诉错误的文件路径,而实际上它不是 如果这对您不起作用,请仔细检查您是否在正确的应用程序池上将其设置为 true。(首先检查为您的应用分配了哪个应用程序池) 在 Azure 中:使用应用程序设置 -> 添加值为“1”的“WEBSITE_LOAD_USER_PROFILE”。【参考方案2】:因为这个问题的搜索排名很高,所以我想提出一种方法来向 X509Certificate2 提供一个绝对路径(它只接受)到 ASP.net 应用程序中相对定位的 pxf 密钥文件。
string path = HttpContext.Current.Server.MapPath("~") + "..\keys\relative_key.pfx";
X509Certificate2 cert = new X509Certificate2(path, "", X509KeyStorageFlags.DefaultKeySet);
【讨论】:
史诗般的收获。原来我得到这个错误的全部原因是因为我的证书路径有点偏离。【参考方案3】:通过传递带有标志 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】:对于那些在尝试使用 Import 方法导入 X509Certificate2 时收到 Cryptographic Exception 的人,我发现使用 MachineKeySet 的 Enum 选项绕过了在 IIS 中创建 userContext 的需要,因此更易于实现。
X509Certificate2 cert = new X509Certificate2();
cert.Import(certificateFilePath, certPasshrase,
X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
【讨论】:
只要做到这一点,就会快乐。在 Windows 10 2004 中,使用 IIS 进行 Twerking 对我不起作用。我尝试了所有可能的组合。这就像一个魅力【参考方案5】:您需要指定绝对路径而不是相对路径。
AppDomain.CurrentDomain.BaseDirectory +"/Certificate/cer.PFX"
【讨论】:
以上是关于CryptographicException 未处理:系统找不到指定的文件的主要内容,如果未能解决你的问题,请参考以下文章
使用证书部署出现System.Security.Cryptography.CryptographicException 错误解决方案
System.Security.Cryptography.CryptographicException:密钥集不存在