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는 0 기반 인덱스로 PDF 필드를 선택하고, VerifySignatureByName은 정규화된 전체 AcroForm 필드 이름을 사용합니다. 두 메서드 모두 0 기반 CMS 서명자 인덱스를 받습니다
서명 검증 보고서
| IntegrityResult | 선택한 서명자에 대한 CMS 또는 구식 PKCS#7 암호화 무결성 결과 |
|---|---|
| CoverageStatus | scInvalid, scSignedRevision, or scWholeDocument |
| ByteRangeValid | 모든 범위가 경계 내에 있고 서명된 리비전이 자체 %%EOF에서 끝나는 경우에만 참 |
| ContentsGapValid | 생략된 바이트가 정확히 선택한 16진수 /Contents 토큰인 경우에만 참 |
| HasLaterRevisions | 선택한 서명이 이전 증분 리비전을 인증하고 그 뒤에 바이트가 더 존재할 때 참 |
| SignedRevisionLength | 선택한 서명이 인증하는 리비전의 바이트 길이 |
| PermissionReport | 선택한 서명에 대해 구문 분석된 DocMDP 및 FieldMDP 제약 |
인증 및 필드 권한
GetSignaturePermissionInfo와 GetSignaturePermissionInfoByName은 TPDFlibSignaturePermissionReport를 반환합니다
보고서는 유효한 DocMDP 변환을 일치하는 카탈로그
/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 인증서를 메모리상 중복 없는 트러스트 앵커 집합에 추가합니다
집합이 비어 있지 않으면 모든 서명자·타임스탬프 체인이 전용 신뢰 엔진으로 만들어집니다. 이 엔진은 Windows Root나 TrustedPeople 저장소를 참조하지 않고 그 집합을 CA 루트와 명시적 인증서 핀으로 씁니다
전용 엔진과 파싱된 루트 저장소는 검증자가 캐시하고 앵커 집합이 바뀔 때까지 재사용됩니다
이 격리 덕에 애플리케이션은 인증서를 설치하거나 무관한 시스템 신뢰를 물려받지 않고도 자체 비즈니스 신뢰 정책을 적용할 수 있습니다
트러스트 앵커 소속은 인증서 유효성, 키 용도, 서명, 요청된 폐기 검사를 우회하지 않습니다
ClearTrustAnchors는 집합을 해제하고 이후 검사를 위해 기본 Windows 시스템 신뢰 엔진을 복원합니다
외부 트러스트 소스
Verifier.SetTrustSource(TrustSource);
Source := Verifier.GetTrustSource;
SetTrustSource는 시점별 앵커를 공급하고 성공적으로 만들어진 인증서 체인을 평가할 수 있는 비소유 TPDFlibSignatureTrustSource를 연결합니다
소스 앵커는 수동 커스텀 앵커와 같은 전용 체인 엔진에서 결합되며, 그 엔진은 소스 리비전과 검증 시각으로 캐시됩니다
소스를 할당하면 소스나 수동 앵커가 없을 때 Windows 시스템 루트로의 폴백이 비활성화됩니다
성공한 소스 평가는 인증서 체인·용도·유효성·서명·폐기 검사를 약화시키지 않고 TPDFlibSignatureChainReport.QualificationReport를 채웁니다
TPDFlibEUTSLTrustSource는 서명된 EU LOTL과 국가별 TSL 문서에 대해 이 계약을 구현합니다
RFC 3161 타임스탬프
VerifyDocumentTimeStamp(서명 인덱스)과 VerifyDocumentTimeStampByName(필드 이름)은 문서 타임스탬프를 서명 ByteRange 데이터에 대해 검증합니다
GetSignatureTimeStampCount과 VerifySignatureTimeStamp 계열은 선택된 CMS 서명자의 signatureValue에 대해 id-aa-signatureTimeStampToken 속성을 나열·검증합니다. VerifySignatureTimeStamp는 인덱스로, VerifySignatureTimeStampByName은 필드 이름으로 서명을 고릅니다
Ex 변형(VerifyDocumentTimeStampEx, VerifyDocumentTimeStampExByName, VerifySignatureTimeStampEx, VerifySignatureTimeStampExByName)은 폐기 모드, 기대 정책 OID, 기대 nonce도 받습니다
TPDFlibTimeStampVerificationReport는 토큰 서명 유효성, 메시지 인프린트 유효성, TSA EKU·이름 바인딩, 정책, nonce, 생성 시각, 체인 결과, 신뢰 상태를 독립적으로 보고합니다
AdES 이력 검증
Result := Verifier.VerifyAdESHistoricalByName(
FieldName, 0, srmCacheOnly, ValidationTime, HistoricalReport);
VerifyAdESHistorical과 VerifyAdESHistoricalByName은 먼저 요청된 UTC 시각에서 서명 무결성과 서명자 체인을 검증합니다
요청 시각의 체인이 무효면 검증자는 대상 서명을 덮는 서명된 리비전을 가진 모든 서명 타임스탬프와 문서 타임스탬프를 검증하고, 가장 이른 신뢰 서명 시각과 가장 늦은 문서 전체 아카이브 시각을 도출해, 그 존재 증명 통제 시각들에서 체인을 다시 시도합니다
0인 ValidationTime은 현재 UTC 시각을 고르고, 0이 아닌 값은 UTC로서 인증서 체인 정책에 직접 전달됩니다
srmNone은 신뢰되는 서명 타임스탬프나 이를 덮는 문서 타임스탬프가 이력 통제 시각을 공급하는 것을 허용합니다
srmCacheOnly와 srmOnline은 현재 DSS, VRI, CRL, OCSP 자료를 이력 증거로 다룰 수 있으려면 현재 문서 전체를 덮는 신뢰되는 문서 타임스탬프를 요구합니다. 아니면 보고서가 ahsEvidenceNotArchived를 반환합니다
타임스탬프는 서명된 바이트가 존재했을 때의 상한을 공급하는 것이지 추론된 서명 시각이 아니므로, 선택된 증명 시각에서 이미 무효였던 서명자 인증서는 무효로 남습니다
TPDFlibAdESHistoricalValidationReport는 요청된 체인 보고서와 실효 체인 보고서, 최적 서명·아카이브 시각, 선택된 증명 소스, 타임스탬프 개수, 시간 슬라이드 상태, 구체적인 이력 상태를 반환합니다
DeriveBaselineProfile은 그런 보고서 하나를 후처리하여, 보고서에 이미 모인 타임스탬프·DSS 증거와 더불어 서명 서브필터에서 BaselineProfile을 채웁니다
ahsValidAtRequestedTime | 시간 슬라이딩 없이 무결성과 체인이 유효합니다 |
|---|---|
ahsValidAtProofTime | 체인은 신뢰되는 타임스탬프에서 도출한 통제 시각에 유효합니다 |
ahsIntegrityInvalid | 선택된 서명 또는 문서 타임스탬프가 무결성이나 ByteRange 검증에 실패합니다 |
ahsNoTrustedProof | 선택된 서명 리비전을 덮는 신뢰되는 타임스탬프가 없습니다 |
ahsEvidenceNotArchived | 폐기 검사가 요청되었지만 검증 자료를 봉인하는 신뢰되는 문서 전체 아카이브 타임스탬프가 없습니다 |
ahsHistoricalTrustInvalid | 신뢰되는 증명 시각은 있지만 파생된 모든 통제 시각에서 서명자 체인이 무효입니다 |
호환성 메서드
VerifySignature, GetSignatureMetadata, GetSignerCertificate, VerifySignerCertificateChain은 계속 쓸 수 있으며 필드 0과 서명자 0을 선택합니다
대응하는 ByIndex·ByName 메서드들(GetSignatureMetadataByIndex, GetSignatureMetadataByName, GetSignerCertificateByIndex, GetSignerCertificateByName)은 다중 서명·다중 서명자 문서에 대한 명시적 선택을 제공합니다
참고 항목
TPDFlibEUTSLTrustSource, SetSignProcessDocMDP, SetSignProcessFieldLock, SetPAdESSignatureTimeStampToken