透かしなしで本番環境でテストしてください。
必要な場所で動作します。
30日間、完全に機能する製品をご利用いただけます。
数分で稼働させることができます。
製品トライアル期間中にサポートエンジニアリングチームへの完全アクセス
今日の急速に進化するデジタル世界では、物理的な書類が電子ドキュメントに急速に置き換えられています。 契約書に署名する場合でも、請求書を承認する場合でも、政府の書式を提出する場合でも、デジタル文書は新しい常識となっています。 しかし、便利さと共に新たな懸念が生じます。それらのデジタル文書の真正性と完全性をどのように確保するのでしょうか?
電子署名を入力してください。 タッチスクリーン上の落書き以上に、デジタル署名は暗号技術を用いて署名者の身元を確認し、文書の内容が改ざんされていないことを保証します。 C#開発者にとって、このレベルのセキュリティをPDFワークフローに統合することが、IronPDFやiTextSharpのようなツールを使用することでこれまでになく簡単になりました。 この記事では、PDFのデジタル署名のプロセスを解説し、ライブラリの比較やベストプラクティスを提供し、次のプロジェクトのための最適なソリューションの選択を支援します。
デジタル署名は、デジタルメッセージやドキュメントの真正性と整合性を検証するために使用される暗号技術です。 単純な画像ベースの署名やタイプされた名前とは異なり、デジタル署名は秘密鍵を使用してドキュメントのハッシュを暗号化します。 この暗号化されたハッシュは、署名者の公開鍵を使用して誰でも検証できます。
なぜこれが重要なのでしょうか? その理由は、2つのことを確実にするからです。
認証 – シグネチャは、記載された送信者から届いたPDFドキュメントを確認するために使用されます。
完全性 – ドキュメントは署名されて以来、変更されていません。 ごくわずかな変更でも署名が無効になります。
デジタル署名は多くの法域で法的拘束力を持ち、金融、医療、法律、政府などの業界で非常に重要です。
PDFは、法律契約から公式報告書まで、プロフェッショナルなドキュメントの配布における標準的な形式です。 PDFにデジタル署名を追加することには、いくつかの重要な目的があります。
信頼: クライアントやパートナーは、文書の出所と整合性を自信を持って確認できます。
要するに、デジタル署名はドキュメントのワークフローに信頼性と効率性をもたらします。
C#でデジタル署名を実装する際に、よく使われるライブラリには、iTextSharpとIronPDFがあります。 どちらも有能なツールですが、それらは異なるタイプの開発者とプロジェクト要件に対応しています。 実際の使用においてどのように比較されるかを分解してみましょう。
iTextSharp は、PDF 操作の世界でよく知られた名前です。 これは、暗号化デジタル署名を含む低レベルのPDF操作を広範にサポートする、より広範なiText 7エコシステムの一部です。
署名の外観、ハッシュアルゴリズム、証明書チェーン、およびカスタム検証ワークフローに対するきめ細かい制御を必要とする開発者は、iTextSharpを非常に便利に感じるでしょう。 それは非常に拡張性が高く、複雑な企業のニーズを考慮して設計されています。
しかし、その柔軟性は代償を伴います。学習曲線は急です。目に見える署名を追加するなどの簡単なタスクでさえ、複数のクラス、ストリーム、および設定手順を必要とすることが多いです。 新しいユーザーにとって、これは圧倒的かもしれません。
さらに、iTextSharpはAGPLの下でライセンスされており、あなたのアプリケーションをオープンソースにすることを要求します。これは、商用ライセンスを購入しない限り、多くのクローズドソースまたはプロプライエタリなプロジェクトにとって妥協しがたい要素です。
IronPDF は、それとは対照的に、現代的で開発者優先のアプローチを取ります。 そのAPIは、デジタル署名、生成、結合、編集などの一般的なPDFタスクを最小限のセットアップで処理するように設計されています。iTextSharpで十数ステップかかる作業が、IronPDFではたった1~2行で済むことがよくあります。 これは、.NETフレームワークプロジェクトにとって強力なPDFライブラリです。
たとえば、IronPDFでPDFに署名する場合、ストリームや暗号設定を直接操作する必要はありません。 PDFを読み込み、.SignPdf()を呼び出し、証明書を渡すだけです。 署名者の場所、理由、連絡先情報など、追加のメタデータもサポートしており、すべて単一のメソッドコールで実行できます。
もう一つの重要な利点はライセンスです。 IronPDFは、商用に適したライセンスをAGPLの制限なしで提供しており、プロフェッショナルおよびエンタープライズグレードのアプリケーションに最適です。 これは有料製品ですが、寛大な無料トライアルが用意されており、コミットする前に評価が容易です。
機能 iTextSharp IronPDF
使いやすさ 急峻な学習曲線 初心者向け、最小限のコード
ライセンス AGPL(または有料商用ライセンス) オープンソースの義務がない商業ライセンス
署名カスタマイズ 暗号化制御により高いカスタマイズ性 オプションのメタデータフィールドを備えた簡素化されたAPI
ドキュメント 詳細だが密度が高い 開発者向けドキュメントによる明確な例
最適な用途 高度にカスタマイズされたエンタープライズアプリケーション 迅速な実装とサポートを必要とするチーム
デジタル署名の実装に取り組む前に、各ライブラリをどのように立ち上げて実行するかを理解することが重要です。 エンタープライズグレードのソリューションを構築する場合でも、社内ツールを迅速に作成する場合でも、適切なセットアップが大きな違いをもたらします。
iTextSharp は、強力な Java ベースの iText PDF ライブラリの .NET 向け移植版です。 開始するには、NuGetを介してインストールし、プロジェクト内で正しい名前空間を参照する必要があります。
NuGet パッケージ マネージャー コンソールを使用して、iTextSharp ライブラリを簡単にプロジェクトにインストールできます。 次のコマンドを実行するだけです:
Install-Package iTextSharp
Install-Package iTextSharp
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package 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
iTextSharp はモジュラー式であることを忘れないでください。 高度な暗号化機能やタイムスタンピングを使用する予定がある場合は、BouncyCastle.Cryptographyのような追加パッケージが必要になる可能性があります。 これはiTextSharpと同様にインストールできます。次の行を実行してください:
Install-Package BouncyCastle.Cryptography
Install-Package BouncyCastle.Cryptography
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package BouncyCastle.Cryptography
注意すべきこと
学習曲線: 基本的な署名でさえ、PdfSigner、IExternalSignature、さまざまな暗号プロバイダーを理解することが必要です。
これらのビルディングブロックを設定するのに慣れていて、署名プロセスの完全な制御が必要な場合(例:外観の設定、検証レベル、タイムスタンプサーバーなど)、iTextSharp は堅実な選択です。
IronPDFは、開発者の生産性を考慮して構築された商用PDFライブラリです。 .NET の開発者が、最小限の手間でPDFを生成、編集、署名したい場合に設計されています。 IronPDF は、特にクリーンな API と迅速な結果を重視する方にとって、非常にスムーズなオンボーディング体験を提供します。
NuGetを通じて最新のIronPDFパッケージをインストール:
Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
または.NET CLIを使用します。
dotnet add package IronPdf
dotnet add package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'dotnet add package IronPdf
まず、メインのIronPDF名前空間をインポートします:
using IronPdf;
using IronPdf;
Imports IronPdf
これで大丈夫です。PDFを読み込み、デジタル署名の追加を始める準備が整いました。
IronPDFはすべてを内部で管理します:証明書の読み込み、視覚署名の配置、メタデータ、および最終的なエクスポート。 PDFストリームや暗号アルゴリズムを手動で管理する必要がないため、迅速な開発において大きな利点となります。
初心者にとっての主な利点
あなたには.pfx デジタル証明書ファイルとパスワードが必要です。 これらはデジタル署名を生成するために使用されます。 信頼できる認証機関(CA)から証明書を取得するか、OpenSSLのようなツールを使用して内部使用のために生成することができます。
必要な名前空間を含める
まず、iTextSharpを使用して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
入力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"
証明書のパスとパスワードを定義する
次に、.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"
Pkcs12Storeを使用して.PFX証明書をロード
私たちは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
署名追加のための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)
署名の外観をカスタマイズ
次に、署名が visually にドキュメントのどこにどのように表示されるかを定義します。
// 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")
秘密鍵を抽出し、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
ドキュメントを完成させる
最後に、スタンパーを閉じて署名プロセスを完了し、署名済み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()
必要な名前空間を含める
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
署名したいPDFをロード
IronPDFのシンプルなPdfDocument APIを使用して、ディスクから既存のPDFファイルを読み込みます。 このタスクのために新しいPDFドキュメントを作成することもできます。
var pdf = PdfDocument.FromFile("example.pdf");
var pdf = PdfDocument.FromFile("example.pdf");
Dim pdf = PdfDocument.FromFile("example.pdf")
署名に使用する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)
証明書を使用して新しいPdfSignatureを作成する
読み込んだ証明書から新しいPdfSignatureオブジェクトを作成します。
var sig = new PdfSignature(cert);
var sig = new PdfSignature(cert);
Dim sig = New PdfSignature(cert)
署名を適用して出力を保存する
PDFをデジタル署名し、署名済みのPDFドキュメントを新しいファイルとして保存します。
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig);
pdf.SaveAs("signed.pdf");
pdf.Sign(sig)
pdf.SaveAs("signed.pdf")
出力
iTextSharp は、より多くの制御を提供しますが、ハッシュアルゴリズム、ストリーム、および証明書チェーンを用いた詳細なセットアップが必要です。
概要: 数行のコードで、IronPDFは標準的な.pfx証明書を使用してデジタル署名を簡単に適用できます。低レベルの暗号化は必要ありません。 これは、iTextSharpのようなライブラリが同じタスクを処理するために必要とする長いコードと比較して、実装が容易になります。
デジタル署名の実装を最大限に活用するために:
PDFドキュメントにデジタル署名を追加することは、もはや贅沢ではなく、今日のセキュリティを意識したデジタル環境においては必要不可欠です。 契約書、請求書、レポート、または法的文書を保護しているかどうかにかかわらず、信頼できる証明書によってサポートされた改ざん防止シグネチャを使用すれば、ファイルの真正性と完全性が保たれます。
この記事では、C#でPDFに署名するための2つの強力なアプローチを検討しました。
IronPDFは、最新のハイレベルAPIを提供し、安全な署名の適用プロセスをシームレスかつ開発者に優しいものにします。
どちらのツールも安全な .pfx 証明書をサポートしていますが、IronPDF はワークフローを明確に簡素化します。.NET 開発者が暗号化プリミティブの取り扱いに時間をかけず、ビジネス価値の提供に集中したい場合に理想的です。
まだダウンロードしていない場合は、IronPDFの無料トライアルを検討し、数行のコードで独自のPDFに署名してみてください。 特に時間に敏感なプロジェクトに取り組んでいるときには、生産性の向上だけでも切り替える価値があります。