这个问题在这里已有答案:
我正在运行一个ASP.net 4.5.2应用程序,该应用程序使用SslStream与另一台服务器 Build 安全连接 .
对于我使用的证书 - 签名算法是sha384ECDSA,公钥ECC(384位),和公钥参数是ECDH_P384 .
在代码中,我使用的是X509Certificate2构造函数,您可以在其中提供文件路径和密码:
X509Certificate2 cert = new X509Certificate2(certFilepath, certPasswd, X509KeyStorageFlags.MachineKeySet);
执行这条线之前,同样的PFX证书安装在本地计算机的存储和运行应用程序的服务用户有权访问通过管理在MMC的私钥的私钥 . 服务用户还可以访问存储密钥的文件夹 .
当执行这一行,但是,它甚至不尝试访问时,证书安装在MMC已添加的文件夹中的私钥(我知道这运行的ProcessMonitor) . 它改为在keys文件夹中创建一个新的私钥文件,服务用户显然无权访问该文件 .
因此,当我尝试使用AuthenticateAsClient验证SslStream时,我得到一个异常:
System.ComponentModel.Win32Exception (0x80004005): The credentials supplied to the package were not recognized at ...
这一切都在以前工作,构造函数将使用已在keys文件夹中的私钥 . 我不确定为什么它不再试图访问那个而是现在再创建一个新的 .
先感谢您!
1 回答
以前什么时候?发生了什么变化?
当给.NET一个PFX时,它调用Win32 PFXImportCertStore . 值得注意的是它没有(和,据我所知,还没有过)断言(ED)PKCS12_ALLOW_OVERWRITE_KEY . 这意味着打开PFX始终会创建任何私钥的新副本,该副本与您描述的行为相匹配 .
如果要使用预先许可的值,请从证书存储区加载证书 . 如果要使用新副本,请从PFX加载 .