フッターコンテンツにスキップ
製品比較
ITextSharpを使用してC#でPDFにデジタル署名を追加する方法

C#でItextsharpを使用してPDFにデジタル署名を追加する

今日の急速に進むデジタル世界では、物理的な書類は急速に電子文書に取って代わられています。 契約書の署名、請求書の承認、政府のフォームの提出など、デジタル文書が新しい常態となっています。 しかし、便利さには新たな懸念が伴います。それらのデジタル文書の信頼性と完全性をどのように保証しますか?

電子署名の登場です。 タッチスクリーンへの落書き以上のものであるデジタル署名は、暗号技術を使用して署名者の身元を確認し、文書の内容が改変されていないことを保証します。 For C# developers, integrating this level of security into PDF workflows is easier than ever—especially with tools like IronPDF and iTextSharp. この記事では、PDFにデジタル署名をする方法を解説し、ライブラリを比較してベストプラクティスを提供し、次のプロジェクトに最適なソリューションを選択する手助けをします。

デジタル署名の理解

デジタル署名は、デジタルメッセージまたは文書の信頼性と完全性を検証するために使用される暗号技術です。 単純なイメージベースの署名や入力文字による署名とは異なり、デジタル署名はプライベートキーを使用して文書のハッシュを暗号化します。 この暗号化されたハッシュは、署名者の公開鍵を使用して誰でも検証できます。

なぜこれは重要でしょうか? それは二つのことを保証します:

  1. 認証 – 署名は、所定の送信者から来たことを示すPDF文書の保証に使用されます。

  2. 完全性 – 文書は署名されてから改変されていないことを保証します。 わずかな変更でも署名は無効になってしまいます。

デジタル署名は多くの司法管轄区で法的に拘束力があり、金融、医療、法律、政府などの産業で不可欠です。

なぜPDFにデジタル署名を使用するのか?

PDFは、法的契約から公式報告書まで、プロフェッショナルな文書を配布する標準的な形式です。 PDFにデジタル署名を追加することは、以下の重要な目的を果たします:

  • 法的性とコンプライアンス: デジタル署名は、eIDAS(ヨーロッパ)やESIGN(米国)などの規制に準拠しており、法的に認められています。

  • セキュリティ: 署名された文書は改変されることなく、署名が破られることなく、改ざんや不正行為を防止します。

  • 効率: 印刷や署名、スキャンの必要がありません。 時間を節約し、安全なデジタル承認でワークフローを効率化します。

  • 信頼: クライアントやパートナーは文書の出所と完全性を自信を持って検証できます。

簡単に言えば、デジタル署名はあなたの文書ワークフローに信頼と効率をもたらします。

iTextSharpとIronPDFの比較

C#でデジタル署名を実装する際、二つのライブラリが目立ちます:iTextSharpIronPDF。 どちらも強力なツールですが、異なる開発者やプロジェクト要件に合わせて対応しています。 実際の使用状況での比較を解説しましょう。

iTextSharp: 複雑さを伴った力

iTextSharpは、PDF操作の世界でよく知られた名前です。 iText 7エコシステムの一部であり、暗号化によるデジタル署名など、低レベルのPDF操作に関する広範なサポートを提供しています。

署名の外観制御、ハッシュアルゴリズム、証明書チェーン、カスタム検証ワークフローを微細に制御する必要がある開発者は、iTextSharpが非常に有能であると感じるでしょう。 それは非常に拡張可能で、複雑な企業ニーズを念頭にデザインされています。

しかし、その柔軟性には代償があります。学習曲線が急です。可視署名の追加、デフォルトでは複数のクラス、ストリーム、構成ステップが必要になります。 新しいユーザーにとっては、これが圧倒される原因になります。

さらに、iTextSharpはAGPLの下でライセンスされており、商業ライセンスを購入しない限り、アプリケーションをオープンソースにすることが必要です。多くのクローズドソースまたは独自プロジェクトにとっては境界となります。

IronPDF: シンプルさとプロフェッショナリズムの融合

IronPDFは、それとは対照的に、現代的で開発者優先のアプローチをとっています。 そのAPIは、デジタル署名、生成、結合、編集といった一般的なPDFタスクを、最小限のセットアップで処理するように設計されており、.NETフレームワークプロジェクトに対する強力なPDFライブラリとなっています。

