このページには自動翻訳されたテキストを含めることができます。

C# と VB.NET で PDF 署名に長期検証 (PAdES-LTV) 情報を追加する

PDF 署名の長期検証 (LTV) 情報は、デジタル署名の作成後、長期間にわたって検証を行うのに役立ちます。LTV がないと、署名者の証明書の有効期限が切れたり、失効データが利用できなくなったりすると、デジタル署名は検証できなくなります。これは、長年にわたって信頼性を維持しなければならない法務および金融関連の PDF ドキュメントでは、多くの場合許容されません。

この記事は、理論と実践の 2 つのパートで構成されています。まず、PAdES-LTV 署名の基本情報を学びます。次に、Docotic.Pdf ライブラリ を使用して C# で PDF 署名に LTV 情報を追加する方法を説明します。ライブラリと期間限定の無料ライセンスキーは、C# .NET PDF ライブラリをダウンロード ページから入手できます。

Docotic.Pdf ライブラリ 9.7.18373 回帰テスト 15,244人が合格 NuGet の合計ダウンロード数 5,976,723

長期検証 (LTV)

PAdES - PDF 高度電子署名

欧州電気通信標準化機構 (ETSI) は、電子署名に関する複数の標準規格を公開しています。特に、ETSI EN 319 142 仕様では、PDF 高度電子署名 (PAdES) 標準を定義しています。PAdES は、PDF 署名を欧州の eIDAS 規制に準拠させる方法を概説しています。

LTV 署名の核となる概念は、検証関連情報 (VRI) を PDF に埋め込むことです。この情報により、署名環境が利用できなくなった場合でも、長期間経過した後でも PDF 署名を検証できるようになります。

ETSI EN 319 142-1 仕様では、PAdES ベースライン署名の 4 つのレベル (B-B、B-T、B-LT、B-LTA) が定義されています。この記事では、PDF における LTV 対応署名に関連する B-LT レベルと B-LTA レベルに焦点を当てます。

PAdES-B-B

ETSI.CAdES.detached 形式の短期的なデジタル PDF 署名は、このレベルに該当します。C# および VB.NET で PDF ドキュメントに署名する の記事では、そのような署名を作成する方法が説明されています。

PAdES-B-T

B-T 署名は B-B レベルの要件を満たす必要があり、タイムスタンプを含める 必要があります。

PAdES-B-LT

B-LT 署名は B-T レベルに準拠する必要があります。さらに、PDF ファイルには、以下のデータを含む Document Security Store (DSS) 辞書が含まれている必要があります。

  • 信頼チェーン内のすべての証明書
  • オンライン証明書ステータスプロトコル(OCSP)応答
  • 証明書失効リスト(CRLs)

高度電子署名はこのレベルに対応します。

PAdES-B-LTA

B-LTA 署名は B-LT レベルに準拠する必要があります。さらに、PDF ファイルには、文書タイムスタンプ署名と、文書タイムスタンプ証明書の VRI が含まれている必要があります。

認定電子署名はこのレベルに対応します。

PAdES検証

Adobe Acrobat Pro または Adobe Reader を使用するのが一つの方法です。署名パネルを開き、デジタル署名を展開してその状態を確認します。署名が有効であれば、『署名は LTV に対応しています』または『署名は LTV に対応しておらず、〇〇後に失効します』という表示がされます。

Adobe Readerで署名がLTV対応である

もう1つの方法は、欧州委員会のPAdES検証ツールを使用することです。この方法は、EU(eIDAS)準拠文書の検証に最適です。

また、ETSIの署名適合性チェッカーもあります。このサービスは、主に署名ツールまたは検証ツールを開発する開発者向けに設計されています。

これらの検証ツールは、同じPDF文書に対して異なる結果を返す場合があることにご注意ください。

言葉は安いものです。コードを見せてください。

C# と VB.NET で LTV 対応の PDF 署名を作成する

さあ、コードを書いてみましょう!Docotic.Pdf は、PDF 署名に LTV 情報を追加するための PdfDocument.AddLtvInfo メソッド を提供しています。B-LTA 署名を生成するには、PDF にタイムスタンプ署名を追加して保存するための PdfDocument.TimestampAndSave メソッド も必要です。

