TPDFlibEUTSLTrustSource

セキュリティと署名

説明

EU信頼リスト(LOTL)とその参照先の各国信頼サービスリストを読み込み、そのXML署名を検証し、時間を考慮したトラストアンカーをTPDFlibSignatureVerifierへ供給します

ソースはさらに、適格証明書のステートメント、信頼サービス修飾子、適格性基準、サービススコープ拡張、サービス履歴を評価し、eIDASにおける適格電子署名と適格電子印を分類します

ユニット

PDFlibEUTSL

トラストブートストラップ

Function AddLOTLSigningCertificateDER(
  Const CertificateDER: AnsiString): Boolean;
Function AddLOTLSigningCertificateFromFile(
  Const CertificateFile: WideString): Boolean;
Procedure ClearLOTLSigningCertificates;
Procedure Clear;

アプリケーションは、LOTLを読み込む前に、独立して信頼されたLOTL署名証明書を少なくとも1つ固定しなければなりません

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と外部実体を無効化し、設定可能なサイズ上限を適用し、ドキュメントルートに対する1つの包込署名を要求し、分離参照、重複署名、ダイジェスト失敗、署名者の不一致、領域の不一致を拒否します

LoadLOTLFromURLとLoadTSLFromURLは既定でHTTPSを要求し、各要求にNetworkTimeoutMSとMaxXMLBytesを適用します。RequireHTTPSプロパティ(既定True)がスキームの検査を制御し、オフにするのは管理されたテスト環境だけを意図しています

RefreshAllTSLsは、アクティブなサービス集合を置き換える前にすべての現在のポインターをダウンロードして検証するため、部分的なネットワーク障害や署名失敗でも以前の検証済みスナップショットが保たれます

期限切れのLOTLとTSLスナップショットは既定でフェイルクローズし、NextUpdate時刻の後も使用できません。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)が、ベリファイアがソースに対して呼び出す2つのフックです。前者は要求された時点で信頼されるサービスのDERエンコードされたアンカーを返し、後者は検証済みチェーンをその時点で現行のサービス集合を使ってTPDFlibSignatureQualificationReportへ分類します。アプリケーションは通常、直接ではなくベリファイア経由で間接的に呼び出します

ベリファイアはソースのアンカーと手動のカスタムアンカーを1つの排他的チェーンエンジンに結合し、そのエンジンをソースリビジョンと検証時刻でキャッシュします

ソースが割り当てられていて、それも手動集合もアンカーを供給しない場合、検証はWindowsシステムルートへフォールバックする代わりにフェイルクローズします

適合レポート

有効なチェーンが評価された後、TPDFlibSignatureChainReport.QualificationReportがTPDFlibSignatureQualificationReportを返します

レポートは、サービスの領域、名前、タイプ、ステータス、ステータス開始時刻、適用された修飾子、証明書の用途、適格状態、適格署名作成デバイスの状態を識別します

ステータス値は、未評価、非適用、非適格、適格証明書、適格電子署名、適格電子印の結果を区別し、QSCDの変種は別に持ちます

関連項目

TPDFlibSignatureVerifier