亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法使用 NCryptExportKey 和 NCryptImportKey 重新導入私鑰

無法使用 NCryptExportKey 和 NCryptImportKey 重新導入私鑰

C#
慕勒3428872 2023-05-13 15:55:13
我正在嘗試重新加載具有不同導出策略的證書私鑰以解決此問題。我重復使用此答案中的代碼來導出私鑰,然后將其導入并將導出策略設置為 AllowPlainTextExport。有了它,我應該能夠用重新導入的私鑰重建原始證書,并在必要時導出其參數。這是我現在擁有的代碼:證書被導出然后導入。但是,導入的私鑰不能重新分配給原始證書。我收到“提供的密鑰與此證書的公鑰不匹配”或“僅支持實現 ICspAsymmetricAlgorithm 的非對稱密鑰”。我做錯了什么嗎?
查看完整描述

1 回答

?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

// Attempt #1


CspParameters parameters = new CspParameters();

parameters.KeyContainerName = importedKeyName;

var rsaKey = new RSACryptoServiceProvider(parameters);

certificate.PrivateKey = rsaKey; // public key doesn't match the private key

CAPI(CspParameters 背后的庫)在 Windows 7 或 8.1 上根本無法理解 CNG 中的鍵;它(理論上)在 10 上支持它,但您肯定必須告訴它密鑰位于 CNG (CspParameters.ProviderName) 中。


此處的代碼在“Microsoft RSA 和 AES 增強型加密服務提供程序”中使用 ProviderType 24 創建了一個新的 CAPI 密鑰,該密鑰恰好與您的 CNG 密鑰具有相同的本地密鑰名稱。


您沒有指定標志 UseExistingOnly,并且該密鑰不存在,所以它創建了一個新的……這就是公鑰與證書中的內容不匹配的原因。


// Attempt #2


var rsaCngKey = new RSACng(CngKey.Open(importedKeyName));

certificate.PrivateKey = rsaCngKey; // Only asymmetric keys that implement ICspAsymmetricAlgorithm are supported.

該PrivateKey屬性只支持 CAPI,無論是 get 還是 set。該集合使用起來非常危險,因為它不會修改證書對象,它會修改 Windows 證書存儲系統中證書的狀態……這意味著它還會影響在同一對象上運行的任何其他現在或將來的對象(Windows) 證書。


// Attempt #3

certificate.PrivateKey = null;

X509Certificate2 certWithKey = certificate.CopyWithPrivateKey(rsaKey); // The provided key does not match the public key for this certificate.

這是從嘗試 1 創建的相同的新隨機密鑰。


如果您刪除嘗試 1,然后合并 2 和 3,您應該以


var rsaCngKey = new RSACng(CngKey.Open(importedKeyName));

X509Certificate2 certWithKey = certificate.CopyWithPrivateKey(rsaCngKey);

這應該有效。(如果您已經將證書導入到證書存儲中,您可以只添加certWithKey到證書存儲中,這將具有與“每個人都突然知道這個”更新更改相同的更新更改cert.set_PrivateKey,除了您詢問證書存儲更明顯進行更改)


查看完整回答
反對 回復 2023-05-13
  • 1 回答
  • 0 關注
  • 358 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號