x509证书可能没有私钥

时间:2017-04-13 19:52:22

标签: c# ssl-certificate x509certificate

我正在尝试通过我的应用程序为用户导入证书。这适用于服务器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'可以  没有能够进行密钥交换的私钥,或者该进程可能没有私钥的访问权限。

enter image description here

有关可能出现问题的任何想法或旧操作系统的额外步骤?我最近在这台机器上运行了更新(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);
        }
}

0 个答案:

没有答案