PDF におけるデジタル署名の検証は、ドキュメントが改ざんされておらず、署名者の真正性が確認できることを保証するために非常に重要です。この検証プロセスは、ドキュメントの整合性や信頼性を維持する上で不可欠です。また、デジタル署名の抽出を行うことで、署名画像や証明書情報などの詳細を取得でき、さらなる検証やアーカイブ目的に活用できます。本記事では、Java で Spire.PDF for Java ライブラリを使用して、PDF 内のデジタル署名を検証および抽出する方法を説明します。
Spire.PDF for Java をインストールします
まず、Spire.PDF for Java を Java プロジェクトに追加する必要があります。JAR ファイルは、このリンクからダウンロードできます。Maven を使用する場合は、次のコードをプロジェクトの pom.xml ファイルに追加する必要があります。
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url> https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>10.11.2</version>
</dependency>
</dependencies>
Java で PDF のデジタル署名を検証する
Spire.PDF for Java は、PdfSignature.verifySignature() メソッドを提供しており、PDF ドキュメント内のデジタル署名の有効性を確認できます。詳細な手順は以下の通りです。
- PdfDocument クラスのオブジェクトを作成します。
- PdfDocument.LoadFromFile() メソッドを使用して PDF ドキュメントを読み込みます。
- PdfDocument.Form プロパティを利用して、PDF ドキュメントのフォームを取得します。
- フォーム内のすべてのフィールドをループ処理し、署名フィールドを見つけます。
- PdfSignatureFieldWidget.getSignature() メソッドを使用して署名を取得します。
- PdfSignature.verifySignature() メソッドを用いて署名の有効性を検証します。
- Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.fields.PdfField;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
public class VerifySignature {
public static void main(String[] args) {
// PdfDocumentオブジェクトを作成
PdfDocument pdf = new PdfDocument();
// PDFドキュメントを読み込む
pdf.loadFromFile("Sample.pdf");
// PDFドキュメントのフォームを取得
PdfFormWidget formWidget = (PdfFormWidget) pdf.getForm();
if(formWidget.getFieldsWidget().getCount() > 0)
{
// フォーム内のすべてのフィールドを反復処理する
for(int i = 0; i < formWidget.getFieldsWidget().getCount(); i ++)
{
PdfField field = formWidget.getFieldsWidget().get(i);
// 署名フィールドを見つける
if (field instanceof PdfSignatureFieldWidget)
{
PdfSignatureFieldWidget signatureField = (PdfSignatureFieldWidget) field;
// 署名を取得
PdfSignature signature = signatureField.getSignature();
// 署名を検証
boolean valid = signature.verifySignature();
if(valid)
{
System.out.print("署名は有効です!");
}
else
{
System.out.print("署名は無効です!");
}
}
}
}
}
}
Java で署名済み PDF が改ざんされたかを検出する
署名済みの PDF ドキュメントが改ざんされているかを確認するには、PdfSignature.VerifyDocModified() メソッドを使用します。詳細な手順は以下の通りです。
- PdfDocument クラスのオブジェクトを作成します。
- PdfDocument.LoadFromFile() メソッドを使用して PDF ドキュメントを読み込みます。
- PdfDocument.Form プロパティを利用して、PDFドキュメントのフォームを取得します。
- フォーム内のすべてのフィールドをループ処理し、署名フィールドを見つけます。
- PdfSignatureFieldWidget.getSignature() メソッドを使用して署名を取得します。
- PdfSignature.VerifyDocModified() メソッドを用いて、署名後にドキュメントが改ざんされていないかを検証します。
- Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.fields.PdfField;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
public class CheckIfSignedPdfIsModified {
public static void main(String[] args) {
// PdfDocumentオブジェクトを作成
PdfDocument pdf = new PdfDocument();
// PDFドキュメントを読み込む
pdf.loadFromFile("Sample.pdf");
// PDFドキュメントのフォームを取得
PdfFormWidget formWidget = (PdfFormWidget) pdf.getForm();
if(formWidget.getFieldsWidget().getCount() > 0) {
// フォーム内のすべてのフィールドを反復処理する
for (int i = 0; i < formWidget.getFieldsWidget().getCount(); i++) {
PdfField field = formWidget.getFieldsWidget().get(i);
// 署名フィールドを見つける
if (field instanceof PdfSignatureFieldWidget) {
PdfSignatureFieldWidget signatureField = (PdfSignatureFieldWidget) field;
// 署名を取得
PdfSignature signature = signatureField.getSignature();
// 署名を検証
boolean modified = signature.verifyDocModified();
if(modified)
{
System.out.print("ドキュメントは変更されています!");
}
else
{
System.out.print("ドキュメントは変更されていません!");
}
}
}
}
}
}
Java で PDF から署名画像と証明書情報を抽出する
PDF から署名画像および証明書情報を抽出するには、PdfFormWidget.extractSignatureAsImages() メソッドと PdfSignature.getCertificate().toString() メソッドを使用します。詳細な手順は以下の通りです。
- PdfDocument クラスのオブジェクトを作成します。
- PdfDocument.LoadFromFile() メソッドを使用して PDF ドキュメントを読み込みます。
- PdfDocument.Form プロパティを利用して、PDF ドキュメントのフォームを取得します。
- PdfFormWidget.extractSignatureAsImages() メソッドを使用して署名画像を抽出し、各画像をファイルとして保存します。
- フォーム内のすべてのフィールドをループ処理し、署名フィールドを見つけます。
- PdfSignatureFieldWidget.getSignature() メソッドを使用して署名を取得します。
- PdfSignature.getCertificate().toString() メソッドを用いて、署名の証明書情報を取得します。
- Java
import com.spire.pdf.PdfDocument;
import com.spire.pdf.fields.PdfField;
import com.spire.pdf.security.PdfCertificate;
import com.spire.pdf.security.PdfSignature;
import com.spire.pdf.widget.PdfFormWidget;
import com.spire.pdf.widget.PdfSignatureFieldWidget;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractSignatureImage {
public static void main(String[] args) {
// PdfDocumentオブジェクトを作成
PdfDocument pdf = new PdfDocument();
// PDFドキュメントを読み込む
pdf.loadFromFile("Sample.pdf");
// PDFドキュメントのフォームを取得
PdfFormWidget formWidget = (PdfFormWidget) pdf.getForm();
// 署名画像を抽出
Image[] images = formWidget.extractSignatureAsImages();
// 画像を反復処理し、それぞれの画像をファイルに保存
for (int i = 0; i < images.length; i++) {
try {
// ImageオブジェクトをBufferedImageに変換
BufferedImage bufferedImage = (BufferedImage) images[i];
// 出力ファイルのパスを定義
File outputFile = new File("output\\cert\\signature_" + i + ".png");
// 画像をPNGファイルとして保存
ImageIO.write(bufferedImage, "png", outputFile);
} catch (IOException e) {
e.printStackTrace();
}
}
// 証明書情報を保存するテキストファイルを作成
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output\\cert\\certificate_info.txt"))) {
if (formWidget.getFieldsWidget().getCount() > 0) {
// フォーム内のすべてのフィールドを反復処理
for (int i = 0; i < formWidget.getFieldsWidget().getCount(); i++) {
PdfField field = formWidget.getFieldsWidget().get(i);
// 署名フィールドを見つける
if (field instanceof PdfSignatureFieldWidget) {
PdfSignatureFieldWidget signatureField = (PdfSignatureFieldWidget) field;
// 署名を取得
PdfSignature signature = signatureField.getSignature();
// 署名の証明書情報を取得
String certificateInfo = signature.getCertificate() != null ? signature.getCertificate().toString() : "証明書がありません";
// 証明書情報をテキストファイルに書き込む
writer.write("証明書情報: \n" + certificateInfo);
writer.write("-----------------------------------\n");
}
}
} else {
writer.write("署名フィールドが見つかりませんでした。");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
一時ライセンスを申請する
結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。