C# で PAdES-B-LT 署名を作成する方法

B-LT 署名を作成するプロセスは、次の 3 つのステップで構成されます。

  1. B-T 署名を作成し、ドキュメントを保存します。
  2. 署名されたドキュメントを開き、LTV 情報を追加します。
  3. 最終文書を増分保存してください。

B-LT 署名を作成するための C# コードを以下に示します。完全な LTV対応PDF署名を作成 サンプルプロジェクトは、GitHub からダウンロードできます。

// 1. PAdES-B-T 署名を作成する
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
    var options = new PdfSigningOptions(..)
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.CadesDetached,
    };
    options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");

    pdf.SignAndSave(options, step1);
}

// 2. 署名されたドキュメントを開き、LTV 情報を追加します
using (var pdf = new PdfDocument(step1))
{
    pdf.AddLtvInfo();

    // 3. 最終文書を増分保存してください
    var incrementalOptions = new PdfSaveOptions()
    {
        WriteIncrementally = true,
    };
    pdf.Save("b-lt.pdf", incrementalOptions);
}

考慮すべき重要なポイントがいくつかあります。まず、PKCS#12 証明書(.pfx または .p12 ファイル)または 外部署名者 を使用して PdfSigningOptions を作成できます。どちらの方法でも、PAdES に準拠するには、Format オプションを PdfSignatureFormat.CadesDetached に設定する必要があります。

このコードスニペットでは http://timestamp.digicert.com を使用していますが、他のタイムスタンプ認証局 (TSA) も使用できます。以下に、一般的な代替手段をいくつか示します。

http://timestamp.comodoca.com/rfc3161
http://timestamp.sectigo.com
http://timestamp.entrust.net/TSS/RFC3161sha2TS
http://rfc3161timestamp.globalsign.com/advanced

ETSI 仕様に準拠するには、eIDAS 認定の TSA を使用する必要があります。EU/EEA Trusted List Browser を使用して、TSA を選択できます。

最初のステップの後、中間文書の保存は必須です。LTV情報を追加する前に、文書に署名して保存する必要があります。ただし、このルールには例外が1つあります。これは、後述のLTVでPDFを認証するセクションで説明します。

ステップ3のWriteIncrementally = true行は、増分保存を有効にします。増分更新によってデジタル署名が無効になることはありません。LTV情報を追加する際は、常にPDFファイルを増分保存する必要があります。

C#でPAdES-B-LTA署名を作成する方法

B-LTA署名の生成は、ステップ3を除いて同様です。以下の手順を実行してください。

  1. B-T 署名を作成し、ドキュメントを保存します。
  2. 署名されたドキュメントを開き、LTV 情報を追加します。
  3. 最終文書を文書のタイムスタンプ署名を使用して増分保存します。

このコードサンプルは、C# で B-LTA 署名を作成する方法を示しています。

var timestampAuthorityUrl = new Uri("http://timestamp.digicert.com");

// 1. PAdES-B-T 署名を作成する
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
    var options = new PdfSigningOptions(..)
    {
        DigestAlgorithm = PdfDigestAlgorithm.Sha256,
        Format = PdfSignatureFormat.CadesDetached,
    };
    options.Timestamp.AuthorityUrl = timestampAuthorityUrl;

    pdf.SignAndSave(options, step1);
}

// 2. 署名されたドキュメントを開き、LTV 情報を追加します
using (var pdf = new PdfDocument(step1))
{
    pdf.AddLtvInfo();

    // 3. 最終文書を文書のタイムスタンプ署名を使用して増分保存します
    var timestampOptions = new PdfSignatureTimestampOptions
    {
        AuthorityUrl = timestampAuthorityUrl,
    };
    var incrementalOptions = new PdfSaveOptions()
    {
        WriteIncrementally = true,
    };
    pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}

最終的な b-lta.pdf ドキュメントには、手順 1 のメイン署名と手順 3 のドキュメントタイムスタンプ署名の 2 つの署名が含まれています。Adobe Acrobat では、両方の署名に対して「署名は LTV 対応です」というメッセージが表示されることにお気づきかもしれません。ドキュメントタイムスタンプ署名は AddLtvInfo 呼び出し後に作成されたにもかかわらず、LTV 対応になっているのはなぜでしょうか。

