Windows 簽章時間戳記
Windows 簽章操作可以透過同步的應用程式 callback 請求真正的 RFC3161 時間戳記,並只在驗證回應後才發布 PDF
簽章選項
{"schemaVersion":1,"type":"sign","incremental":true,
"existingField":true,"fieldName":"ApprovalOne",
"pfxFile":"C:/keys/signer.pfx","pfxPassword":"password",
"cades":true,"digestMethod":"SHA384","timestamp":true,
"timestampURL":"https://tsa.example/service",
"timestampTrustedCAFile":"C:/trust/tsa-roots.pem",
"timestampTrustedCRLFile":"C:/trust/tsa-crls.pem",
"requireTimestampRevocation":true}
timestamp 預設 false;true 時需要應用程式傳輸 callback,以及含受信任 PEM 憑證根的明確 timestampTrustedCAFile
digestMethod 從 SHA256、SHA384 或 SHA512 中選出實際的文件 CMS 摘要與時間戳記印記演算法;messageImprint 對實際 CMS 簽章位元組只雜湊一次
timestampTrustedCRLFile 選填提供 PEM CRL;requireTimestampRevocation 需要該檔案,並啟用簽發者與憑證 CRL 檢查,包括已撤銷憑證與過期證據
信任輸入檔在簽章期間保持開啟且拒絕共用寫入,合計大小在 OpenSSL 載入前以 memoryBytes 八分之一為限
每個請求包含新的密碼學 nonce 並請求 TSA 憑證;回應驗證會驗證請求 nonce、印記、完整 CMS 簽章、ESS 簽章憑證綁定、憑證鏈與關鍵的時間戳記 EKU
C ABI 傳輸
把 hpdf_signing_operation_v1 傳給 hpdf_document_execute_json_v1,將 operation.struct_size 設為 sizeof(hpdf_signing_operation_v1),並提供 timestamp_transport 與 timestamp_user_data
操作前綴保留既有的 hpdf_operation_v1 版面與 ABI 版本;一般操作繼續使用原始結構
callback 收到完整的 DER TimeStampReq 與借用的 response_io;透過 response_io.write 寫入完整的 DER TimeStampResp,並回傳 hpdf_status
callback 在呼叫端執行緒上執行,請求與回應 IO 指標只在該次呼叫期間有效;網路傳輸、驗證、逾時與連線原則由應用程式掌控
response_io.is_cancelled 輪詢操作的輸入、輸出與結果取消 callback;回應寫入強制 16 MiB 上限,並在複製 callback 記憶體前另受 memoryBytes 八分之一封頂
回應寫入或取消的失敗對該操作持續有效,即使 callback 之後回傳成功也一樣;失敗的回應無法發布 PDF 位元組
Pascal 服務入口
THPDFJobProcessor.ExecuteLoadedSigningOperation 接受已載入文件、操作 JSON 物件、輸出串流、checkpoint、THPDFHeadlessTimestampTransport callback 與不透明的 callback context
Pascal 傳輸收到請求 DER 並回傳回應 DER;巢狀同步簽章會在內層操作返回時還原外層的 callback context
Seed 值與來源
必填的 SV TimeStamp 約束由實際的已驗證回應滿足;必填的 TimeStamp 字典指定 URL 時,timestampURL 必須與該值相符
timestampURL 是應用程式聲明的傳輸來源;比對宣告的 URL 並不建立 HTTPS 伺服器身分,應用程式必須自行驗證所選端點
沒有應用程式 callback 的獨立 file job 無法執行時間戳記請求;只有 URL 字串不能滿足必填的時間戳記