ASP.NET MVC5网站正在调用外部SOAP服务,这些调用需要使用X.509证书进行签名。我已通过管理控制台的证书管理单元在本地计算机的个人存储中安装了此(.pfx)证书。
网站的应用程序池以域服务器帐户的身份运行,我已在证书管理单元的"Manage Private Keys"
选项中授予此帐户完全控制权。此外,我已将证书复制到"Trusted People"
商店。
我还尝试将此域服务帐户添加到管理员组,并在“本地系统”下运行应用程序池,但都没有解决此问题,因此看起来特权不是问题。
使用我找到私钥的FindPrivateKey.exe工具,这是
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\2623f8b3f30bbd9a2b0084d1e6a97132_1e17985d-55d3-4dba-af15-d007f3c2d122
我已经为此文件(及其所在的文件夹)授予了相同的服务帐户完全控制权。
但是,当尝试在代码中使用此证书时,我得到一个例外:
System.Security.Cryptography.CryptographicException: Keyset does not exist
使用Process Monitor我注意到MVC进程(w3wp.exe
)正试图找到私钥
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\bfb1e6b28e1ca774d2b42fd7ecb2e023_1e17985d-55d3-4dba-af15-d007f3c2d122
与FindPrivateKey
找到的路径不同,导致"NAME NOT FOUND"
,因为磁盘上不存在此路径。
在调用FindPrivateKey期间使用Process Monitor时,我注意到此工具首先尝试在
处查找私钥C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\bfb1e6b28e1ca774d2b42fd7ecb2e023_1e17985d-55d3-4dba-af15-d007f3c2d122"
但是当它找不到此文件时,它会再次尝试
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\2623f8b3f30bbd9a2b0084d1e6a97132_1e17985d-55d3-4dba-af15-d007f3c2d122
此位置存在并按上述方式返回。
对于MVC网站FindPrivateKey
我使用它的指纹定位证书,在这两种情况下我都在查看StoreLocation=LocalMachine
和StoreName=My
。代码使用PrivateKey
类的X509Certificate2
属性。
关于私钥和这个特定异常的问题经常出现,我已经尝试了为这些问题提出的答案,但遗憾的是没有成功。可能是什么问题?为什么FindPrivateKey
提出了与代码不同(显然是正确的)私钥位置?