重要なのは、署名タイムスタンプとドキュメントタイムスタンプの両方に同じ TSA を使用することです。AddLtvInfo メソッドは、タイムスタンプ証明書に VRI を追加します。ドキュメントタイムスタンプは同じ証明書を使用し、関連データを再利用します。

ドキュメントタイムスタンプに同じ TSA を使用できないのでしょうか? このケースについては、PAdES-B-T から B-LTA への変換 セクションで説明します。

C# と VB.NET で既存の PDF 署名に LTV 情報を追加する

これまで、LTV 対応の署名を一から作成してきました。しかし、既存の PAdES-B-T 署名を修正する必要がある場合がよくあります。例えば、B-LT または B-LTA に変換したり、LTV 情報を更新したりする場合などです。

これまでの例と同様に、以下の手順を実行する必要があります。

  1. 署名されたドキュメントを開き、LTV 情報を追加します。
  2. 最終文書を、文書のタイムスタンプ署名の有無にかかわらず、段階的に保存します。

対応するコードスニペットを以下に示します。

C# で PAdES-B-T 署名を B-LT に変換する方法

using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();

var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);

C# で PAdES-B-T 署名を B-LTA に変換する方法

using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();

var timestampOptions = new PdfSignatureTimestampOptions
{
    AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);

GitHub から 既存の署名にLTV情報を追加します。 サンプルプロジェクトの完全版をダウンロードしてください。

文書のタイムスタンプ署名にLTV情報を追加する

既存のB-T署名では、この例で使用されているものとは異なる任意の TSA が使用されている場合があります。そのような場合、Adobe Acrobatは文書のタイムスタンプ署名に対して「署名はLTV対応ではありません」というメッセージを表示します。

LTV対応にするにはどうすればよいでしょうか?文書のタイムスタンプ署名にLTV情報を追加する必要があります。

var timestampOptions = new PdfSignatureTimestampOptions
{
    AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
    WriteIncrementally = true,
};

using var intermediate = new MemoryStream();
using (var pdf = new PdfDocument("b-t.pdf"))
{
    pdf.AddLtvInfo();
    pdf.TimestampAndSave(timestampOptions, intermediate, incrementalOptions);
}

// 文書のタイムスタンプ署名にLTV情報を追加する
using (var pdf = new PdfDocument(intermediate))
{
    pdf.AddLtvInfo();
    pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}

C# および VB.NET で LTV を使用した PDF 認証を行う

認証済み PDF 文書内のデジタル署名は変更できません。PDF リーダーアプリケーションでは、このような署名は特別なアイコンと「認証者」で始まるキャプションで表示されます。

Adobe Acrobat で表示される認証済み PDF 署名

認証済みのPDFに対して変更を加えると、その署名は無効となります。つまり、認証を維持したままLTV情報を追加することはできません。

Docotic.Pdf は、LTV 情報を含む認証済み PDF 文書を生成する機能を提供します。AddLtvInfo(PdfSigningOptions) オーバーロード を使用して、署名時に LTV 情報を追加します。このコードサンプルは、C# で B-LT 署名を使用して PDF を認証する方法を示しています。

using var pdf = new PdfDocument();

var options = new PdfSigningOptions(..)
{
    DigestAlgorithm = PdfDigestAlgorithm.Sha256,
    Format = PdfSignatureFormat.CadesDetached,
    Type = PdfSignatureType.AuthorNoChanges,
};
options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");

pdf.AddLtvInfo(options);

pdf.SignAndSave(options, "certified-b-lt.pdf");

GitHub で LTV署名でPDFを認証します のコードサンプルをご覧ください。

2025 年 6 月現在、Adobe Acrobat は B-LT 署名を含む認証済み PDF 文書をサポートしていますが、認証済み文書内の B-LTA 署名は無効とみなします。

結論

PDF署名に長期検証(LTV)情報を追加することで、法令遵守と長期的な信頼性を確保できます。PAdES標準は、PDF署名のルールと適合レベルを定義しています。

少なくともPAdES-B-T署名で署名することをお勧めします。B-T署名は、既存の検証を損なうことなく、高度電子署名(B-LT)または適格電子署名(B-LTA)に変換できます。