たとえば、IronPDFでPDFに署名するには、ストリームや暗号設定を直接操作する必要はありません。 単にPDFを読み込み、SignPdf()を呼び出し、証明書を渡すのみです。 署名者の場所、理由、連絡先情報といった追加のメタデータも1つのメソッド呼び出しでサポートされています。

もう一つの重要な利点はライセンスです。 IronPDFは、AGPL制限のない商業フレンドリーなライセンスを提供しており、プロフェッショナルアプリケーションやエンタープライズグレードのアプリケーションに最適です。 そしてこれは有料製品でありながらも、寛大な無料試用版が提供されているため、コミットする前に評価が容易です。

横並びの概要

機能 iTextSharp IronPDF
使いやすさ 学習曲線が急 初心者向け、最小限のコード
ライセンス AGPL(あるいは有料商業ライセンス) オープンソースの義務のないコマーシャルライセンス
署名カスタマイズ 暗号学的コントロールを活用した高度なカスタマイズ オプションのメタデータフィールドを持つ簡略化されたAPI
ドキュメント 詳細だが密集 開発者向けドキュメントにクリアな例が付属
最適な用途 深いカスタマイズを必要とする企業アプリケーション 迅速な実装とサポートを必要とするチーム

iTextSharpとIronPDFの開始方法

デジタル署名の実装に取り掛かる前に、各ライブラリの使い始めとする方法を理解することが重要です。 企業グレードのソリューションを構築するにせよ、簡単な社内ツールを作成するにせよ、適切なセットアップが大きな違いを生み出します。

iTextSharpのセットアップ

iTextSharpは、強力なJavaベースのiText PDFライブラリの.NET移植版です。 始めるには、NuGetを介してインストールし、プロジェクト中に正しい名前空間を参照する必要があります。

インストール

iTextSharpライブラリをプロジェクトにスムーズにインストールするために、NuGetパッケージマネージャーコンソールを使用して簡単に行えます。 次のコマンドを実行するだけです:

Install-Package iTextSharp

iTextSharpのインストール

この簡単なインストールにより、このライブラリをC#プロジェクト内で迅速に実装できます。

基本セットアップ

インストール後、iTextSharpの名前空間をプロジェクトで使用し始めることができます:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
Imports iTextSharp.text.pdf
Imports iTextSharp.text.pdf.security
$vbLabelText   $csharpLabel

iTextSharpはモジュール式であることを考慮してください。 高度な暗号機能やタイムスタンピングを使用する予定がある場合、BouncyCastle.Cryptographyのような追加のパッケージが必要になる可能性があります。 これも同様にiTextSharpと同じようにインストールでき、次の行を実行するだけです:

Install-Package BouncyCastle.Cryptography

注意すべきこと

  • ライセンス: AGPLライセンスは、iTextSharpを使用するソフトウェアが商業ライセンスを購入しない限りオープンソースであることを必要とします。

  • 依存関係: 暗号プロセスは、証明書処理にBouncyCastleをしばしば必要とします。

  • 学習曲線: 基本的な署名であっても、PdfSignerIExternalSignature、およびさまざまな暗号プロバイダを理解する必要があります。

これらの構成要素を設定し、署名プロセスの全貌(例えば外観の設定、検証レベル、またはタイムスタンピングサーバー)を制御することが快適でなければ、iTextSharpは堅実な選択肢です。

IronPDFのセットアップ

IronPDFは、開発者の生産性を念頭に置いて構築された商業的なPDFライブラリです。 これはPDFの生成、編集、署名を簡単にしたい.NET開発者のために設計されています。 IronPDFは、クリーンなAPIと迅速な結果を重視する人々にとって、はるかにスムーズなオンボーディング体験を提供します。

インストール

NuGetを通じて最新のIronPDFパッケージをインストールします:

Install-Package IronPdf

NuGetコンソールを通じたIronPDFのインストール

または.NET CLIを使用します:

Install-Package IronPdf

基本セットアップ

メインのIronPDFの名前空間をインポートすることで始めます:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

これで完了です— PDFを読み込んでデジタル署名を開始する準備が整いました。

IronPDFはすべてを内部で管理します:証明書の読み込み、可視署名の位置設定、メタデータ、最終エクスポート。 PDFストリームや暗号化アルゴリズムの手作業による管理は不要であり、迅速な開発において大きな利点です。

