該頁面可以包含自動翻譯的文字。

在 C# 和 VB.NET 中將長期驗證 (PAdES-LTV) 資訊加入 PDF 簽章

PDF 簽章的長期驗證(LTV)資訊可在簽章建立後很久仍協助驗證數位簽章。若沒有 LTV,當簽署者的憑證過期或撤銷資料不再可用時,數位簽章就無法驗證。對於必須長期保持可信的法律與財務 PDF 文件,這通常是無法接受的。

長期驗證(LTV)

本文分為理論與實作兩部分。首先,您將了解 PAdES-LTV 簽章的基本資訊。接著,您將學習如何使用 Docotic.Pdf 程式庫 以 C# 為 PDF 簽章加入 LTV 資訊。您可以在 下載 C# .NET PDF 程式庫 頁面取得該程式庫與免費的限時授權金鑰。

PAdES - PDF 進階電子簽章

歐洲電信標準協會(ETSI)已發布多項電子簽章標準。特別是,該協會在 ETSI EN 319 142 規範中定義了 PDF Advanced Electronic Signature(PAdES)標準。PAdES 說明了如何讓 PDF 簽章符合歐盟 eIDAS 規範。

LTV 簽章的核心概念是將與驗證相關的資訊(VRI)嵌入 PDF 中。這些資訊可讓您在很長一段時間後驗證 PDF 簽章,即使簽署環境已不再可用也一樣。

ETSI EN 319 142-1 規範定義了四個 PAdES 基準簽章等級:B-B、B-T、B-LT 與 B-LTA。本文將聚焦於 B-LT 與 B-LTA 等級,因為它們與支援 LTV 的 PDF 簽章相關。

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 檔案必須包含文件安全儲存區(DSS)字典,以及下列資料:

  • 信任鏈中的所有憑證
  • 線上憑證狀態協定(OCSP)回應
  • 憑證撤銷清單(CRLs)

進階電子簽章對應於此等級。

PAdES-B-LTA

B-LTA 簽章必須符合 B-LT 等級。此外,PDF 檔案必須包含文件時間戳記簽章,以及 VRI 供文件時間戳記憑證使用。

合格電子簽章對應於此等級。

PAdES 驗證

您可以使用 Adobe Acrobat Pro 或 Adobe Reader。開啟簽章面板並展開某個數位簽章以檢查其狀態。如果簽章有效,您會看到「簽章已啟用 LTV」或「簽章未啟用 LTV,並將在以下時間後過期」。

Adobe Reader 中的簽章已啟用 LTV

另一個選項是使用歐盟委員會的 PAdES 驗證器。此方法在驗證符合 EU(eIDAS)的文件時效果最佳。

此外還有ETSI 的簽章相容性檢查工具。這項服務主要是為處理簽署或驗證工具的開發人員所設計。

請記住,這些驗證器對於同一份 PDF 文件可能會提供不同結果。

空談無用。給我看程式碼。

在 C# 和 VB.NET 中建立可啟用 LTV 的 PDF 簽章

是時候寫一些程式碼了!Docotic.Pdf 提供了 PdfDocument.AddLtvInfo methods 用來為 PDF 簽章加入 LTV 資訊。若要產生 B-LTA 簽章,您還需要 PdfDocument.TimestampAndSave methods 來以文件時間戳記簽章儲存 PDF。

如何在 C# 中建立 PAdES-B-LT 簽章

建立 B-LT 簽章的流程包含三個步驟:

  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 受信任清單瀏覽器選擇。

在第一步之後儲存中間文件是必要的。您必須先簽署並儲存文件,才能附加 LTV 資訊。不過,這條規則有一個例外,我會在下方的以 LTV 驗證 PDF 章節中說明。

第三步中的 WriteIncrementally = true 這一行會啟用增量儲存。增量更新不會使數位簽章失效。當您加入 LTV 資訊時,應始終以增量方式儲存 PDF 檔案。

如何在 C# 中建立 PAdES-B-LTA 簽章

產生 B-LTA 簽章的流程相似,只是第三步不同。您應該:

  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 文件包含兩個簽章——第一步的主要簽章,以及第三步的文件時間戳記簽章。您可能會注意到,Adobe Acrobat 對這兩個簽章都顯示「簽章已啟用 LTV」訊息。那麼,明明文件時間戳記簽章是在呼叫 AddLtvInfo 之後才建立的,為什麼它仍然是 LTV 已啟用的呢?

關鍵在於讓簽章時間戳記與文件時間戳記都使用同一個 TSAAddLtvInfo 方法會為 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 閱讀器應用程式會以特殊圖示和以「Certified by」開頭的標籤顯示這類簽章。

Adobe Acrobat 中顯示的已驗證 PDF 簽章

對已驗證 PDF 的任何變更都會使簽章失效,這表示您無法在不破壞驗證的情況下加入 LTV 資訊。

Docotic.Pdf 提供了在簽署時加入 LTV 資訊,並產生已驗證 PDF 文件的能力。請使用 AddLtvInfo(PdfSigningOptions) overload 在簽署期間加入 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 的「受信任憑證」。此選項位於:Menu > Preferences > Signatures > Identities & Trusted Certificates

如果您需要將某個憑證設為已驗證文件可信任,請確保授予對應的權限:

在 Adobe Acrobat 中設定信任選項

如何檢查 PDF 簽章是否已啟用 LTV?

您可以使用 Adobe Reader 或歐盟委員會的 PAdES 驗證器。請參閱 PAdES 驗證 章節以取得更多細節。

為什麼 Adobe Acrobat 會顯示「簽章未啟用 LTV」?

Adobe Acrobat 在簽章驗證流程中會檢查撤銷資訊。如果它需要下載任何資料,對應的簽章就不是 LTV 已啟用。

如何讓 PDF 簽章符合 ETSI 規範?

請遵循PDF 進階電子簽章的要求。您需要使用歐盟信任清單(EUTL)中列出的供應商所發行的憑證。

如何在 Adobe Reader 中取得「簽章已啟用 LTV」指示?

首先,簽章至少必須符合PAdES-B-T 等級。接著,您需要加入 LTV 資訊,包括信任鏈中的所有憑證、 OCSP 回應,以及 CRLs

建立可啟用 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)?

請使用 Docotic.Pdf 程式庫 透過 USB token、智慧卡或雲端 HSM 來為 PDF 文件簽署並加入 LTV。請查看 如何在 C# 和 VB.NET 中使用 USB 權杖與 HSM 裝置為 PDF 簽署 文章和如何建立 PAdES-B-LT 簽章 章節。

如何對具有多重簽章的 PDF 進行簽署並啟用 LTV?

結合 由多人簽署 PDF 表單將 LTV 資訊加入現有簽名 程式碼範例。