我正在尝试通过我的应用程序为用户导入证书。这适用于服务器2012和Windows 10,但是在Windows 7和server 2008 r2等较旧的操作系统上,导入似乎无法正常工作。一些工作由助手类完成,该类复制证书并分配权限。
string path = Path.Combine(Path.GetDirectoryName(certLocation), "test_cert.pfx");
//Create the certificate and import it
_cert = new X509Certificate2();
_cert.Import(path, password, X509KeyStorageFlags.MachineKeySet);
X509CertHelper.CopyCertToStore(_cert, StoreName.My, StoreLocation.LocalMachine);
X509CertHelper.AddAccessToCertificate(_cert, Environment.UserName);
我添加权限调用以设置似乎正常工作的权限。但是,当查看证书管理器并从上下文菜单中选择"管理私钥"给我两个不同的结果。在较新的操作系统上,权限对话框正确地显示了代码新添加的权限,但是对于较旧的权限,我只会收到一个神秘的错误,当我启动服务时,我收到以下错误。
证书可能是CN = test'可以 没有能够进行密钥交换的私钥,或者该进程可能没有私钥的访问权限。
有关可能出现问题的任何想法或旧操作系统的额外步骤?我最近在这台机器上运行了更新(Server 2008 R2),因为我认为这可能是问题所在。我也需要在代码中执行此操作。以下代码设置权限。
private static void AddAccessToCertificate(X509Certificate2 cert, string user)
{
RSACryptoServiceProvider rsa = cert.PrivateKey as RSACryptoServiceProvider;
if (rsa != null)
{
string keyfilepath =
FindKeyLocation(rsa.CspKeyContainerInfo.UniqueKeyContainerName);
FileInfo file = new FileInfo(keyfilepath + "\\" +
rsa.CspKeyContainerInfo.UniqueKeyContainerName);
FileSecurity fs = file.GetAccessControl();
NTAccount account = new NTAccount(user);
fs.AddAccessRule(new FileSystemAccessRule(account,
FileSystemRights.FullControl, AccessControlType.Allow));
file.SetAccessControl(fs);
}
}