[英]Why is PublicKey.Key of CertificateRequest isn't in the same provider as the private key?
我使用此創建證書請求:
CertificateRequest req = new CertificateRequest(
"cn=test",
Key,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
key
由 CSP 設置:
ProviderName:“Utimaco CryptoServer CSP”
KeyContainerName:“默認容器”
但是在調試時我發現req.PublicKey.Key.CspKeyContainerInfo
指的是一個不同的提供者:
ProviderName:“Microsoft 增強型 RSA 和 AES 加密提供程序”
密鑰容器名稱:null
當我嘗試獲取Exportable
值時:
var isExportable = ((RSACryptoServiceProvider)req.PublicKey.Key).CspKeyContainerInfo.Exportable;
它拋出CryptographicException
:密鑰不存在
我不明白為什么私鑰和公鑰分別存儲在不同的提供商中? 還是這意味着別的?
TL;DR 該提供程序設置為通用 RSA 提供程序,但請注意KeyContainerName
是null
。 這是因為它只是在 memory 中生成的,並沒有存儲在任何地方。
證書簽名請求 (CSR) 是從應用程序內部創建的公共文件。 此時與私鑰的“唯一”關系是:
為此,它從密鑰對加載公鑰,從中創建未簽名的 CSR,然后使用私鑰對其進行簽名。 除此之外,CSR 僅用於請求實際證書。 不需要將 CSR/私鑰存儲在 HSM 中。 這反映在(例如)PKCS#11 根本沒有任何 CSR 的概念。
請注意,丟失 CSR 的風險很小,您可以隨時重新創建一個。 此外,如果有人在您將 CSR 發送給 CA 之前獲得它,那么它會被簽名驗證捕獲(或者您會得到一個帶有錯誤公鑰的無效證書,請始終確保已驗證並發送CSR 盡快)。
當您收到實際證書時,將其存儲在 HSM 中是有意義的。 通常存儲到根的整個證書鏈,因為協議(包括 TLS 和 CMS)通常需要中間證書。 畢竟它們被用於每一個簽名創建——希望你沒有將私有對用於你為其創建它的 PKI 之外的任何其他用途。
許多 HSM 確實提供了存儲通用數據的規定。 盡管您可以將 CSR 放在那里,但它只是一個通用存儲; 密鑰存儲本身不會將 CSR 與私鑰鏈接起來,因此您不妨將其保存在存儲中,希望在某個受保護的位置,只有您的密鑰管理器具有寫入權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.