.net 未处理加密异常:系统找不到指定的文件

aiqt4smr  于 2023-03-13  发布在  .NET
关注(0)|答案(7)|浏览(240)

我正在尝试拥抱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时,我更改了导出文件的标题。虽然我怀疑它对问题的影响,但我宁愿提到它。

ztmd8pv5

ztmd8pv51#

是否在IIS中对应用程序池进行了以下设置?
1.转到IIS管理器
1.转到应用程序池示例
1.单击高级设置
1.在“流程模型”下,将“加载用户配置文件”设置为true
请参阅此堆叠问题以了解更多阅读:What exactly happens when I set LoadUserProfile of IIS pool?

sauutmhj

sauutmhj2#

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

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

acruukt93#

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

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

我在这里找到了解决办法。

kx1ctssn

kx1ctssn4#

因为这个问题的搜索排名很高,所以我想介绍一种方法,用绝对路径(它只接受)表示X509Certificate2,该路径指向www.example.com应用程序中相对定位的pxf密钥文件ASP.net。

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

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

qgzx9mmu5#

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

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

qojgxg4l6#

对于那些尝试从Windows证书存储(证书(本地计算机))访问证书的用户,请确保使用操作-〉所有任务-〉管理私钥...授予应用程序池用户访问证书私钥的权限。没有这样做是导致我出现此错误的原因。

643ylb08

643ylb087#

要添加上面的schmiddy98答案,我允许IIS用户访问此文件夹:

C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

相关问题