如何使用 HSM 透過 C# 進行 PDF簽名

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF透過 PKCS#11 API 使用硬體安全模組 (HSM) 實現安全的 PDF 簽名,私鑰永遠不會離開實體設備,為需要防篡改數位簽名的關鍵任務應用程式提供銀行級安全性。

快速入門:使用 C# 中的 HSM 對 PDF 進行簽名

  1. 透過NuGet安裝IronPDF :Install-Package IronPdf
  2. 設定您的 HSM 設備(或使用 SoftHSM 進行測試)
  3. 使用您的 HSM 憑證建立 UsbPkcs11HsmSigner
    1. 使用NuGet套件管理器安裝https://www.nuget.org/packages/IronPdf

      PM > Install-Package IronPdf
    2. 複製並運行這段程式碼。

      var hsmSigner = new UsbPkcs11HsmSigner(libraryPath, pin, tokenLabel, keyLabel);
    3. 部署到您的生產環境進行測試

      今天就在您的專案中開始使用免費試用IronPDF

      arrow pointer
  4. 產生 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
  5. 在 PDF 檢視器中驗證簽名

在許多應用程式中,為 PDF 文件添加簽名是一項常見需求。 然而,關鍵任務型應用需要更高的安全性,金鑰不能被竄改。 使用 .pfx 文件進行正常的簽名操作就像擁有一把家裡的萬能鑰匙一樣。 應用程式將密鑰載入到記憶體中以簽署文件。 如果電腦系統遭到入侵,金鑰可能會被偷。

更安全的替代方案是使用硬體安全模組(HSM)。 使用 HSM(例如 USB 令牌)時,私鑰在裝置內部生成,無法離開裝置。

這個過程就像把文件帶到銀行一樣。 該應用程式提供一個 PIN 碼,HSM 將文件帶入保險庫,用鑰匙蓋章,然後返回蓋章後的文件。 鑰匙永遠不會離開金庫。 這樣可以提供額外的安全性,因為金鑰無法被複製或被盜。

如何使用 HSM 對 PDF 檔案進行簽名?

使用 HSM 進行簽名通常需要一個實體設備,例如 USB 令牌,應用程式需要與該設備進行互動。 IronPDF與這些操作相容,因為該程式庫和標準 HSM 都使用 PKCS#11 作為通用 API。 為了演示目的,本指南使用模擬 HSM 而不是實體 HSM。

在生產環境或即時測試環境中,不應使用此模擬。 請改用您實際的 HSM。 對於生產環境,除了 HSM 簽章之外,還可以考慮實施額外的PDF 安全功能,例如密碼保護和權限控制,以實現全面的文件保護。

要執行此模擬,您必須先安裝SoftHSMOpenSSLOpenSC以產生必要的金鑰和令牌。 有關使用 SoftHSM 的更多信息,請參閱其公開的GitHub存儲庫。

在實施 HSM 簽章之前,請確保已正確安裝IronPDF並配置了用於生產環境的授權金鑰

首先,根據 HTML 字串建立 PDF 檔案。 在下面的範例中,我們定義了模擬 SoftHSM 的路徑和憑證。 這包括提供您建立的 SoftHSM .dll 庫檔案和 .crt 憑證檔案的絕對路徑。

接下來,指定輸出路徑,在本例中為 output.pdf。

定義三個字串:hsmPinhsmKeyLabel。 這些字串區分大小寫,並且必須與您使用 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)
$vbLabelText   $csharpLabel

UsbPkcs11HsmSigner 也接受兩個可選參數:digestAlgorithmsigningAlgorithm。 預設情況下,它們設定為 SHA256RSA

使用不同的 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)
$vbLabelText   $csharpLabel

當處理需要特定合規標準的數位簽章範例,或需要添加元資料來追蹤簽章詳細資料時,此方法特別有用。

常見的HSM設定問題有哪些?

如果在執行程式碼範例時遇到以下錯誤,請依照下列故障排除步驟進行偵錯和驗證您的配置。 如需有關數位簽章問題的更多協助,請參閱我們的數位簽章故障排除指南

當程式找不到 SoftHSM 設定文件,或.NET應用程式以 32 位元進程運行而 SoftHSM 庫為 64 位元時,通常會發生 CKR_GENERAL_ERROR 錯誤。

PKCS#11 HSM 初始化錯誤,控制台輸出顯示 CHR_GENERAL_ERROR 錯誤,並附有完整的堆疊追蹤。

更改平台目標

導致此錯誤的常見原因是架構不符。 您的 C# 應用程式必須以 64 位元進程運行,才能與 64 位元 SoftHSM 程式庫相符 (softhsm2-x64.dll)。 在 Visual Studio 專案屬性中,將平台目標從"Any CPU"或"x86"變更為 x64,以確保相容性。

Visual Studio 產生設定顯示平台目標設定為 x64 架構,並附有條件編譯符號

設定環境變數

另一個常見原因是程式在 SoftHSM 中找不到 .conf 檔案。 您必須透過設定係統範圍的環境變數來告訴庫在哪裡尋找。 建立一個名為 SOFTHSM2_CONF 的新變量,並將其值設為設定檔的完整路徑(例如,D:\SoftHSM2\etc\softhsm2.conf)。 更改完成後,請記得重新啟動 Visual Studio。

Windows 系統變數對話框,其中 SOFTISM2_CONF 環境變數高亮顯示,顯示了 HSM 配置路徑

此外,您還可以透過新增以下程式碼行來驗證變數是否已找到:

Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable(""SOFTHSM2_CONF"")}")
$vbLabelText   $csharpLabel

如果控制台輸出為空,則表示程式找不到該環境變數。 您必須進行設置,重新啟動 Visual Studio 或計算機,然後重試。

生產環境 HSM 部署最佳實踐

在生產環境中部署經 HSM 簽署的 PDF 檔案時,請考慮以下額外的安全措施:

1.審計日誌:對所有 HSM 操作實施全面的日誌記錄,以確保合規性並追蹤存取情況 2.證書管理:根據貴組織的安全策略定期更新和輪調證書。 3.備份程序:為 HSM 設定建立適當的備份和復原程序 4.效能最佳化:監控簽章效能並對常用憑證實施快取策略

這些做法是標準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 來驗證簽章。查看器將顯示數位簽章資訊,並確認文件的真實性和完整性。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 18,120,209 | 版本: 2026.4 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package IronPdf
執行範例 觀看您的 HTML 變成 PDF。