使用代码为证书设置私钥权限

我有以下代码,其中SIGNED_FILENAME是一个常量,指向包含私钥的现有pfx文件。

X509Certificate2 cert = new X509Certificate2(SIGNED_FILENAME, PASSWORD, X509KeyStorageFlags.MachineKeySet); RSACryptoServiceProvider certRsa = cert.PrivateKey as RSACryptoServiceProvider; 

当我使用代码添加私钥的权限时,我发现它们是在certRsa.CspKeyContainerInfo.UniqueKeyContainerName中指定的文件上设置的。 当我在证书mmc管理单元中查看证书权限时,但没有设置新权限。

当我通过Certificates mmc管理单元手动设置密钥时,我发现它设置权限的私钥与我在上面提到的UniqueContainerName属性中找到的私钥不同。

TLDR:每次运行这两行代码时,密钥容器文件都会更改。

为什么会发生这种情况?如何在证书mmc管理单元所执行的相同密钥上设置权限?

显然是因为每次重新生成密钥容器(或其他东西)时我都会从文件中打开它。 这是有效的代码:

 X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); X509Certificate2 c = store.Certificates .Find(X509FindType.FindBySubjectName, SIGNED_SUBJECT, true) .Cast() .FirstOrDefault(); store.Close(); RSACryptoServiceProvider rsa = c.PrivateKey as RSACryptoServiceProvider; Console.WriteLine("Certificate thumbprint:" + c.Thumbprint); Console.WriteLine("From machine key store?: " + rsa.CspKeyContainerInfo.MachineKeyStore); Console.WriteLine("Key container name: " + rsa.CspKeyContainerInfo.KeyContainerName); Console.WriteLine("Key unique container name: " + rsa.CspKeyContainerInfo.UniqueKeyContainerName); 

以前从原始post运行代码片段(我将证书作为文件打开)时,打印到控制台的密钥信息每次都会更改。 运行修改后的代码每次都会显示相同的信息。