HSMを使用してC#でPDFにデジタル署名する方法
IronPDFは、PKCS#11 APIを通じてハードウェアセキュリティモジュール(HSM)を使用したセキュアなPDF署名を可能にし、秘密鍵が物理デバイスから離れることがないため、改ざん防止された電子署名を必要とするミッションクリティカルなアプリケーションに銀行レベルのセキュリティを提供します。
クイックスタート: C# で HSM を使用して PDF に署名する-
NuGet 経由で IronPDF をインストールする:
Install-Package IronPdf2.HSMデバイスを設定する(またはテスト用にSoftHSMを使用する) -
HSMの認証情報を使用して
UsbPkcs11HsmSignerを作成してください:-
1Install IronPDF with NuGet Package Manager
-
2このコード スニペットをコピーして実行します。
var hsmSigner = new UsbPkcs11HsmSigner(libraryPath, pin, tokenLabel, keyLabel);C# -
3実際の環境でテストするためにデプロイする
今日プロジェクトで IronPDF を使い始めましょう無料トライアル
-
4.PDFを作成し、署名してください:
var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>");
pdf.SignAndSave("signed.pdf", hsmSigner);Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>")
pdf.SignAndSave("signed.pdf", hsmSigner)5.PDFビューアで署名を確認する
PDF ドキュメントに署名を追加することは、多くのアプリケーションで共通の要件です。 しかし、ミッション・クリティカルなアプリケーションでは、キーが改ざんできない高いセキュリティが要求されます。 .pfx ファイルを使用した通常の署名操作は、自宅にマスターキーを持っているようなものです。 アプリケーションは、文書に署名するためにキーをメモリにロードします。 コンピュータが危険にさらされた場合、キーが盗まれる可能性があります。
より安全な代替手段は、ハードウェア・セキュリティ・モジュール(HSM)を使用することです。 HSM(USBトークンのようなもの)では、秘密鍵はデバイス内部で生成され、デバイスから離れることはできません。
このプロセスは、銀行に文書を持ち込むようなものです。 アプリケーションはPINを提供し、HSMは文書を金庫に持ち込み、キーでスタンプを押してスタンプを押された文書を返します。 鍵は金庫から出ません。 これは、キーがコピーされたり盗まれたりすることがないため、さらなるセキュリティを提供します。
HSMでPDFにデジタル署名する方法
- HSMでPDFに署名するためのIronPDF C#ライブラリをダウンロードする。
- 既存のHSMをインポートするか、他のライブラリでシミュレートします。
- 新しい
UsbPkcs11HsmSignerオブジェクトを作成します。 SignAndSaveでPDFに署名して保存してください。- PDF出力と証明書をPDFビューアで確認する
HSMでPDFに署名するには?
HSM を使用して署名するには、通常、アプリケーションが対話する USB トークンなどの物理デバイスが必要です。 IronPDFはこれらの操作と互換性があり、ライブラリと標準HSMは共通のAPIとしてPKCS#11を使用しています。 本ガイドでは、デモンストレーションのため、物理的な HSM ではなく、シミュレー ション HSM を使用しています。
本番環境やライブテスト環境では、このシミュレーションを使用しないでください。 代わりに、実際のHSMを使用してください。 本番環境では、包括的なドキュメント保護のために、パスワード保護とアクセス許可などの追加のPDFセキュリティ機能をIronPDF署名と一緒に実装することを検討してください。
このシミュレーションを実行するには、まずSoftHSM 、 OpenSSL 、 OpenSCをインストールして、必要なキーとトークンを生成する必要があります。 SoftHSMの利用については、GitHubの公開リポジトリを参照してください。
HSM署名を実装する前に、IronPDFを正しくインストールし、ライセンスキーを本番用に設定していることを確認してください。
HTML文字列からPDFを作成することから始めます。 以下の例では、シミュレートされた SoftHSM のパスと資格情報を定義します。 これには、SoftHSM .dll ライブラリファイルおよび作成した .crt 証明書ファイルへの絶対パスの記載が含まれます。
次に、出力パスを指定します。この例では output.pdf です。
3つの文字列を定義してください:hsmKeyLabel。 これらの文字列は大文字と小文字が区別され、SoftHSM でトークンと証明書を生成するときに作成した資格情報と完全に一致する必要があります。 その後、SoftHSMライブラリのパス、PIN、トークンラベル、およびキーラベルをパラメータとして渡し、UsbPkcs11HsmSignerオブジェクトを初期化します。
さらに、PdfSignatureImage を作成し、署名の視覚的表現をドキュメントに追加してください。 最後に、hsmSignerを使用してドキュメントに署名し、指定された出力パスに保存します。
HSM署名コードはどのように見えますか?
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 という 2 つのオプションパラメータを受け取ります。 デフォルトでは、これらは 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);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 ビット版の SoftHSM ライブラリ (CHOOSE_x64) に対応するため、64 ビットプロセスとして実行する必要があります。 互換性を確保するため、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"")}")コンソール出力が空白を返す場合、プログラムは環境変数を見つけることができません。 設定し、Visual Studio またはコンピューターを再起動して、再試行する必要があります。
プロダクション HSM 展開のベストプラクティス
HSM署名されたPDFを本番環境に展開する際には、以下の追加のセキュリティ対策を考慮してください:
1.監査ロギング: コンプライアンスを維持し、アクセスを追跡するために、すべてのHSM操作に対して包括的なロギングを実装する。 2.証明書の管理:組織のセキュリティポリシーに従って、証明書を定期的に更新し、ローテーションします。 3.バックアップ手順: HSM構成の適切なバックアップとリカバリ手順を確立する。 4.パフォーマンスの最適化:署名のパフォーマンスを監視し、頻繁にアクセスされる証明書のキャッシュ戦略を実装する。
これらのプラクティスは、標準的なPDF署名ワークフローを補完し、文書セキュリティインフラストラクチャが堅牢で業界標準に準拠していることを保証します。
よくある質問
HSM署名とはどのようなもので、通常のPDF署名とどう違うのですか?
IronPDF による HSM (ハードウェアセキュリティモジュール) 署名は銀行レベルのセキュリティを提供し、秘密鍵が物理デバイスから離れることはありません。通常の.pfxファイルへの署名では、秘密鍵はメモリにロードされ、コンピュータが攻撃された場合に危険にさらされる可能性がありますが、HSM署名では秘密鍵はハードウェアデバイス内にロックされるため、コピーや盗用は不可能です。
C#でPDFのHSM署名を設定するには?
IronPDFでHSM署名を設定するには、まず'Install-Package IronPDF'でNuGet経由でライブラリをインストールし、ライブラリパス、PIN、トークン・ラベル、キー・ラベルを含むHSM認証情報でUsbPkcs11HsmSignerオブジェクトを作成します。最後に、SignAndSaveメソッドを使用してPDFドキュメントに署名します。
PDF署名にHSMを使用するセキュリティ上の利点は何ですか?
IronPDFでHSMを使用することで、ミッションクリティカルなアプリケーションに理想的な改ざん防止の電子署名を提供します。アプリケーションはPINを提供し、HSMは内部で文書に署名し、秘密鍵を公開することなく署名された文書を返します。
物理的なデバイスなしでHSM署名をテストできますか?
はい、IronPDFでは開発やテストの目的でSoftHSMのようなライブラリを使用してHSM署名をシミュレートすることができます。しかし本番環境では、適切なセキュリティを確保するために実際の物理的なHSMデバイスを使用する必要があります。
IronPDFはHSM通信にどのようなAPI標準を使用していますか?
IronPDFはHSM通信にPKCS#11 API標準を使用し、標準的なHSMデバイスとの互換性を確保しています。この共通APIにより、IronPDFは様々なHSMハードウェアトークンやセキュリティモジュールとシームレスにやり取りすることができます。
PDFがHSMで正常に署名されたことを確認するにはどうすればよいですか?
IronPDFのHSM機能でPDFに署名した後、標準的なPDFビューアで署名されたPDFを開くことで署名を検証することができます。ビューアはデジタル署名情報を表示し、文書の信頼性と完全性を確認します。
How do I add a trusted timestamp to an HSM-signed PDF?
Set the TimeStampUrl property on the signer to the endpoint of an RFC 3161 Time Stamp Authority before calling SignAndSave. The endpoint is supplied as a string, and the resulting signature carries a timestamp token that readers such as Adobe Acrobat recognize. Leaving the property null or empty skips timestamping entirely and makes no network call.
Which hash algorithm does the HSM timestamp use?
TimestampHashAlgorithm selects the digest requested from the timestamp authority and accepts SHA1, SHA256, or SHA512. The built-in UsbPkcs11HsmSigner defaults to SHA256 through its AHsmSigner base class. A custom signer that implements IHsmSigner directly without deriving from AHsmSigner receives the uninitialized enum value, which is SHA1, so it should set the property explicitly. Note that this is separate from the digestAlgorithm constructor parameter, which governs the signature itself rather than the timestamp.
What causes a TimestampException during HSM signing?
TimestampException is thrown when a timestamp cannot be obtained or embedded. The three causes are an unreachable Time Stamp Authority, an authority that returns an empty token, and a timestamped signature that does not fit the reserved signature space, which can happen when a TSA returns a very large certificate chain. The exception message states the actual size against the reserved size.

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。