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を使用する)
  2. HSM 資格情報を使用して UsbPkcs11HsmSigner を作成します。
    1. IronPDF をNuGetパッケージマネージャでインストール

      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は共通のAPIとしてPKCS#11を使用しています。 本ガイドでは、デモンストレーションのため、物理的な HSM ではなく、シミュレー ション HSM を使用しています。

本番環境やライブテスト環境では、このシミュレーションを使用しないでください。 代わりに、実際のHSMを使用してください。 本番環境では、包括的なドキュメント保護のために、パスワード保護とアクセス許可などの追加のPDFセキュリティ機能をIronPdf署名と一緒に実装することを検討してください。

このシミュレーションを実行するには、まずSoftHSMOpenSSLOpenSCをインストールして、必要なキーとトークンを生成する必要があります。 SoftHSMの利用については、GitHubの公開リポジトリを参照してください。

HSM署名を実装する前に、IronPDFを正しくインストールし、ライセンスキーを本番用に設定していることを確認してください。

HTML文字列からPDFを作成することから始めます。 以下の例では、シミュレートされた SoftHSM のパスと資格情報を定義します。 これには、作成した SoftHSM .dll ライブラリ ファイルと .crt 証明書ファイルへの絶対パスの提供が含まれます。

次に、出力パスを指定します。この例ではoutput.pdfです。

3 つの文字列を定義します: hsmPin、および hsmKeyLabel。 これらの文字列は大文字と小文字が区別され、SoftHSM でトークンと証明書を生成するときに作成した資格情報と完全に一致する必要があります。 その後、SoftHSM ライブラリ パス、PIN、トークン ラベル、およびキー ラベルをパラメーターとして渡して、UsbPkcs11HsmSigner オブジェクトを初期化します。

さらに、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 はさらに 2 つのオプション パラメータ 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 設定の問題とは

コード例の実行中に以下に示すエラーが発生した場合は、次のトラブルシューティング手順に従って構成をデバッグおよび検証してください。 デジタル署名に関するその他の問題については、デジタル署名トラブルシューティングガイドを参照してください。

この CKR_GENERAL_ERROR は、プログラムが SoftHSM 構成ファイルを見つけられない場合、または SoftHSM ライブラリが 64 ビットであるのに .NET アプリケーションが 32 ビット プロセスとして実行されている場合によく発生します。

PKCS#11 HSM の初期化エラーで、コンソール出力に CHR_GENERAL_ERROR が表示され、完全なスタックトレースがある

プラットフォームターゲットを変更する

このエラーの一般的な原因は、アーキテクチャの不一致です。 C# アプリケーションは、64 ビット SoftHSM ライブラリと一致するように 64 ビット プロセスとして実行する必要があります (softhsm2-x64.dll)。 Visual Studio プロジェクトのプロパティで、プラットフォーム ターゲットを 'Any CPU' または 'x86' から x64 に変更して互換性を確保します。

Visual Studioのビルド構成で、プラットフォーム・ターゲットをx64アーキテクチャに設定し、条件付きコンパイル・シンボルを使用しています。

環境変数の設定

もう 1 つの一般的な原因は、プログラムが SoftHSM 内の .conf ファイルを見つけられないことです。 システム全体の環境変数を設定して、ライブラリに検索場所を指示する必要があります。 SOFTHSM2_CONF という名前の新しい変数を作成し、その値を構成ファイルの完全パス (例: D:\SoftHSM2\etc\softhsm2.conf) に設定します。 変更後、Visual Studioを再起動することを忘れないでください。

HSMの設定パスを示すSOFTISM2_CONF環境変数が強調表示されたWindowsのシステム変数ダイアログ

さらに、この行を追加することで、変数が見つかったかどうかを確認することができます:

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署名を設定するには、まず'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を開くことで署名を検証することができます。ビューアはデジタル署名情報を表示し、文書の信頼性と完全性を確認します。

カーティス・チャウ
テクニカルライター

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

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 18,120,209 | バージョン: 2026.4 リリース
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package IronPdf
サンプルを実行するHTML が PDF に変換されるのを確認します。