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

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

PDF 署名の長期検証 (LTV) 情報は、作成から長い時間が経過した後でもデジタル署名の検証を可能にします。LTV がない場合、署名者の証明書が期限切れになるか失効データが利用できなくなると、デジタル署名は検証不能になります。これは、長年にわたり信頼性を維持する必要がある法務・金融系の PDF 文書では、しばしば受け入れられません。

長期検証 (LTV)

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

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) ディクショナリが必要です:

  • 信頼チェーン内のすべての証明書
  • Online Certificate Status Protocol (OCSP) 応答
  • 証明書失効リスト (CRLs)

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

PAdES-B-LTA

B-LTA 署名は B-LT レベルに準拠しなければなりません。さらに、PDF ファイルには文書タイムスタンプ署名と VRI 文書タイムスタンプ証明書用の

が必要です。

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

PAdES の検証

1 つの方法は Adobe Acrobat Pro または Adobe Reader を使用することです。Signature パネルを開き、デジタル署名を展開して状態を確認します。署名が有効な場合は、"Signature is LTV enabled" または "Signature is not LTV enabled and will expire after" のいずれかが表示されます。

Adobe Reader で LTV 有効と表示された署名

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

ETSI の Signatures Conformance Checker もあります。このサービスは主に、署名や検証ツールに取り組む開発者向けに設計されています。

これらの検証ツールは、同じ PDF 文書でも異なる結果を返す場合があります。

口で言うのは簡単です。コードを見せてください。

C# および VB.NET で LTV 有効な PDF 署名を作成する

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

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

B-LT 署名の作成手順は 3 つです:

  1. B-T 署名を作成して文書を保存する。
  2. 署名済み文書を開き、LTV 情報を追加する。
  3. 最終文書を増分で保存する。

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

// 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 を使用して選択できます。

最初のステップの後に中間文書を保存することは必須です。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 文書には 2 つの署名が含まれます。つまり、ステップ 1 の मुख्य署名と、ステップ 3 の文書タイムスタンプ署名です。Adobe Acrobat が両方の署名に対して "Signature is LTV enabled" メッセージを表示することに気付くかもしれません。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);

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

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

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

どのようにして 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 リーダー アプリケーションは、そのような署名を特別なアイコンと "Certified by" で始まるキャプション付きで表示します。

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

認証済み PDF に変更を加えると署名は無効になります。つまり、認証を損なわずに LTV 情報を追加することはできません。

Docotic.Pdf は、LTV 情報を含む認証済み PDF 文書を生成する機能を提供します。署名中に LTV 情報を追加するには、AddLtvInfo(PdfSigningOptions) オーバーロード を使用します。次のコード例は、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 署名は無効と見なします。

結論

LTV (長期検証) 情報を PDF 署名に追加すると、法的コンプライアンスと長期的な信頼性を確保できます。PAdES 標準は PDF 署名の規則と準拠レベルを定義します。

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

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

GitHub の PDF のデジタル署名のコード サンプル を確認してください。関連情報として次の記事も参照してください:

よくある質問

Adobe Acrobat で "Signature validity is unknown" メッセージを回避するには?

Adobe Acrobat は、署名者の証明書を検証できない場合に "Signature validity is unknown" 警告を表示します。これは通常、証明書が欠落している、信頼されていない、自己署名である、失効している、期限切れである、またはまだ有効になっていない場合に発生します。

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

または、Adobe Acrobat の "Trusted Certificates" に証明書を手動で追加することもできます。このオプションは Menu > Preferences > Signatures > Identities & Trusted Certificates で利用できます。

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

Adobe Acrobat で信頼設定を構成する

PDF 署名が LTV 有効かどうかを確認するには?

Adobe Reader または欧州委員会の PAdES バリデーターを使用できます。詳細は PAdES の検証 セクションを参照してください。

Adobe Acrobat が "The signature is not LTV enabled" と表示するのはなぜですか?

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

PDF 署名を ETSI 仕様に準拠させるには?

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

Adobe Reader で "Signature is LTV enabled" インジケーターを表示するには?

まず、署名は少なくとも 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 文書に外部署名するときに Long-Term Validation (LTV) を有効にするには?

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

複数署名の PDF に署名して LTV を有効にするには?

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