初心者に対する主な利点

  • オールインワン: 追加の依存関係や暗号ライブラリは必要ありません。

  • AGPLの心配なし: IronPDFは永久ライセンスと寛大な無料試用を提供します。

  • ビジュアルレンダリング: IronPDFは、印刷時と同じようにPDFをレンダリングし、契約書や公式文書に最適です。

ステップバイステップ:デジタル署名の追加

1. 証明書を準備する

用意すべきものに、.pfxのデジタル証明書ファイルとパスワードがあります。 これらはデジタル署名を生成するために使用されます。 信頼できる証明書局(CA)から証明書を取得するか、OpenSSLなどのツールを使用して内部で使用するために生成することができます。

2. iTextSharpとBouncyCastleを使ったPDF署名

必要な名前空間を含める

まず、デジタル署名を持つPDFに署名するために必要なさまざまなクラスやメソッドにアクセスするために、コードの上部に適切なusing文を確保する必要があります。

using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
using System;
using System.IO;
using System.Linq;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Pkcs;
Imports System
Imports System.IO
Imports System.Linq
Imports iTextSharp.text.pdf
Imports iTextSharp.text.pdf.security
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.Pkcs
$vbLabelText   $csharpLabel

入力PDFを定義し、PdfReaderにロードする

次に、既存のPDFのパスを指定し、PdfReaderにロードします。 後でコード内で使用される文字列変数も割り当てます。

// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
// Path to the unsigned PDF you want to sign
string filename = "example.pdf";

// Load the existing PDF into a reader
PdfReader pdfReader = new PdfReader(filename);

string reason = "Digital Signature Reason";
string location = "Digital Signature Location";
' Path to the unsigned PDF you want to sign
Dim filename As String = "example.pdf"

' Load the existing PDF into a reader
Dim pdfReader As New PdfReader(filename)

Dim reason As String = "Digital Signature Reason"
Dim location As String = "Digital Signature Location"
$vbLabelText   $csharpLabel

証明書パスとパスワードを定義する

次に、.pfx証明書ファイルを指し示し、それを保護するために使用されるパスワードを提供します。

// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
// Path to your .pfx certificate file (must contain private key)
string pfxFilePath = "certificate-file.pfx";

// Password for the certificate (make sure to protect this securely!)
string pfxPassword = "Password";
' Path to your .pfx certificate file (must contain private key)
Dim pfxFilePath As String = "certificate-file.pfx"

' Password for the certificate (make sure to protect this securely!)
Dim pfxPassword As String = "Password"
$vbLabelText   $csharpLabel

PFX証明書をPkcs12Storeを使ってロードする

BouncyCastleを使用して、証明書と秘密鍵を安全なストアにロードします。

// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
// Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Pkcs12StoreBuilder pkcs12StoreBuilder = new Pkcs12StoreBuilder();
Pkcs12Store pfxKeyStore = pkcs12StoreBuilder.Build();

// Load the certificate and private key from the PFX file
using (FileStream pfxStream = new FileStream(pfxFilePath, FileMode.Open, FileAccess.Read))
{
    // Load into the key store using the provided password
    pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray());
}
' Initialize a new PKCS#12 key store (used for handling the PFX certificate)
Dim pkcs12StoreBuilder As New Pkcs12StoreBuilder()
Dim pfxKeyStore As Pkcs12Store = pkcs12StoreBuilder.Build()

' Load the certificate and private key from the PFX file
Using pfxStream As New FileStream(pfxFilePath, FileMode.Open, FileAccess.Read)
	' Load into the key store using the provided password
	pfxKeyStore.Load(pfxStream, pfxPassword.ToCharArray())
End Using
$vbLabelText   $csharpLabel

署名を追加するためにPdfStamperを準備する

PdfStamperを使用することで、元のコンテンツを保持しながらデジタル署名を適用できます。

// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
// Create a PdfStamper that enables signing and appends the signature to the document
PdfStamper pdfStamper = PdfStamper.CreateSignature(
    pdfReader,
    new FileStream("MyPDF_Signed.pdf", FileMode.Create), // Output path
    '\0',                                                // PDF version (unchanged)
    null,                                                // Temp file path (optional)
    true                                                 // Append mode (preserves original content)
);
Imports Microsoft.VisualBasic

