該頁面可以包含自動翻譯的文字。
使用 C# 和 VB.NET 為 PDF 簽名添加長期驗證 (PAdES-LTV) 訊息
PDF 簽章的長期驗證 (LTV) 資訊有助於在數位簽章建立後很長一段時間內進行驗證。如果沒有 LTV,一旦簽署者的憑證過期或撤銷資料不再可用,數位簽章將無法驗證。這對於必須保持多年可信度的法律和財務 PDF 文件來說通常是不可接受的。
本文包含兩部分:理論與實務。首先,您將學習 PAdES-LTV 簽名的基本資訊。然後,您將探索如何使用 Docotic.Pdf 庫 使用 C# 為 PDF 簽章新增 LTV 資訊。您可以在 下載 C# .NET PDF 函式庫 頁面取得該資料庫和免費的限時授權金鑰。
9.7.18373 15,244 已通過 NuGet 總下載量 5,976,723PAdES - PDF 高級電子簽名
歐洲電信標準協會 (ETSI) 已發布多項電子簽名標準。特別是,該協會在 ETSI EN 319 142 規範中定義了 PDF 高級電子簽章 (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 級別,因為它們與 PDF 中支援 LTV 的簽名相關。
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,且會在之後過期」。
另一種選擇是使用歐盟委員會的 PAdES 驗證器。此方法在驗證符合歐盟 (eIDAS) 標準的文件時效果最佳。
此外,還有ETSI 的簽章一致性檢查器。此服務主要針對從事簽名或驗證工具開發的開發人員。
請記住,這些驗證器可能會對相同 PDF 文件提供不同的結果。
使用 C# 和 VB.NET 建立支援 LTV 的 PDF 簽名
現在開始編寫程式碼吧! Docotic.Pdf 提供了 PdfDocument.AddLtvInfo 方法 來將 LTV 資訊加入 PDF 簽章。要產生 B-LTA 簽名,您還需要 PdfDocument.TimestampAndSave 方法 來儲存具有文件時間戳記簽名的 PDF。
如何在 C# 中建立 PAdES-B-LT 簽名
建立 B-LT 簽章的過程包含三個步驟:
- 建立 B-T 簽名並儲存文件。
- 開啟已簽署的文件並新增 LTV 資訊。
- 增量保存最終文件。
以下是建立 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 簽章的步驟類似,除了第三步。您應該:
- 建立 B-T 簽名並儲存文件。
- 開啟已簽署的文件並新增 LTV 資訊
- 附帶文件時間戳記簽章地增量保存最終文件。
以下程式碼範例展示如何在 C# 中建立 B-LTA 簽章:
var timestampAuthorityUrl = new Uri("http://timestamp.digicert.com");
// 1. Create a PAdES-B-T signature
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?
關鍵在於對簽署時間戳記和文件時間戳記使用相同的
TSA
。 AddLtvInfo
方法會為時間戳憑證新增
VRI
。然後,文件時間戳記會使用相同的憑證並重複使用相關資料。
文檔時間戳無法使用相同的 TSA?我將在 PAdES-B-T 到 B-LTA 的轉換 部分討論這種情況。
使用 C# 和 VB.NET 為現有 PDF 簽名添加 LTV 訊息
到目前為止,我已經從頭開始建立了啟用 LTV 的簽章。但是,通常需要修改現有的 PAdES-B-T 簽章。例如,將它們轉換為 B-LT 或 B-LTA,或刷新 LTV 資訊。
與前面的範例一樣,您需要:
- 開啟已簽署的文件並新增 LTV 資訊。
- 不論是否附帶文件時間戳記簽章,請增量保存最終文件。
以下是對應的程式碼片段。
如何在 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 為 PDF 文件進行 LTV認證簽署
已驗證 PDF 文件中的數位簽章不允許任何修改。 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 無法驗證簽署者的憑證時,會顯示「簽章有效性未知」的警告。這通常是因為憑證缺失、不受信任、自我簽署、已被註銷、已過期或尚未生效所導致的。
取得正確的證書 以避免出現警告或建立符合歐盟 (eIDAS) 標準的文件。
或者,你也可以手動將憑證新增至 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 簽章](#create-ltv-signature 和 將 LTV 資訊新增至現有 PDF 簽章 部分介紹如何在 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 令牌、智慧卡或雲端硬體安全模組 (HSM) 為 PDF 文件啟用 LTV 簽署。請參閱 如何在 C# 和 VB.NET 中使用 USB 令牌和 HSM 裝置對 PDF 進行簽名 文章和 如何建立 PAdES-B-LT 簽章 部分。
如何為 PDF 文件啟用多重簽章和 LTV?
結合使用 由多人簽署 PDF 表單 和 將 LTV 資訊加入現有簽名 程式碼範例。