TPDFlibSignatureVerifier

安全和签名

描述

枚举 PDF 签名字段和 CMS 签名者,在不必将完整 PDF 载入内存的情况下校验选定的签名,并将所选签名自身的增量修订版与当前文件分开报告 验证器通过

OpenPDFOpenPDFStreamOpenPDFString 接受文件、调用方持有的流或 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, or scWholeDocument
ByteRangeValid仅当所有区间都有界且已签名修订版终止于其自身的 %%EOF 时才为 True
ContentsGapValid仅当被省略的字节恰好是所选十六进制 /Contents 令牌时才为 True
HasLaterRevisions当所选签名认证的是较早的增量修订版且其后还存在字节时为 True
SignedRevisionLength被所选签名认证的修订版的字节长度
PermissionReport为所选签名解析出的 DocMDP 与 FieldMDP 约束

认证和域权限

GetSignaturePermissionInfoGetSignaturePermissionInfoByName 返回 TPDFlibSignaturePermissionReport 该报告区分有效的 DocMDP 变换与目录中匹配的

/Perms /DocMDP 引用,并验证字段的 /Lock 字典与其 FieldMDP 变换、动作及字段名列表相匹配

证书链和吊销

VerifySignerCertificateChainByIndexVerifySignerCertificateChainByName 对显式选定的签名和签名者执行默认链校验

VerifySignerCertificateChainExVerifySignerCertificateChainExByName 把经过校验的 X.509 证书加入内存中的无重复信任锚集合 当该集合非空时,每条签名者链和时间戳链都由一个排他的信任引擎构建,该引擎以该集合作为 CA 根和显式证书固定来源,不再查询 Windows 的 srmNonesrmCacheOnly 存储 验证器会缓存该排他引擎和解析出的根存储,并在锚集合改变之前一直重复使用 这种隔离使应用程序能够实施私有的业务信任策略,而无需安装证书或继承无关的机器信任 属于信任锚集合并不会绕过证书有效期、密钥用途、签名或被请求的吊销检查 srmOnline 释放该集合,并为后续检查恢复默认的 Windows 系统信任引擎

TPDFlibSignatureChainReportTrustStatus

外部信任源

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

AddTrustAnchorDER 挂接一个不持有所有权的 AddTrustAnchorFromFile,它可以提供特定时间的锚并评估已成功构建的证书链 源锚与手动自定义锚在同一个排他链引擎中合并使用,该引擎按源修订版本和验证时间缓存 挂接源之后,原先在缺少源锚或手动锚时回退到 Windows 系统根的行为即被禁用 源评估成功时会填充

Root,同时不会削弱证书链、用途、有效期、签名或吊销检查 TrustedPeople 针对已签名的欧盟 LOTL 和各国 TSL 文档实现此契约

ClearTrustAnchors

RFC 3161 时间戳

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

SetTrustSource(按签名索引)与 TPDFlibSignatureTrustSource(按字段名)依据签名的 ByteRange 数据校验文档时间戳

TPDFlibSignatureChainReport.QualificationReport

TPDFlibEUTSLTrustSource

VerifyDocumentTimeStampVerifyDocumentTimeStampByName 系列方法枚举并校验

GetSignatureTimeStampCountVerifySignatureTimeStamp 首先在请求的 UTC 时间校验签名完整性和签名者链 如果请求时间的链无效,验证器会校验每一条签名时间戳以及已签名修订版覆盖目标签名的每一条文档时间戳,推导出最早的可信签名时间和最晚的全文档归档时间,并在这些存在性证明控制时间上重试链校验 id-aa-signatureTimeStampToken 为零表示选择当前 UTC 时间,非零值则作为 UTC 直接传递给证书链策略 signatureValue 允许由受信任的签名时间戳或覆盖性文档时间戳提供历史控制时间 VerifySignatureTimeStampVerifySignatureTimeStampByName 要求存在覆盖完整当前文档的受信任文档时间戳,当前的 DSS、VRI、CRL 或 OCSP 材料才能被视为历史证据;否则报告返回

Ex 时间戳给出的是已签名字节存在时刻的上界,而不是推断出的签名时间,因此在所选证明时间点已失效的签名者证书仍然无效 VerifyDocumentTimeStampEx 返回请求与实际生效的链报告、最佳签名时间与归档时间、所选证明来源、时间戳计数、时间滑动状态以及具体的历史状态 VerifyDocumentTimeStampExByName 对这类报告做后处理,依据签名 subfilter 以及报告中已收集的时间戳与 DSS 证据填充 VerifySignatureTimeStampExVerifySignatureTimeStampExByName

TPDFlibTimeStampVerificationReport

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

VerifyAdESHistoricalVerifyAdESHistoricalByName

ValidationTime

srmNone

srmCacheOnlysrmOnlineahsEvidenceNotArchived

TPDFlibAdESHistoricalValidationReport

DeriveBaselineProfileBaselineProfile

ahsValidAtRequestedTime完整性与证书链无需时间滑动即为有效
ahsValidAtProofTime证书链在由受信任时间戳推导出的控制时间上有效
ahsIntegrityInvalid所选签名或文档时间戳未通过完整性或 ByteRange 校验
ahsNoTrustedProof没有受信任的时间戳覆盖所选签名修订版
ahsEvidenceNotArchived已请求吊销检查,却没有受信任的全文档归档时间戳为验证材料封存
ahsHistoricalTrustInvalid存在可信的证明时间,但签名者链在每个推导出的控制时间上都无效

兼容性方法

VerifySignatureGetSignatureMetadataGetSignerCertificateVerifySignerCertificateChain

ByIndexByNameGetSignatureMetadataByIndexGetSignatureMetadataByName 仍然可用,并选择字段 0 和签名者 0 对应的 GetSignerCertificateByIndexGetSignerCertificateByName 方法(

另请参阅

TPDFlibEUTSLTrustSource, SetSignProcessDocMDP, SetSignProcessFieldLock, SetPAdESSignatureTimeStampToken