' Create a PdfStamper that enables signing and appends the signature to the document
Dim pdfStamper As PdfStamper = PdfStamper.CreateSignature(pdfReader, New FileStream("MyPDF_Signed.pdf", FileMode.Create), ControlChars.NullChar, Nothing, True)
$vbLabelText   $csharpLabel

署名の外観をカスタマイズする

ここで、文書内での署名の視覚的な表示場所と方法を定義します。

// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
// Access the signature appearance settings
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

// Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason;
signatureAppearance.Location = location;

// Position the visible signature on the page (x, y, width, height in points)
float x = 360;
float y = 130;
signatureAppearance.Acro6Layers = false;              // Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark; // Custom label text
signatureAppearance.SetVisibleSignature(
    new iTextSharp.text.Rectangle(x, y, x + 150, y + 50), // Rectangle position
    1,                                                    // Page number
    "signature"                                           // Field name
);
' Access the signature appearance settings
Dim signatureAppearance As PdfSignatureAppearance = pdfStamper.SignatureAppearance

' Add optional metadata (shows up in PDF signature details)
signatureAppearance.Reason = reason
signatureAppearance.Location = location

' Position the visible signature on the page (x, y, width, height in points)
Dim x As Single = 360
Dim y As Single = 130
signatureAppearance.Acro6Layers = False ' Use compact signature appearance
signatureAppearance.Layer4Text = PdfSignatureAppearance.QuestionMark ' Custom label text
signatureAppearance.SetVisibleSignature(New iTextSharp.text.Rectangle(x, y, x + 150, y + 50), 1, "signature")
$vbLabelText   $csharpLabel

秘密鍵を抽出し、PDFに署名する

秘密鍵を含む証明書エントリのエイリアス(名前)を取得します。 エイリアスが存在する場合、SHA-256を使用してデジタル署名を生成し組み込みます。

// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
// Find the first alias in the PFX that has a private key entry
string alias = pfxKeyStore.Aliases.Cast<string>().FirstOrDefault(
    entryAlias => pfxKeyStore.IsKeyEntry(entryAlias)
);

// Ensure a valid alias (certificate) was found
if (alias != null)
{
    // Retrieve the private key for signing
    ICipherParameters privateKey = pfxKeyStore.GetKey(alias).Key;

    // Create a signer using SHA-256 and the private key
    IExternalSignature pks = new PrivateKeySignature(privateKey, DigestAlgorithms.SHA256);

    // Perform the digital signing operation using CMS format
    MakeSignature.SignDetached(
        signatureAppearance,     // Signature appearance
        pks,                     // External signature handler
        new Org.BouncyCastle.X509.X509Certificate[] {
            pfxKeyStore.GetCertificate(alias).Certificate
        },                       // Certificate chain (basic single-cert example)
        null, null, null,        // Optional CRL, OCSP, TSA
        0,                       // Estimated size for the signature (0 = auto)
        CryptoStandard.CMS       // Signature standard (CMS vs CAdES)
    );
}
else
{
    Console.WriteLine("Private key not found in the PFX certificate.");
}
' Find the first alias in the PFX that has a private key entry
Dim [alias] As String = pfxKeyStore.Aliases.Cast(Of String)().FirstOrDefault(Function(entryAlias) pfxKeyStore.IsKeyEntry(entryAlias))

' Ensure a valid alias (certificate) was found
If [alias] IsNot Nothing Then
	' Retrieve the private key for signing
	Dim privateKey As ICipherParameters = pfxKeyStore.GetKey([alias]).Key

	' Create a signer using SHA-256 and the private key
	Dim pks As IExternalSignature = New PrivateKeySignature(privateKey, DigestAlgorithms.SHA256)

	' Perform the digital signing operation using CMS format
	MakeSignature.SignDetached(signatureAppearance, pks, New Org.BouncyCastle.X509.X509Certificate() { pfxKeyStore.GetCertificate([alias]).Certificate }, Nothing, Nothing, Nothing, 0, CryptoStandard.CMS)
Else
	Console.WriteLine("Private key not found in the PFX certificate.")
End If
$vbLabelText   $csharpLabel

文書を最終化する

最後に、スタンパーを閉じて、署名のプロセスを完了し、署名されたPDFをディスクに保存します。

// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
// Close the stamper to save and finalize the signed PDF
pdfStamper.Close();
' Close the stamper to save and finalize the signed PDF
pdfStamper.Close()
$vbLabelText   $csharpLabel

出力

iTextSharpを使用したPDF署名

ブートストラップセキュリティ構成フォーム

プロフェッショナルなPDFセキュリティには直観的な構成インターフェースが必要です。 このBootstrap 5の例は、IronPDFが検証状態と進捗追跡を伴う多段階セキュリティ構成フォームをレンダリングする能力を示します。

using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string securityConfigForm = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .step-indicator { display: flex; justify-content: space-between; margin-bottom: 30px; }
        .step { flex: 1; text-align: center; position: relative; }
        .step-number { width: 40px; height: 40px; border-radius: 50%; background: #e9ecef;
            display: inline-flex; align-items: center; justify-content: center; font-weight: 700; }
        .step.completed .step-number { background: #198754; color: white; }
        .step.active .step-number { background: #0d6efd; color: white; }
        @media print { .form-section { page-break-inside: avoid; } }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-4'>
        <div class='row justify-content-center'>
            <div class='col-lg-8'>
                <h2 class='text-center mb-4'>PDF Security Configuration</h2>

                <div class='step-indicator mb-4'>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Certificate</div>
                    </div>
                    <div class='step completed'>
                        <div class='step-number'>✓</div>
                        <div class='small mt-2'>Signature</div>
                    </div>
                    <div class='step active'>
                        <div class='step-number'>3</div>
                        <div class='small mt-2'>Encryption</div>
                    </div>
                    <div class='step'>
                        <div class='step-number'>4</div>
                        <div class='small mt-2'>Finalize</div>
                    </div>
                </div>

                <div class='card shadow-sm form-section'>
                    <div class='card-header bg-primary text-white'>
                        <h5 class='mb-0'>Step 3: Encryption & Permissions</h5>
                    </div>
                    <div class='card-body'>
                        <div class='mb-3'>
                            <label class='form-label'><strong>Encryption Level</strong></label>
                            <select class='form-select'>
                                <option>AES 128-bit</option>
                                <option selected>AES 256-bit (Recommended)</option>
                                <option>RC4 128-bit (Legacy)</option>
                            </select>
                            <small class='text-muted'>AES-256 provides enterprise-grade security</small>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Document Permissions</strong></label>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowPrint' checked>
                                <label class='form-check-label' for='allowPrint'>Allow Printing</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowCopy'>
                                <label class='form-check-label' for='allowCopy'>Allow Content Copying</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowModify'>
                                <label class='form-check-label' for='allowModify'>Allow Document Modification</label>
                            </div>
                            <div class='form-check form-switch'>
                                <input class='form-check-input' type='checkbox' id='allowAnnotate' checked>
                                <label class='form-check-label' for='allowAnnotate'>Allow Annotations</label>
                            </div>
                        </div>

                        <div class='mb-3'>
                            <label class='form-label'><strong>Password Protection</strong></label>
                            <input type='password' class='form-control mb-2' placeholder='Owner Password' value='••••••••'>
                            <input type='password' class='form-control' placeholder='User Password (Optional)'>
                            <small class='text-muted'>Owner password controls document permissions</small>
                        </div>

                        <div class='alert alert-success'>
                            <strong>✓ Configuration Valid</strong><br>
                            <small>Security settings meet compliance requirements</small>
                        </div>
                    </div>
                    <div class='card-footer'>
                        <div class='d-flex justify-content-between'>
                            <button class='btn btn-outline-secondary'>← Previous</button>
                            <button class='btn btn-primary'>Continue →</button>
                        </div>
                    </div>
                </div>

                <div class='card mt-3 shadow-sm'>
                    <div class='card-body'>
                        <h6 class='text-primary'>Security Comparison</h6>
                        <div class='row g-2'>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-success text-white rounded'>
                                    <strong>IronPDF</strong><br>
                                    <small>AES-256 Native</small>
                                </div>
                            </div>
                            <div class='col-6'>
                                <div class='text-center p-2 bg-warning text-dark rounded'>
                                    <strong>iTextSharp</strong><br>
                                    <small>Complex Setup</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(securityConfigForm);
pdf.SaveAs("security-configuration.pdf");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

出力: ブートストラップ5ステップインジケーター、フォームコントロールスイッチ、および検証アラートを備えたプロフェッショナルなセキュリティ構成フォームPDF。 IronPDFは、フォームスタイリング、ユーティリティクラス、およびインタラクティブな要素を完璧な忠実度でレンダリングし、iTextSharpのプログラマティックなアプローチと比較してデザイン能力を示しています。

Bootstrapフォームサポートの詳細については、Bootstrap & Flexbox CSSガイドをご覧ください。

3. C#でIronPDFを使用してPDFに署名

必要な名前空間を含める

PDF署名、証明書の取り扱い、および画像の配置を行うための必要な名前空間をインポートすることで始めます。

using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.Security.Cryptography.X509Certificates;
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System.Security.Cryptography.X509Certificates
$vbLabelText   $csharpLabel

署名するPDFを読み込む

IronPDFのシンプルなPdfDocument APIを使用してディスクから既存のPDFファイルを読み込みます。 このタスクのために新しいPDF文書を作成することもできます。

var pdf = PdfDocument.FromFile("example.pdf");
var pdf = PdfDocument.FromFile("example.pdf");
Dim pdf = PdfDocument.FromFile("example.pdf")
$vbLabelText   $csharpLabel

PFX証明書を読み込んで署名に使用する

秘密鍵を含む.pfx証明書をロードします。 エクスポータブルフラグが必要で、署名キーにアクセス可能であることが求められます。

X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
X509Certificate2 cert = new X509Certificate2(
    "IronSoftware.pfx",
    "Password",
    X509KeyStorageFlags.Exportable
);
Dim cert As New X509Certificate2("IronSoftware.pfx", "Password", X509KeyStorageFlags.Exportable)
$vbLabelText   $csharpLabel

証明書を使って新しいPdfSignatureを作成する

ロードした証明書から新しいPdfSignatureオブジェクトを作成します。

var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
Dim sig = New PdfSignature(cert)
$vbLabelText   $csharpLabel

署名を適用して出力を保存する

PDFにデジタル署名を適用し、新しいファイルとして署名されたPDF文書を保存します。

pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
$vbLabelText   $csharpLabel

出力

IronPDFを使用して署名されたPDF

4. コードの説明

  • IronPDFは、署名プロセスをシンプルで読みやすいものにしています。 PDFを読み込み、証明書を提供し、SignPdf()を呼び出すだけです。 オプションのメタデータ(連絡先、場所、理由)がプロフェッショナルさを添えます。

  • iTextSharpは、より多くのコントロールを提供しますが、ハッシュアルゴリズム、ストリーム、および証明書チェーンの詳細なセットアップが必要です。

要約:わずかなコード行でIronPDFはデジタル署名を標準の.pfx証明書を使用して非常に簡単に適用できるようにします - 低レベルの暗号化は必要ありません。 これにより、iTextSharpのようなライブラリによって同じタスクを処理するために必要なより長いコードと比較して、実装が容易になります。

5. 実世界での使用例

  • 法律チーム: テンプレートから生成された契約書に自動的に署名します。

  • 金融: 改ざん防止のために請求書やレポートにデジタル署名をします。

  • 政府ポータル: 提出前に規制基準を満たすためにフォームに署名します。

デジタル署名のベストプラクティス

デジタル署名実装から最大限の利益を享受するために:

  • 強力な証明書を使用する: 2048ビットのRSAキーまたはそれ以上を選択します。

  • 秘密鍵を安全に保つ: 証明書を安全に保管し、理想的にはハードウェアセキュリティモジュール(HSM)に保管します。

  • 署名にタイムスタンプを追加する: 証明書の期限が切れても署名が有効であることを保証する信頼できるタイムスタンプを追加します。

  • 署名を検証する: 改ざんや期限切れの証明書を検出するために、アプリケーションに検証を含めます。

  • 自動化: 展開パイプラインで署名操作をスケジュールし、文書の整合性を一貫して保つ。

結論

PDF文書にデジタル署名を追加することはもはや贅沢ではなく、今日の安全性を重視するデジタル環境では必要とされています。 契約、請求書、報告書、または法的文書を保護するために、信頼できる証明書で支持された改ざん防止署名を保持することで、ファイルの信頼性と完全性を保証します。

この記事では、C#でのPDF署名に対する二つの強力なアプローチを探りました:

  • 低レベルの暗号化制御と柔軟性を提供しますが、ボイラープレートが多く、BouncyCastleの知識が必要なiTextSharp

  • セキュアな署名の適用プロセスをシームレスかつ開発者に優しいモダンで高レベルのAPIを提供するIronPDF

どちらのツールもセキュアな.pfx証明書をサポートしますが、IronPDFはワークフローを明らかに簡単にし、暗号のプリミティブを扱う時間を減らし、より多くのビジネス価値を提供することに集中したい.NET開発者には理想的です。

iTextSharpとIronPDFの比較チャート

次のステップ

まだ試していない場合、IronPDFの無料試用ライセンスをダウンロードして、わずか数行のコードで自分のPDFに署名することを検討してください。 特に時間の制約が厳しいプロジェクトで作業する際、生産性の向上策だけでもスイッチをする価値があります。

ご注意iTextSharpはその所有者の登録商標です。 このサイトはiTextSharpと関係がない、または推奨、スポンサーされていません。すべての製品名、ロゴ、およびブランドは、それぞれの所有者の財産です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

デジタル署名は、PDFドキュメントの信頼性をどのようにして保証しますか?

デジタル署名は、署名者の身元を確認し、文書が改ざんされていないことを保証するために、暗号技術を使用します。これは、文書のハッシュを秘密鍵で暗号化することによって達成され、認証と完全性の両方を提供します。

電子文書に対してなぜデジタル署名が重要なのですか?

デジタル署名は、電子文書の合法性、安全性、効率性、信頼性を維持するために不可欠です。規制の遵守を確保し、改ざんを防ぎ、文書のワークフローを合理化し、文書の出所と完全性を確認します。

C#でPDFにデジタル署名を追加するにはどうすればよいですか?

C#では、IronPDFを使用してPDFにデジタル署名を追加できます。このプロセスは、PDFを読み込み、X509Certificate2を使用して.pfx証明書を提供し、Signメソッドを呼び出して署名を適用することを含みます。

デジタル署名のためのiTextSharpと他のPDFライブラリの主な違いは何ですか?

iTextSharpは、詳細なPDF操作に対する広範なサポートを提供し、学習曲線が急であり特定のライセンスを必要とします。IronPDFは、その一方で、初心者に優しい簡易化されたAPIがあり、すばやい実装を可能にし、オープンソースライセンスを必要としません。

C#で文書に署名するためのPDFライブラリをどのようにインストールしますか?

IronPDFはNuGetを介して、コマンドInstall-Package IronPdfを使用して、または.NET CLIでdotnet add package IronPdfを使用してインストールできます。

iTextSharpを使用してPDFにデジタル署名をするにはどのステップが必要ですか?

iTextSharpでPDFにデジタル署名をするには、PdfStamperを設定し、署名の外観をカスタマイズし、BouncyCastleを使用して.pfx証明書を読み込み、PdfSignerIExternalSignatureを暗号操作のために使用する必要があります。

PDFにおけるデジタル署名の実装におけるベストプラクティスは何ですか?

ベストプラクティスには、強力な証明書の使用、秘密鍵の保護、署名へのタイムスタンプの適用、定期的な署名の確認、署名プロセスの自動化によって文書の完全性を維持することが含まれます。

PDF文書におけるデジタル署名の現実世界での用途にはどのようなものがありますか?

デジタル署名は、契約書の署名のために法務部門で、請求書や報告書の承認のために金融で、そして規制基準に準拠させるために政府機関で処理フォームを保証するために一般的に使用されます。

迅速なデジタル署名の実装を必要とする開発者にとって、どのPDFライブラリが優れていますか?

デジタル署名の迅速な実装を求める開発者には、その簡潔で明確なAPIが署名プロセスを簡素化し、最小限のコードで済むため、IronPDFが推奨されます。

IronPDF は、デジタル署名の追加と検証に関して .NET 10 と互換性がありますか?

はい — IronPDF は .NET 10 と完全に互換性があります。.NET 10 (.NET 9、8、7 などと併せて) をサポートし、デジタル署名機能 (例: PdfSignatureX509Certificate2の使用、署名と検証) は .NET 10 ランタイムですぐに使用できます。

Curtis Chau
テクニカルライター

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

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