我有以下代码,其中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管理单元所使用的相同密钥上设置权限?
答案 0 :(得分:0)
显然是因为每次重新生成密钥容器(或其他东西)时我都会从文件中打开它。以下是有效的代码:
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<X509Certificate2>()
.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);
以前从原始帖子运行代码片段(我将证书作为文件打开)时,打印到控制台的密钥信息每次都会更改。运行修改后的代码每次都会显示相同的信息。