【问题标题】:Certificate private key permissions in .NET 6.NET 6 中的证书私钥权限
【发布时间】:2022-01-02 11:03:54
【问题描述】:

我正在尝试将带有私钥的证书导入 Windows 证书存储区。我可以使用以下方法成功导入证书

X509Certificate2 certificate = new(certByteArray, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
X509Store store = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

但我遇到的问题是,如何以编程方式让用户访问私钥。
我发现这些链接很有帮助:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Assign permission to machine key

Set Certificate PrivateKey Permissions in .NET 5

我可以使用 certlm.msc 通过 UI 授予访问权限 > 将证书拖到个人存储区 > 右键单击​​证书 > 所有任务 > 管理私钥 > 添加用户和权限
但我需要以编程方式执行此操作

.NET Full Framework 有一些变化,这是示例的来源。我花了一天多的时间,尝试了多个证书,证书肯定被标记为可导出并以管理员身份运行 VS。我对仅限 Windows 的解决方案感到满意

这差不多是我所知道的

const string NCRYPT_SECURITY_DESCR_PROPERTY = "Security Descr";
const CngPropertyOptions DACL_SECURITY_INFORMATION = (CngPropertyOptions)4;

X509Store trustedPeopleStore = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
trustedPeopleStore.Open(OpenFlags.ReadWrite);

var certificates = trustedPeopleStore.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxxxxxxxxxxxxxxxxxx", false);

RSA rsa = certificates[0].GetRSAPrivateKey();
RSACng rsaCng = rsa as RSACng;

CngProperty prop = rsaCng.Key.GetProperty(NCRYPT_SECURITY_DESCR_PROPERTY, DACL_SECURITY_INFORMATION);

我可以在调试中看到 rsaCng.Key,但在下一行(它绝对是可导出的)获取属性时失败 Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.' 我还阅读了 cmets,您不应该尝试直接在文件上设置 acl,但不确定这是否正确

【问题讨论】:

  • 我的猜测是运行您的 WebApp 的用户没有访问证书存储所需的权限。您是否尝试将所有私钥保存在 App_Data 中的文件夹中,然后根据用户登录名授予对它们的访问权限?

标签: c# .net acl x509certificate2 cng


【解决方案1】:

有关以编程方式授予访问权限的示例代码,请参阅 this code project post(具体请查看“AddAccessToCertificate”方法)。

查看更多信息:Programmatically adding certificate to personal store

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多