使用 HSM 的 HLK 簽署
簡介
本主題描述使用第三方網路型硬體安全性模組 (HSM) 來儲存擴充驗證 (EV) 憑證時可能發生的一些設定和設定問題。
背景
HLK 封裝
HLKX 套件檔案使用 開放式封裝慣例。 此規格是 ISO 工作組的一部分,表示 HLKX 檔案與 Signtool 不相容。
HLK 套件簽署
當 HLK 簽署套件時,簽章和關聯性會與 HLK 數據放在套件中。 這是 System.IO.Packaging.PackageDigitalSignature
用來驗證封裝中數據簽章的數據。
注意
目前,HLK 套件簽署僅支援 RSA 和 DSA 憑證,由用於簽署 System.Security.Cryptography.Xml.SignedXml 的 .NET 連結庫所決定
密碼編譯服務提供者
密碼 編譯服務提供者 (CSP) 包含密碼編譯標準和演算法的實作。 CSP 至少是由動態連結庫 (DLL) 所組成,可在 CryptoSPI 中實作函式(系統程式介面)。 大部分的 CSP 都包含其所有函式的實作。 不過,某些 CSP 主要會在 Windows 服務控制管理員所管理的 Windows 服務程式中實作其功能。 其他則會在硬體中實作功能,例如 智慧卡 或安全的協處理器。 如果 CSP 未實作自己的函式,DLL 會作為傳遞層,促進操作系統與實際 CSP 實作之間的通訊。
證書存儲和登錄
證書存儲中的憑證都會對應至將執行最終簽署的 CSP DLL。 這可以在下面的登錄專案中看到。
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider\Microsoft Enhanced DSS and Diffie-Hellman Cryptographic Provider]
"Image Path"="%SystemRoot%\\system32\\dssenh.dll"
"SigInFile"=dword:00000000
"Type"=dword:0000000d
使用網路型 HSM 所裝載的憑證進行 HLKX 套件簽署
控制器組態
若要設定 HLK 控制器以 HSM 憑證簽署,系統必須存在下列專案:
- 來自 HSM 的證書頒發機構單位 (CA)
- 來自 HSM 的 CSP 檔案
HSM 提供者應記載如何設定具有這些元件的 HSM 用戶端的指示。
使用 HLK 簽署
如果控制器已正確設定,您應該能夠指向來自 HSM 的憑證,就像從 HLK 本機安裝憑證並簽署套件一樣。
測試 HSM 組態
使用 Signtool
瞭解我們可以簽署的第一個步驟是嘗試使用 signtool 簽署檔案。 這可讓我們確認簽署工作流程正常運作。 首先,我們將簽署PE檔案(exe或 dll)。 例如,使用名稱簽署:
signtool sign /f HighValue.cer /csp "Hardware Cryptography Module" /kHighValueContainerMyControl.exe
signtool sign /n "My Company Certificate" MyFile.exe
或使用已安裝憑證的SHA1哈希進行簽署:
signtool sign /sha1 0cf1d2f7befc7d143678f86963aef5572b710cf2 MyFile.exe
憑證名稱可在主體資訊中找到,而SHA1哈希位於指紋中。 使用哈希時,請移除哈希中的所有空格和特殊字元,讓格式看起來像上述範例。 您也可以使用 個人資訊交換 (PFX) 檔案簽署。 這很可能不是您想要執行的動作,因為 PFX 檔案可以包含私鑰,其中憑證只包含公鑰。
signtool sign /f certdata.pfx MyFile.exe
您可以使用 signtool 驗證簽章
signtool verify /v /pa MyFile.exe
如果您能夠使用 PFX 檔案以外的任何專案來簽署和驗證檔案,您可以嘗試簽署 HLK 套件。 如果您無法簽署,請參閱疑難解答一節。
使用 PackageDigitalSignature
本文件結尾的 一節中有一個使用 PackageDigitalSignature
進行簽署的程式代碼範例。 當您收到此檔時,也應該取得完整的 C# 檔案。 若要使用此範例,您必須提供未簽署套件的完整路徑,以及要用於簽署之憑證的指紋。 如果您無法簽署,請參閱疑難解答一節。
疑難排解
最可能的原因是您的 HSM 未在您的系統上安裝憑證和相關聯的 CSP。 您可以嘗試的一些事項如下:
- 您是否只要使用 HSM 廠商所支援的工具來登入此系統?
- 您的 HSM 廠商是否在此系統上安裝憑證和 CSP?
- 什麼是憑證屬性?
- 您的 HSM 廠商是否支援並使用 signtool 記錄? 如果可以使用 Signtool 搭配 HSM 簽署檔案,這是系統已正確設定的指標,表示 HLK 也可以簽署 HLKX 套件。
- 執行範例程式代碼時 (HSM_example.cs) CspKeyContainerInfo.ProviderName 所列印的內容
- 該提供者名稱是否對應至提供的正確銷售者 CSP DLL。 您可以在登錄中找到該資訊,如上所示。
程式代碼範例
PackageDigitalSignatureManager
public static void Sign(string package, X509Certificate2 certificate)
{
// Open the package to sign it
Package packageToSign = Package.Open(package);
// Specify that the digital signature should exist
// embedded in the signature part
PackageDigitalSignatureManager signatureManager = new PackageDigitalSignatureManager(packageToSign);
signatureManager.CertificateOption = CertificateEmbeddingOption.InCertificatePart;
// We want to sign every part in the package
List<Uri> partsToSign = new List<Uri>();
foreach (PackagePart part in packageToSign.GetParts())
{
partsToSign.Add(part.Uri);
}
// We will sign every relationship by type
// This will mean the signature is invalidated if *anything* is modified in //the package post-signing
List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>();
foreach (PackageRelationship relationship in packageToSign.GetRelationships())
{
relationshipSelectors.Add(new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Type, relationship.RelationshipType));
}
try
{
signatureManager.Sign(partsToSign, certificate, relationshipSelectors);
}
finally
{
packageToSign.Close();
}
}