Docotic.Pdfライブラリを使用すると、.NETアプリケーションでPDF署名にLTV情報を追加できます。LTVを使用してPDF文書を認証することもできます。

GitHubからPDFのデジタル署名のコードサンプルをご覧ください。関連記事で詳細をご確認ください。

よくある質問

Adobe Acrobatで「署名の有効性が不明です」というメッセージが表示されないようにするにはどうすればよいですか?

Adobe Acrobatは、署名者の証明書を検証できない場合、「署名の有効性が不明です」という警告を表示します。これは通常、証明書が見つからない、信頼されていない、自己署名されている、失効している、期限切れである、またはまだ有効になっていない場合に発生します。

適切な証明書を取得 して警告を回避するか、EU(eIDAS)準拠の文書を作成してください。

または、Adobe Acrobat の「信頼済み証明書」に証明書を手動で追加することもできます。このオプションは、メニュー > 環境設定 > 署名 > ID と信頼済み​​証明書にあります。

認証済み文書の証明書を信頼する必要がある場合は、対応する権限を付与してください。

Adobe Acrobat での信頼設定

PDF 署名が LTV 対応かどうかを確認するにはどうすればよいですか?

Adobe Reader または欧州委員会の PAdES 検証ツールを使用できます。詳細については、PAdES 検証 セクションをご覧ください。

Adobe Acrobat に「署名は LTV 対応ではありません」と表示されるのはなぜですか?

Adobe Acrobat は、署名検証プロセスの一環として失効情報を確認します。データをダウンロードする必要がある場合、対応する署名は LTV 対応ではありません。

PDF署名をETSI仕様に準拠させるにはどうすればよいですか?

PDF Advanced Electronic Signaturesの要件に従ってください。European Union Trusted Lists (EUTL)に掲載されているプロバイダーが発行した証明書を使用する必要があります。

Adobe Readerで「署名はLTV対応です」という表示を実現するにはどうすればよいですか?

まず、署名は少なくともPAdES-B-Tレベルに準拠している必要があります。次に、信頼チェーン内のすべての証明書、 OCSP レスポンス、 CRLs を含むLTV情報を追加する必要があります。

LTV対応PDF署名の作成および既存のPDF署名へのLTV情報の追加のセクションでは、C#およびVB.NETでLTV情報を追加する方法について説明しています。

ドキュメントのタイムスタンプ署名でLTVを有効にするにはどうすればよいですか?

手順は通常のPDF署名と同様です。ドキュメントのタイムスタンプ署名のLTV情報を DSS 辞書に追加する必要があります。

ドキュメントのタイムスタンプ署名にLTV情報を追加するセクションのコードサンプルを参照してください。

LTVとタイムスタンプを同じ操作で実行することは可能ですか?

はい!PAdES-B-T署名をB-LTA署名に変換する方法セクションのコードサンプルをご確認ください。

C#でLTVを使用したデジタル署名を作成するにはどうすればよいですか?

Docotic.Pdfライブラリを使用してください。高度な電子署名を作成するには、PAdES-B-LT署名の作成方法セクションのコードサンプルをご覧ください。適格電子署名を作成するには、PAdES-B-LTA署名の作成方法セクションをご覧ください。

「変更が許可されていない」署名に対してLTVを有効にするにはどうすればよいですか?

Adobe Acrobatで認証済み文書を作成する場合、すべてのLTVデータが元の署名済み文書に含まれている必要があります。詳細については、LTVを使用してPDFを認証するセクションをご覧ください。

PDF ドキュメントに外部署名する際に長期検証 (LTV) を有効にするにはどうすればよいですか?

USB トークン、スマートカード、またはクラウドベースの HSM を使用して PDF ドキュメントに LTV 署名するには、Docotic.Pdf ライブラリ を使用してください。C# および VB.NET で USB トークンと HSM デバイスを使用して PDF に署名する方法 の記事と PAdES-B-LT 署名の作成方法 セクションをご確認ください。

複数の署名で PDF に署名し、LTV を有効にするにはどうすればよいですか?

複数人で PDF フォームに署名する既存の署名にLTV情報を追加します。 のコードサンプルを組み合わせてください。