簡體   English   中英

為什么 CertificateRequest 的 PublicKey.Key 與私鑰不在同一提供商中?

[英]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 提供程序,但請注意KeyContainerNamenull 這是因為它只是在 memory 中生成的,並沒有存儲在任何地方。

證書簽名請求 (CSR) 是從應用程序內部創建的公共文件。 此時與私鑰的“唯一”關系是:

  1. 需要包含公鑰;
  2. 需要用私鑰簽名(以表明您在創建 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.

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