TPDFlibEUTSLTrustSource
安全和签名
描述
加载欧盟受信任列表的列表(LOTL)及其引用的国家受信任服务列表,验证它们的 XML 签名,并向 TPDFlibSignatureVerifier 提供时间感知的信任锚
该源还评估合格证书语句、受信任服务限定符、合格准则、服务范围扩展和服务历史,以按 eIDAS 对合格电子签名和印章进行分类
单元
PDFlibEUTSL
信任引导
Function AddLOTLSigningCertificateDER(
Const CertificateDER: AnsiString): Boolean;
Function AddLOTLSigningCertificateFromFile(
Const CertificateFile: WideString): Boolean;
Procedure ClearLOTLSigningCertificates;
Procedure Clear;
应用程序在加载 LOTL 之前必须固定至少一个独立受信任的 LOTL 签名证书
Clear 会丢弃已加载的 LOTL 和每个国家 TSL 快照及其指针、服务和诊断状态,而不触碰已固定的 LOTL 签名证书;随后实例即可加载新的快照
嵌入 XML
KeyInfo 中的签名证书必须与固定的证书逐字节匹配,因此自我声明的签名者无法建立自己的信任
每个国家 TSL 又必须由匹配的、已验证的 LOTL 指针所携带的证书签名
加载信任列表
Function LoadLOTLFromString(Const XMLData: AnsiString): Boolean;
Function LoadLOTLFromFile(Const FileName: WideString): Boolean;
Function LoadLOTLFromURL(Const URL: WideString): Boolean;
Function LoadTSLFromString(PointerIndex: Integer;
Const XMLData: AnsiString): Boolean;
Function LoadTSLFromFile(PointerIndex: Integer;
Const FileName: WideString): Boolean;
Function LoadTSLFromURL(PointerIndex: Integer): Boolean;
Function RefreshAllTSLs: Integer;
XML 加载禁用 DTD 和外部实体、应用可配置的大小限制、要求对文档根有一个封装签名,并拒绝分离引用、重复签名、摘要失败、签名者不匹配和地域不匹配
LoadLOTLFromURL 和 LoadTSLFromURL 默认要求 HTTPS,并对每个请求应用 NetworkTimeoutMS 和 MaxXMLBytes;RequireHTTPS 属性(默认 True)控制 scheme 检查,关闭它仅用于受控的测试环境
RefreshAllTSLs
NextUpdate 在替换活动服务集合之前会下载并验证每个当前指针,因此部分网络或签名失败会保留先前已验证的快照
过期的 LOTL 和 TSL 快照默认采取失败关闭策略,在其 AllowExpiredLists 时间之后保持不可用;
检查
Function GetPointerCount: Integer;
Function GetPointerInfo(Index: Integer;
Out Info: TPDFlibEUTSLPointerInfo): Boolean;
Function GetPointerSigningCertificateDER(PointerIndex,
CertificateIndex: Integer; Out CertificateDER: AnsiString): Boolean;
Function GetServiceCount: Integer;
Function GetServiceInfo(Index: Integer;
Out Info: TPDFlibEUTSLServiceInfo): Boolean;
Function GetServiceCertificateDER(ServiceIndex, CertificateIndex: Integer;
VerificationTime: TDateTime;
Out CertificateDER: AnsiString): Boolean;
指针信息公开地域、位置、MIME 类型和允许的 TSL 签名者数量
服务信息公开当前服务名称、类型、状态、状态起始时间、证书数量和历史数量
GetLOTLLocation、GetLOTLNextUpdate、GetRevision 和 GetLastError 公开快照与诊断状态
签名验证
var
TrustSource: TPDFlibEUTSLTrustSource;
ChainReport: TPDFlibSignatureChainReport;
begin
TrustSource:= TPDFlibEUTSLTrustSource.Create;
try
TrustSource.AddLOTLSigningCertificateFromFile('EU-LOTL-Signer.cer');
if not TrustSource.LoadLOTLFromURL(LOTLURL) then
raise Exception.Create(String(TrustSource.GetLastError));
if TrustSource.RefreshAllTSLs<> TrustSource.GetPointerCount then
raise Exception.Create(String(TrustSource.GetLastError));
Verifier.SetTrustSource(TrustSource);
try
Result:= Verifier.VerifySignerCertificateChainEx(
0, 0, srmOnline, 0, ChainReport);
finally
Verifier.SetTrustSource(nil);
end;
finally
TrustSource.Free;
end;
end;
SetTrustSource
GetTrustAnchors(VerificationTime, Certificates) 存储非拥有引用,因此该源必须保持存活,直到被分离或验证器被销毁
EvaluateCertificateChain(Certificates, VerificationTime, Report) 和 TPDFlibSignatureQualificationReport 是验证器在源上调用的两个挂钩:前者返回在请求时间受信任服务的 DER 编码锚,后者使用当时当前的服务集合把已验证的链分类到
资质报告
在有效链被评估之后,TPDFlibSignatureChainReport.QualificationReport 返回 TPDFlibSignatureQualificationReport
该报告标识服务地域、名称、类型、状态、状态起始时间、应用的限定符、证书用途、合格状态以及合格签名创建设备状态
状态值区分未评估、不适用、不合格、合格证书、合格电子签名和合格电子印章结果,并带有单独的 QSCD 变体