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

时间:2013-06-26 15:30:18

标签: c# acl pfx

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

1 个答案:

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

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