0

我有以下代码,其中 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 管理单元所做的同一密钥上设置权限?

4

1 回答 1

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);  

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

于 2013-06-26T18:03:37.320 回答