增量 PFX 簽章作業
sign 作業支援經驗證的增量設定檔,保留精確的原始 PDF 修訂版與每個既有密碼學簽章,同時回傳另外簽署的成品
選擇設定檔
{"schemaVersion":1,"type":"sign","profile":"pfx-incremental-document",
"pfxFile":"C:/keys/signer.pfx","pfxPassword":"password",
"fieldName":"ApprovalTwo","existingField":true,
"budget":{"memoryBytes":268435456,"outputBytes":134217728,
"resultBytes":16777216,"timeMilliseconds":60000,
"objectCount":1000000,"pageCount":1024}}
預設的 pfx-unsigned-document 設定檔保留原始行為,接受沒有任何簽章欄位的來源;它用 page、x1、y1、x2 與 y2 建立新欄位,並在發布前還原來源圖形
pfx-incremental-document 選擇新設定檔;省略 profile 時 incremental: true 是等價選擇器,與明確指定的不同 profile 衝突
existingField: true 填寫指定的空簽章欄位,不新增欄位;否則作業建立新欄位,page 與矩形標定其 widget
fieldName 預設 Signature1,接受 1 到 1024 個 UTF-8 bytes;existingField 需要增量設定檔、相符的簽章欄位,以及缺席或 null 的 V 值
唯讀 Ff 位元 1 與格式錯誤或超出範圍的整數旗標會在準備前拒絕;繼承的 SV 與 Lock 字典以唯一語意 PDF 名稱與有界父層遍歷解析
Seed 值與欄位鎖
digestMethod 選擇實際的 SHA256、SHA384 或 SHA512 CMS 摘要;預設 SHA256,而 cades: true 選擇 ETSI.CAdES.detached,並包含綁定實際簽章憑證的 signing-certificate-v2 屬性
reason、location 與 contactName 是寫成 PDF Unicode 文字字串的 UTF-8 JSON 字串;必要 seed reasons 會比較其 Unicode 值,包括要求省略 reason 的特殊單點值
必要 SV 約束檢查實際 handler、CMS SubFilter、受支援簽章版本、摘要、reason、認證權限、法律聲明與 LockDocument 模式;必要時間戳記使用 Windows 簽章時間戳記描述的應用程式傳輸與明確信任工作流程,必要簽章撤銷證據使用 認證 CRL 與 OCSP 簽章,必要具名外觀使用 實際產生的簽章外觀預設
必要 SVCert 屬性在簽章前驗證實際 PFX 葉憑證與所含簽發者鏈、允許的憑證 bytes、憑證政策 OID、金鑰用途位元與 Unicode 主體 DN 屬性
credentialSourceURL 為必要 SVCert URL 提供應用程式斷言的憑證來源;程式庫比較宣告的 URL 與受支援的 URLType,不會開啟該端點或認證傳輸身分
All、Include 與 Exclude 欄位鎖寫成間接 SigFieldLock 字典,以及綁定到文件 Catalog 的相符 FieldMDP 參照;欄位名稱使用 PDF Unicode 文字字串,在加密文件中保持加密
已簽章的 Lock P 值以原始簽章欄位政策限制後續修訂版,獨立於任何 DocMDP 權限;獲允許的第二個簽章保留精確的前一修訂版與 CMS,被鎖欄位或 P1 變更則在發布前拒絕
政策查找只解碼一次 PDF 名稱跳脫,包括繼承的 Parent 名稱;含重複語意名稱、無效或循環父層的字典會在發布前拒絕,合法跳脫名稱保留其來源 bytes
contentsBytes 預設 16384,接受 1024 到 1048576;reason、location 與 contactName 填入新簽章字典
認證與法律聲明
certificationPermission 預設 0,為核可簽章;1、2 或 3 會以要求的 DocMDP 權限建立認證簽章,把 Catalog Perms DocMDP 綁定到實際間接簽章字典,並保留任何獨立的 FieldMDP 轉換
認證必須是第一個簽章,一份文件只能有一個認證簽章;格式錯誤的 Catalog 權限、未解析參照,以及沒有原始簽章欄位綁定的 DocMDP 值都會被拒絕
legalAttestation 是認證簽章的選填 Unicode 字串,寫入 Catalog Legal Attestation;必要 SV LegalAttestation 清單必須包含所選文字,空的必要清單則要求省略
既有 P2 與 P3 認證簽章在欄位鎖與修訂版政策允許時,允許後續核可簽章;P1 簽章與被鎖欄位在二進位發布前拒絕變更
來源合約
增量作業設定檔接受保留的原始來源,包括受支援的加密 PDF,以及未修改的已載入物件圖;加密來源請在 sign 作業提供 password,與 pfxPassword 分開
來源密碼認證獨立的原始快照,初始化原始加密 context,並重新開啟簽章候選;產生的增量修訂版保留原始密文前綴、安全字典與永久文件 ID
解密可能在內部把物件標記為 dirty,或從解密圖形移除安全字典;作業會把這些狀態與有界物件序列化,和重新認證的來源基準比較,並拒絕實際圖形變更與所有已沖寫的物件狀態
對 user password,既有簽章欄位需要表單填寫或註解權限,新簽章 widget 需要註解權限;通過認證的 owner password 可授權任一操作,仍受既有簽章政策約束
SaveLoadedDocumentToStream 可能改變序列化狀態;簽署已儲存或已編輯的圖形時,請把已儲存 bytes 重新載入新 handle,再簽署該修訂版
handle 生命週期內保持原始來源儲存穩定;檔案作業在載入與準備快照期間拒絕寫入共用
原始 handle 保留其欄位計數、既有欄位識別、表單值、來源 bytes 與先前的啟動與解碼設定;每次簽章成功都回傳 documentUpdated: false,簽章失敗後 handle 仍可用於查詢、儲存或後續合法請求
檔案作業拒絕等於或別名輸入檔的輸出路徑,包括硬連結;直接串流 API 拒絕可識別的來源串流與來源檔案別名,呼叫端也必須讓不透明回呼輸出儲存與輸入儲存分開
準備與驗證
作業把原始來源 bytes 複製進獨佔建立的暫存快照,開啟獨立增量複本,透過有界 SaveIncrementalUpdate 附加佔位,並透過原生 PFX 串流簽署器填入分離式 CMS
PFX 從大小預檢到簽章完成都保持開啟並拒絕寫入共用;暫存檔使用 CREATE_NEW,只在作業自擁其建立時才移除
簽章候選必須包含精確的來源 byte 前綴與預期的表單及簽章欄位數;新簽章必須在其所選欄位驗證通過,每個先前已填寫的簽章必須仍驗證通過,且每個舊簽章的修訂版分析必須接受 DocMDP、FieldMDP、使用權限與身分約束
未填寫的舊欄位會保留,不計入 preservedSignatures;格式錯誤、無效或違反政策的既有簽章會在二進位發布前拒絕
既有簽章驗證對照簽章 bytes 與原生修訂版政策檢查 CMS 完整性;新簽章要求時間戳記時,其回應會在發布前另外驗證明確的 TSA 信任與設定的撤銷證據
預算與發布
有效輸出上限為 min(outputBytes, memoryBytes / 8),包含完整來源前綴、附加物件、xref 與簽章保留;effectiveOutputLimit 回報套用的上限
未簽章候選與簽章輸出分別受該上限約束,PFX bytes 上限為 memoryBytes / 8,來源基準、複本與候選解碼預算也分別以上限 memoryBytes / 8 約束,檔案溢寫閾值不超過 1 MiB
這些是作業與緩衝預算,不是嚴格的處理程序 RSS 保證;加密運算、物件中繼資料、修訂版分析與呼叫端已載入的來源都可能需要額外常駐記憶體
取消與耗時檢查套用於來源複製、delta 序列化與複製、候選讀取、簽章驗證讀取、修訂版分析讀取與回呼發布;黏性的原生串流失敗會在作業邊界保留其預算或取消類別
二進位輸出在第一次輸出回呼前暫存並驗證,結果 JSON 大小在二進位發布前檢查;回呼輸出本身不是原子的,失敗的二進位或結果回呼可能留下呼叫端必須捨棄的 bytes
檔案作業寫入自有的同目錄候選,沖寫,關閉來源與輸出 handle,並在驗證成功後原子式取代相異的目標;失敗保留既有目的地
成功回傳 mediaType: application/pdf、fieldName、profile、incremental、existingField、certificationPermission、revocationInfo、appearanceProfile、preservedSignatures、effectiveOutputLimit、outputBytes 與 documentUpdated: false
重播驗收
$env:HOTPDF_SUPPRESS_AUTO_LAUNCH = '1'
./Tests/CABI/Run-IncrementalSigningAcceptance.ps1 -BuildDLL -CheckFPC
執行器透過登錄 RootDir 探索 RAD Studio,接受 RADStudioRoot 與 PythonExecutable 覆寫,選擇 CheckFPC 時使用設定的 FPC 工具鏈;FPCOnly 只重播那些原生目標,OpenSSLWin32Library 與 OpenSSLWin64Library 為各架構選擇相符的執行期程式庫
非 GUI 執行器檢查 Win32 與 Win64 原生 API 與實際 C ABI DLL,涵蓋部分回呼、既有空欄位、先前簽章、必要 seed 值、實際 SHA384 與 SHA512 CAdES、Unicode 中繼資料、獲允許與被鎖的第二簽章、實際 PFX 憑證屬性、AES-128 與 AES-256 欄位鎖轉換、權限限制與 owner 憑證、錯誤密碼、dirty 解密圖形、精確加密來源快照、加密就地寫入器復原、真實 DocMDP P1 與 P2 CMS fixtures、預算、取消、回呼失敗與失敗後來源重用
獨立的 pypdf、MuPDF 與 OpenSSL 檢查證明精確的先前前綴與 byte 範圍、不變的加密與永久 ID、可搜尋原始文字、有效的新舊 CMS 值、簽章 Contents 加密例外,以及對被修改簽章內容的拒絕;independent-proof.json 記錄 byte 範圍與證明結果
相關主題
文件作業、CopyLoadedSourceToStream、SaveIncrementalUpdate、EHPDFIncrementalOutputBudget