簡體   English   中英

.NET 6 中的證書私鑰權限

[英]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 為機器密鑰分配權限

在 .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.' 我還閱讀了有關您不應嘗試直接在文件上設置 acl 的評論,但不確定這是否正確

有關以編程方式授予訪問權限的示例代碼,請參閱此代碼項目帖子(特別是查看“AddAccessToCertificate”方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM