X509Certificate2构造函数未使用MMC中安装的证书中的私钥

时间:2018-03-09 16:06:11

标签: c# asp.net x509certificate2

我正在运行一个ASP.net 4.5.2应用程序,该应用程序使用SslStream与另一台服务器建立安全连接。

对于我使用的证书 - 签名算法为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 ...

这一切都在以前工作,构造函数将使用密钥文件夹中已有的私钥。我不确定为什么它会停止尝试访问那个而是现在创建一个新的。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

  

这一切以前都有效

以前什么时候?发生了什么变化?

当.NET被赋予PFX时,它会调用Win32 PFXImportCertStore。值得注意的是,它没有(并且据我所知,还没有)断言(编辑)PKCS12_ALLOW_OVERWRITE_KEY。这意味着打开PFX始终会创建任何私钥的新副本,这与您描述的行为相符。

如果要使用预先许可的值,请从证书存储区加载证书。如果要使用新副本,请从PFX加载。