C# 私钥权限在程序退出时中断

C# 私钥权限在程序退出时中断,c#,.net,certificate,C#,.net,Certificate,我有一个小型应用程序作为大型程序的“证书管理器”,这样用户就不必手动安装和配置证书 它相当简单-它有一些证书作为嵌入式资源,将其加载到适当的存储中,然后设置适当配置的权限 在程序运行时,这似乎工作正常。使用MMC,我可以看到证书已安装。如果我管理私钥,则会正确添加新权限。但是,一旦我关闭证书管理器,权限就会中断。证书仍在安装中,但单击“管理私钥”会弹出类似于“密钥不存在”的错误 此外,如果程序再次运行,则权限将在程序退出后正确“保留” 下面是程序用来验证是否添加了权限的代码。此方法每次都返回“t

我有一个小型应用程序作为大型程序的“证书管理器”,这样用户就不必手动安装和配置证书

它相当简单-它有一些证书作为嵌入式资源,将其加载到适当的存储中,然后设置适当配置的权限

在程序运行时,这似乎工作正常。使用MMC,我可以看到证书已安装。如果我管理私钥,则会正确添加新权限。但是,一旦我关闭证书管理器,权限就会中断。证书仍在安装中,但单击“管理私钥”会弹出类似于“密钥不存在”的错误

此外,如果程序再次运行,则权限将在程序退出后正确“保留”

下面是程序用来验证是否添加了权限的代码。此方法每次都返回“true”,即使之后权限中断也是如此

    private bool GetSecurityStatus(X509Certificate2 cert, X509Store store)
    {
        store.Open(OpenFlags.ReadOnly);

        //add Authenticated Users to private cert
        RSACryptoServiceProvider privKeyRSA = cert.PrivateKey as RSACryptoServiceProvider;
        string keyFilePath = FindKeyLocation(privKeyRSA.CspKeyContainerInfo.UniqueKeyContainerName);
        FileInfo privateKeyFileInfo = new FileInfo(keyFilePath + "\\" + privKeyRSA.CspKeyContainerInfo.UniqueKeyContainerName);
        FileSecurity privateKeyFileSecurity = privateKeyFileInfo.GetAccessControl();

        AuthorizationRuleCollection rules = privateKeyFileSecurity.GetAccessRules(true, true, typeof(NTAccount));
        foreach (FileSystemAccessRule fsar in rules)
        {
            if(fsar.IdentityReference.Value.Contains("Authenticated Users") && fsar.AccessControlType == AccessControlType.Allow && fsar.FileSystemRights == FileSystemRights.FullControl){
                store.Close();return true;
            }
        }
        //Close Private Cert store
        store.Close();
        return false;
    }
FindKeyLocation返回私钥的appdata\Microsoft\Crypto\RSA\路径


我认为这与退出程序改变私钥文件本身有关,但我不确定为什么它会第二次工作。

我相信我已经找到了解决问题的方法,基于以下响应:

这里是MSDN

我必须在证书的参数中传递两个标志,而不仅仅是MachineKey

X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet

您似乎根本没有使用存储(打开和关闭存储除外),这意味着您正在检查与
证书相关联的私钥的权限,但不一定是证书存储中的
cert
表示形式。@bartonjs给出的代码只是为了证明权限本身已经找到。是的,但如果两个不同的证书实例独立于PFX加载,则它们在使用什么私钥方面可能会有分歧。因此,如果您的检测代码更改为读取存储权限,您可能会发现下面有一个不同的问题。@bartonjs我明白了-实际上,在另一个区域中有代码直接从存储中获取证书,它只是不包含在这个代码段中。谢谢