TPDFlibSignatureVerifier

安全性與簽章

描述

列舉 PDF 簽章欄位與 CMS 簽署者,在不將完整 PDF 載入記憶體的情況下驗證選定的簽章,並將所選簽章自身的遞增修訂版本與目前檔案分開回報 驗證器可透過

OpenPDF、OpenPDFStream 或 OpenPDFString 接受檔案、呼叫端擁有的串流或 ANSI 位元組字串

選取

Count := Verifier.GetSignatureCount;
Verifier.GetSignatureFieldName(0, FieldName);
SignerCount := Verifier.GetSignerCount(0);
Result := Verifier.VerifySignatureByName(FieldName, 0, Report);

VerifySignatureByIndex 以零基索引選取 PDF 欄位,而 VerifySignatureByName 則使用完整限定的 AcroForm 欄位名稱,兩種方法都接受以零為基準的 CMS 簽署者索引

簽章驗證報告

IntegrityResult所選簽署者的 CMS 加密或傳統 PKCS#7 完整性結果
CoverageStatusscInvalid、scSignedRevision 或 scWholeDocument
ByteRangeValid只有在所有範圍都有界限且已簽署修訂版本結束於其自身的 %%EOF 時才為 True
ContentsGapValid只有在被省略的位元組恰好是所選十六進位 /Contents 語彙基元時才為 True
HasLaterRevisions當所選簽章驗證較早的遞增修訂版本且其後尚有位元組存在時為 True
SignedRevisionLength受所選簽章驗證之修訂版本的位元組長度
PermissionReport所選簽章經剖析後的 DocMDP 與 FieldMDP 限制條件

認證與欄位權限

GetSignaturePermissionInfo 與 GetSignaturePermissionInfoByName 傳回 TPDFlibSignaturePermissionReport 此報告會區分有效的 DocMDP 轉換與相符的 catalog

/Perms /DocMDP 參照,並驗證欄位 /Lock 字典與其 FieldMDP 轉換、動作及欄位名稱清單相符

憑證鏈與撤銷

VerifySignerCertificateChainByIndex 與 VerifySignerCertificateChainByName 對明確選定的簽章與簽署者執行預設鏈驗證

VerifySignerCertificateChainEx 與 VerifySignerCertificateChainExByName 接受 srmNone、srmCacheOnly 或 srmOnline,外加選配的驗證時間

TPDFlibSignatureChainReport 分開呈報 TrustStatus、Windows 鏈與政策錯誤、DSS 或 VRI 證據數量、精確的 OCSP 歸屬、OCSP 狀態、撤銷原因、新鮮度與原生錯誤

內嵌憑證與驗證素材能補完鏈,但不能把不受信任的根變成受信任的根

DSS 或 VRI 的 OCSP 證據只有在其回應者簽章、簽發者或委派回應者用法、CertID、狀態與新鮮度都與所選憑證相符時才被接受

外部信任來源

Verifier.AddTrustAnchorDER(RootCertificateDER);
Verifier.AddTrustAnchorFromFile('BusinessRoot.cer');
AnchorCount := Verifier.GetTrustAnchorCount;
Verifier.ClearTrustAnchors;

AddTrustAnchorDER 與 AddTrustAnchorFromFile 把驗證過的 X.509 憑證加入記憶體中、無重複的信任錨集合

集合非空時,每條簽署者與時間戳鏈都以排他信任引擎建立:以該集合作為 CA 根與明確憑證釘選,不查閱 Windows 的 Root 或 TrustedPeople 儲存區

排他引擎與解析後的根儲存區由驗證器快取並重用,直到錨點集合改變

這種隔離讓應用程式能套用私有的業務信任政策,不必安裝憑證,也不繼承機器上無關的信任

成為信任錨不會跳過憑證有效期、金鑰用途、簽章或所要求的撤銷檢查

ClearTrustAnchors 釋放該集合,並為後續檢查還原預設的 Windows 系統信任引擎

RFC 3161 時間戳記

Verifier.SetTrustSource(TrustSource);
Source := Verifier.GetTrustSource;

SetTrustSource 附加非擁有的 TPDFlibSignatureTrustSource,可提供特定時間的錨點並評估成功建立的憑證鏈

來源錨點與手動自訂錨點合併進同一個排他鏈引擎,該引擎按來源修訂與驗證時間快取

指派來源後,沒有任何來源或手動錨點可用時,將不再回退到 Windows 系統根憑證

來源評估成功會填入 TPDFlibSignatureChainReport.QualificationReport,且不會弱化憑證鏈、用途、有效期、簽章或撤銷檢查

