如何使用 C# 和 HSM 對 PDF 進行數位簽名
IronPDF 透過 PKCS#11 API 支援使用硬體安全模組 (HSM) 進行安全的 PDF 簽署,在此過程中私鑰絕不會離開實體裝置,為需要防篡改數位簽名的關鍵任務應用程式提供銀行級的安全性。
快速入門:使用 C# 透過 HSM 簽署 PDF 檔案
- 透過 NuGet 安裝 IronPDF:
Install-Package IronPdf - 設定您的 HSM 裝置(或使用 SoftHSM 進行測試)
- 使用您的 HSM 憑證建立
UsbPkcs11HsmSigner: - 產生 PDF 並簽署:
var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>"); pdf.SignAndSave("signed.pdf", hsmSigner);var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>"); pdf.SignAndSave("signed.pdf", hsmSigner);Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>") pdf.SignAndSave("signed.pdf", hsmSigner)$vbLabelText $csharpLabel - 在您的 PDF 檢視器中驗證簽名
在 PDF 文件中添加簽名是許多應用程式的常見需求。 然而,關鍵任務型應用程式需要更高的安全性,其金鑰絕不能遭到篡改。 使用 .pfx 檔案進行常規簽名操作,就像在家中擁有一把萬用鑰匙一樣。 應用程式會將金鑰載入記憶體中,以對文件進行簽名。 若電腦遭到入侵,金鑰可能會被竊取。
更安全的替代方案是使用硬體安全模組 (HSM)。 透過 HSM(例如 USB 安全金鑰),私密金鑰是在裝置內部產生,且無法離開該裝置。
這個過程就像是將文件帶到銀行一樣。 應用程式會提供一個 PIN 碼,HSM 會將文件移至儲存庫,使用金鑰進行加蓋,並返回已加蓋的文件。 金鑰絕不離開保管庫。 這提供了額外的安全保障,因為金鑰無法被複製或竊取。
如何使用 HSM 對 PDF 進行數位簽名
- 下載 IronPDF C# 函式庫,透過 HSM 簽署 PDF 文件
- 匯入現有的 HSM 或使用其他函式庫進行模擬
- 建立一個新的
UsbPkcs11HsmSigner物件 - 使用
SignAndSave簽署並儲存 PDF - 請使用 PDF 檢視器驗證 PDF 輸出檔及證書
如何使用 HSM 簽署 PDF 文件?
使用 HSM 進行簽名通常需要一個實體裝置(例如 USB 令牌),應用程式會與該裝置進行互動。 IronPDF 支援這些操作,因為該函式庫與標準 HSM 皆採用 PKCS#11 作為共通 API。 為便於說明,本指南採用模擬的 HSM 而非實體 HSM。
在生產環境或實際測試環境中,請勿使用此模擬功能。 請改為使用您實際的 HSM。 在生產環境中,建議搭配 HSM 簽名功能,並實施額外的 PDF 安全功能(例如密碼保護和權限設定),以實現全面的文件保護。
要執行此模擬,您必須先安裝 SoftHSM、OpenSSL 和 OpenSC,以產生必要的金鑰和憑證。 有關如何使用 SoftHSM 的更多資訊,請參閱其公開的 GitHub 儲存庫。
在實作 HSM 簽名之前,請確保您已正確安裝 IronPDF,並為生產環境配置好授權金鑰。
首先,請從 HTML 字串建立 PDF 檔案。 在以下範例中,我們為模擬的 SoftHSM 定義路徑與憑證。 這包括提供 SoftHSM .dll 函式庫檔案以及您所建立的 .crt 憑證檔案的絕對路徑。
接著,請指定輸出路徑,在此範例中為 output.pdf。
請定義三個字串:hsmPin 以及 hsmKeyLabel。 這些字串區分大小寫,必須與您使用 SoftHSM 生成憑證和憑證時所建立的憑證資訊完全一致。 接著,初始化 UsbPkcs11HsmSigner 物件,並將 SoftHSM 函式庫路徑、PIN、代幣標籤及金鑰標籤作為參數傳入。
此外,請建立 PdfSignatureImage 以在文件中加入簽名的視覺呈現。 最後,呼叫 SignAndSave,該函式會使用 hsmSigner 對文件進行簽名,並將其儲存至指定的輸出路徑。
HSM 簽名程式碼的樣貌為何?
:path=/static-assets/pdf/content-code-examples/how-to/signing-with-hsm.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Pdfium.Signing;
using System.Drawing;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Testing</h1>");
// Define Paths and Credentials
string softhsmLibraryPath = @"D:\SoftHSM2\lib\softhsm2-x64.dll";
// These MUST match what you created
string hsmTokenLabel = "MyTestToken";
string hsmPin = "123456";
string hsmKeyLabel = "my-key"; // The label for the key *inside* the token
// Create the HsmSigner object.
UsbPkcs11HsmSigner hsmSigner = new UsbPkcs11HsmSigner(
softhsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel
);
// Create the Signature Image
string signatureImagePath = "IronSoftware.png";
PdfSignatureImage sigImage = new PdfSignatureImage(signatureImagePath, 0, new Rectangle(50, 50, 150, 150));
// Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner);
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Pdfium.Signing
Imports System.Drawing
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Testing</h1>")
' Define Paths and Credentials
Dim softhsmLibraryPath As String = "D:\SoftHSM2\lib\softhsm2-x64.dll"
' These MUST match what you created
Dim hsmTokenLabel As String = "MyTestToken"
Dim hsmPin As String = "123456"
Dim hsmKeyLabel As String = "my-key" ' The label for the key *inside* the token
' Create the HsmSigner object.
Dim hsmSigner As New UsbPkcs11HsmSigner(softhsmLibraryPath, hsmPin, hsmTokenLabel, hsmKeyLabel)
' Create the Signature Image
Dim signatureImagePath As String = "IronSoftware.png"
Dim sigImage As New PdfSignatureImage(signatureImagePath, 0, New Rectangle(50, 50, 150, 150))
' Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner)
UsbPkcs11HsmSigner 此外還接受兩個可選參數:digestAlgorithm 和 signingAlgorithm。 預設情況下,它們設定為 SHA256 和 RSA。
處理不同的 HSM 配置
不同的 HSM 裝置可能需要特定的設定。 以下範例展示如何使用自訂演算法設定簽署者,並處理多重簽名:
// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);
// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
SignerName = "Corporate Signing Authority",
Location = "Company Headquarters",
Reason = "Contract Approval"
};
// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);
// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
SignerName = "Corporate Signing Authority",
Location = "Company Headquarters",
Reason = "Contract Approval"
};
// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
Imports IronPdf
' Configure with custom algorithms
Dim customHsmSigner As New UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm:=IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm:=IronPdf.Signing.SigningAlgorithm.RSA
)
' Apply signature with custom location and reason
Dim signatureOptions As New SignatureOptions With {
.SignerName = "Corporate Signing Authority",
.Location = "Company Headquarters",
.Reason = "Contract Approval"
}
' Load existing PDF for signing
Dim existingPdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions)
常見的 HSM 配置問題有哪些?
若在執行程式碼範例時遇到以下錯誤,請依照下列疑難排解步驟進行除錯並驗證您的設定。 若需有關數位簽章問題的進一步協助,請參閱我們的數位簽章疑難排解指南。
此 CKR_GENERAL_ERROR 錯誤通常發生於程式無法找到 SoftHSM 設定檔,或是 .NET 應用程式以 32 位元程序執行,而 SoftHSM 函式庫卻是 64 位元的情況。
變更目標平台
此錯誤的常見原因在於架構不匹配。 您的 C# 應用程式必須以 64 位元程序執行,以配合 64 位元的 SoftHSM 函式庫 (CHOOSE_x64)。 請在 Visual Studio 專案屬性中,將"平台目標"從"Any CPU"或"x86"變更為 x64,以確保相容性。
設定環境變數
另一個常見原因在於程式無法在 SoftHSM 中找到 .conf 檔案。 您必須透過設定全系統環境變數,告知函式庫應從何處尋找。 建立一個名為 SOFTHSM2_CONF 的新變數,並將其值設定為您的設定檔完整路徑(例如:D:\SoftHSM2\etc\softhsm2.conf)。 請記得在完成變更後重新啟動 Visual Studio。 softhsm2-x64.dll x64 SOFTHSM2_CONF
此外,您可以透過加入以下這行代碼來驗證是否找到該變數:
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable(""SOFTHSM2_CONF"")}")
若控制台輸出為空白,表示程式無法找到該環境變數。 您必須進行設定,重新啟動 Visual Studio 或電腦,然後再試一次。
生產環境 HSM 部署的最佳實踐
在生產環境中部署經 HSM 簽署的 PDF 時,請考慮採取以下額外的安全措施:
- 稽核記錄:針對所有 HSM 操作實作全面的記錄功能,以維持合規性並追蹤存取
- 憑證管理:根據貴組織的安全政策,定期更新並輪替憑證
- 備份程序:建立適當的 HSM 配置備份與復原程序
- 效能優化:監控簽名效能,並針對頻繁存取的憑證實施快取策略
這些做法可補充標準的 PDF 簽署工作流程,並確保您的文件安全基礎架構保持強健且符合產業標準。
常見問題
何謂 HSM 簽名?它與一般 PDF 簽名有何不同?
透過 IronPDF 進行 HSM(硬體安全模組)簽名,可提供銀行級的安全性,確保私密金鑰絕不離開實體裝置。與一般 .pfx 檔案簽名不同,後者會將金鑰載入記憶體中,若電腦遭受攻擊則可能導致金鑰外洩;而 HSM 簽名則將私密金鑰鎖定在硬體裝置內,使其無法被複製或竊取。
如何在 C# 中為 PDF 設定 HSM 簽名?
若要透過 IronPDF 設定 HSM 簽名,請先透過 NuGet 執行 'Install-Package IronPdf' 安裝該函式庫,接著使用您的 HSM 憑證(包含函式庫路徑、PIN、憑證標籤及金鑰標籤)建立 UsbPkcs11HsmSigner 物件。最後,使用 SignAndSave 方法對您的 PDF 文件進行簽名。
使用 HSM 進行 PDF 簽名有哪些安全性優勢?
結合 IronPDF 使用 HSM 可提供防篡改的數位簽章,非常適合關鍵任務型應用程式。此流程猶如將文件送入銀行金庫——應用程式提供 PIN 碼,HSM 在內部對文件進行簽署,並在完全不暴露私密金鑰的情況下返回已簽署的文件,確保其無法被複製或竊取。
是否可以在沒有實體裝置的情況下測試 HSM 簽名?
是的,IronPDF 允許您在開發和測試階段使用 SoftHSM 等函式庫模擬 HSM 簽名。然而,在生產環境中,您必須使用實際的實體 HSM 裝置,以確保適當的安全性。
IronPDF 採用何種 API 標準進行 HSM 通訊?
IronPDF 採用 PKCS#11 API 標準進行 HSM 通訊,確保與標準 HSM 裝置的相容性。此通用 API 使 IronPDF 能與各種 HSM 硬體令牌及安全模組無縫互動。
如何確認我的 PDF 已成功透過 HSM 簽署?
使用 IronPDF 的 HSM 功能簽署 PDF 後,您可透過任何標準 PDF 檢視器開啟已簽署的 PDF 來驗證簽名。檢視器將顯示數位簽名資訊,並確認文件的真實性與完整性。

