要从代码实际访问密钥,您需要设置私钥权限以授予对特定IIS应用程序池的完全访问权限.我完全理解,但问题是这只能在个人证书上设置,而不是在受信任的根证书上设置.
X509Store store = new X509Store(StoreName.Root,StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); foreach (X509Certificate2 cert in store.Certificates) { if (cert.HasPrivateKey) { // access private key here } } store.Close();
如果我将StoreName.Root更改为StoreName.My,则设置个人存储中证书的权限.我可以在那里访问它.但是我无法在root中访问它.它只是说:
Keyset does not exist
有什么建议?
附加信息
如果我将应用程序池标识设置为本地系统(对我的计算机具有完全权限),我可以成功访问私钥.因此,主要问题是如何设置应用程序池标识的权限以访问受信任的根存储中的证书的私钥.
Why trusted root store and not personal?
I have a pre-built assembly that accesses this certificate in this particular store,so simply placing the certificate in Personal store won’t do the trick for me. That’s why setting trust permissions on private keys of trusted root certificates is imperative.
使用证书MMC的步骤:
> Import certificate to the store you want it and mark keys as exportable.(你可以绕过这个并直接导入个人商店,但我还没试过.)
>将导入的证书拖放到个人存储中.
>右键单击个人存储中的证书,然后在上下文菜单中单击“所有任务”,然后在子菜单中单击“管理私钥”.根据您的应用程序池将相应权限设置为referenced in step 1.>设置权限后,将证书拖放回原始存储(在您的情况下为受信任的根证书颁发机构).