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 で終わる場合にのみ True になります |
| ContentsGapValid | 省略されたバイトが、選択された 16 進表記の /Contents トークンと完全に一致する場合にのみ True になります |
| HasLaterRevisions | 選択された署名がより前のインクリメンタルリビジョンを認証しており、その後にバイトが存在する場合に True になります |
| 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、期待されるナンスも受け入れます
TPDFlibTimeStampVerificationReportは、トークン署名の妥当性、メッセージインプリントの妥当性、TSA EKUと名前のバインディング、ポリシー、ナンス、生成時刻、チェーン結果、信頼ステータスを独立に報告します
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はそのようなレポートを後処理し、レポートに既に収集されたタイムスタンプと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