[英]Certificate private key permissions in .NET 6
我正在尝试将带有私钥的证书导入 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 为机器密钥分配权限
我可以使用 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.'
我还阅读了有关您不应尝试直接在文件上设置 acl 的评论,但不确定这是否正确
有关以编程方式授予访问权限的示例代码,请参阅此代码项目帖子(特别是查看“AddAccessToCertificate”方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.