TPDFlibEUTSLTrustSource 針對已簽署的歐盟 LOTL 與國家 TSL 文件實作此契約

RFC 3161 時間戳

VerifyDocumentTimeStamp 與 VerifyDocumentTimeStampByName 系列方法會列舉

GetSignatureTimeStampCount 與 VerifySignatureTimeStamp 會先在要求的 UTC 時間驗證簽章完整性與簽署者鏈 若所要求時間的鏈無效,驗證器會驗證每個簽章時間戳記,以及每個其已簽署修訂版本涵蓋目標簽章的文件時間戳記,推導出最早的可信任簽章時間與最晚的整份文件封存時間,並在這些存在證明控制時間重試鏈驗證 id-aa-signatureTimeStampToken 為零時選取目前的 UTC 時間,非零值則以 UTC 直接傳遞給憑證鏈原則 signatureValue 允許受信任的簽章時間戳記或涵蓋的文件時間戳記提供歷史控制時間 VerifySignatureTimeStamp 與 VerifySignatureTimeStampByName 要求必須有涵蓋完整目前文件的受信任文件時間戳記,目前的 DSS、VRI、CRL 或 OCSP 材料才能視為歷史證據;否則報告傳回

Ex 時間戳記提供的是已簽署位元組存在時間的上限,而非推論的簽署時間,因此在所選證明時間點已失效的簽署者憑證仍維持無效 VerifyDocumentTimeStampEx 傳回所要求與實際生效的鏈報告、最佳的簽章與封存時間、所選的證明來源、時間戳記計數、時間滑移狀態與明確的歷史狀態 VerifyDocumentTimeStampExByName 會對這類報告進行後處理,從簽章 subfilter 連同報告中已收集的時間戳記與 DSS 證據填入 VerifySignatureTimeStampExVerifySignatureTimeStampExByName

TPDFlibTimeStampVerificationReport

AdES 歷史驗證

Result := Verifier.VerifyAdESHistoricalByName(
  FieldName, 0, srmCacheOnly, ValidationTime, HistoricalReport);

VerifyAdESHistorical 與 VerifyAdESHistoricalByName 先在要求的 UTC 時間點驗證簽章完整性與簽署者鏈

若要求時間點的鏈無效,驗證器會驗證每個簽章時間戳,以及其已簽署修訂涵蓋目標簽章的每個文件時間戳,推導最早的可信簽章時間與最新的整份文件封存時間,並在這些存在證明控制時間點重試該鏈

ValidationTime 為零時取目前 UTC 時間;非零值則以 UTC 直接傳給憑證鏈政策

srmNone 允許以受信任的簽章時間戳或涵蓋性文件時間戳提供歷史控制時間

srmCacheOnly 與 srmOnline 要求先有涵蓋完整目前文件的受信任文件時間戳,現行的 DSS、VRI、CRL 或 OCSP 素材才能當作歷史證據;否則報告傳回 ahsEvidenceNotArchived

時間戳提供的是已簽署位元組存在時間的上界,不是推測的簽署時間;在所選證明時間點已失效的簽署者憑證仍然無效

TPDFlibAdESHistoricalValidationReport 傳回請求與生效的鏈報告、最佳簽章與封存時間、所選證明來源、時間戳數量、時間滑移狀態,以及具體的歷史狀態

DeriveBaselineProfile 對這類報告做後處理,從簽章 subfilter 連同報告中已蒐集的時間戳與 DSS 證據推導 BaselineProfile

ahsValidAtRequestedTime完整性與鏈皆有效,無需時間滑移
ahsValidAtProofTime鏈在某個受信任時間戳推導的控制時間點有效
ahsIntegrityInvalid所選簽章或文件時間戳的完整性或 ByteRange 驗證失敗
ahsNoTrustedProof沒有受信任的時間戳涵蓋所選簽章的修訂
ahsEvidenceNotArchived要求了撤銷檢查,但沒有受信任的整份文件封存時間戳封存驗證素材
ahsHistoricalTrustInvalid存在受信任的證明時間點,但簽署者鏈在每個推導出的控制時間點都無效

相容性方法

VerifySignatureGetSignatureMetadataGetSignerCertificateVerifySignerCertificateChain

ByIndex、ByName、GetSignatureMetadataByIndex 與 GetSignatureMetadataByName 仍然可用,並選取欄位 0 與簽署者 0 對應的 GetSignerCertificateByIndex 與 GetSignerCertificateByName 方法(

另請參閱

TPDFlibEUTSLTrustSource, SetSignProcessDocMDP, SetSignProcessFieldLock, SetPAdESSignatureTimeStampToken