ข้ามไปยังเนื้อหา

เวิร์กโฟลว์สำหรับข้อตกลงที่ลงนามแล้ว

Spec: ETSI EN 319 142-2, §5.1 Spec: ISO 32000-2:2020, §12.8 Evidence: Mixed evidence

ข้อตกลงที่ลงนามแล้วไม่ใช่แค่ “PDF ที่มีลายเซ็นอยู่บนนั้น” แต่เป็นเอกสารที่เตรียมไว้เพื่อให้ลายเซ็นปกป้องไบต์ที่ถูกต้อง ลงนามในระดับที่ตรงกับข้อผูกพัน และบรรจุหลักฐานไว้เพื่อให้ยังตรวจสอบยืนยันได้แม้ใบรับรองที่ใช้ลงนามจะหมดอายุแล้ว หน้านี้จะพาคุณผ่านสถานการณ์ดังกล่าวตั้งแต่เอกสารเปล่าไปจนถึงสัญญาที่คงอยู่ได้ยาวนาน พร้อมระบุอย่างตรงไปตรงมาว่าขั้นตอนใดที่เอนจินเชื่อมต่อภายในแล้วในวันนี้ และขั้นตอนใดที่เปิดเผยเป็นพื้นผิวที่ถูกตรึงไว้

สัญญาที่ตรวจสอบยืนยันได้ในวันที่ลงนาม แต่ล้มเหลวในอีกสามปีต่อมาเมื่อเกิดข้อพิพาท แย่ยิ่งกว่าการไม่มีลายเซ็นเลย เพราะมีผู้ยึดถือสัญญานั้นเป็นหลัก ความล้มเหลวมักไม่ได้อยู่ที่การเข้ารหัสลับ แต่มักเกิดจากการขาดไทม์สแตมป์หรือหลักฐานการเพิกถอน ซึ่งมักถูกประเมินนานหลังจากผู้ลงนามออกจากกระบวนการไปแล้ว

การเลือกข้อผูกพันของลายเซ็นตั้งแต่ต้น และการสร้างหลักฐานที่ข้อผูกพันนั้นต้องการในเวลาที่ลงนาม คือความแตกต่างระหว่างข้อตกลงที่คงทนกับข้อตกลงที่ค่อย ๆ เสื่อมสภาพอย่างเงียบ ๆ นี่คือการตัดสินใจที่ควรทำเพียงครั้งเดียวในเวิร์กโฟลว์ แทนที่จะต้องค้นพบซ้ำเมื่อเกิดข้อพิพาทแต่ละครั้ง

  • เตรียมก่อน แล้วจึงลงนาม ลายเซ็นครอบคลุมเฉพาะช่วงไบต์ที่ใช้คำนวณลายเซ็นนั้น ให้ตัดสินใจว่าเอกสารเป็นฉบับสุดท้าย รวมถึงการแก้ไขที่ผนวกเข้ามาภายหลัง ก่อนที่คุณจะลงนาม ไม่ใช่หลังจากนั้น
  • เลือกระดับให้ตรงกับข้อผูกพัน ไม่ใช่ในทางกลับกัน PAdES กำหนดลำดับขั้น ได้แก่ ลายเซ็นพื้นฐาน ลายเซ็นที่มีไทม์สแตมป์ ลายเซ็นที่มีวัสดุการตรวจสอบยืนยันฝังอยู่ และลายเซ็นที่ประทับซ้ำเพื่อความใช้ได้สำหรับการเก็บถาวรอย่างไม่มีกำหนด (ETSI EN 319 142-2 §5.1)
  • ความใช้ได้ระยะยาวเป็นโครงสร้าง ไม่ใช่คุณสมบัติ ความใช้ได้ระยะยาวเกิดจาก Document Security Store พร้อมไทม์สแตมป์ของเอกสารที่เขียนเข้าไปในไฟล์ (ISO 32000-2:2020 §12.8)
  • ระบุรอยต่อให้ชัดเจน Document::setSignature() ระดับสูงของ NextPDF ตรึง API สาธารณะไว้ แต่ล้มเหลวอย่างรวดเร็วแทนที่จะปล่อยไฟล์ที่ไม่มีลายเซ็นออกมา เส้นทางที่เชื่อมต่อภายในแล้วคือ orchestrator ระดับล่าง หน้านี้จะไม่กล่าวให้เข้าใจเป็นอย่างอื่น

NextPDF แยก การตัดสินใจ ออกจาก กลไก การตัดสินใจคือระดับ PAdES ที่ข้อผูกพันต้องการ ส่วนกลไกคือวิธีที่ไบต์ถูกลงนาม และวิธีที่วัสดุการตรวจสอบยืนยันถูกพกพาไปกับไฟล์ การมองว่าสองสิ่งนี้เป็นเรื่องเดียวกันคือ สาเหตุที่ทีมต่าง ๆ ลงเอยด้วยลายเซ็นที่ใช้ได้ในตอนนี้แต่ไม่คงทน

สถานการณ์นี้ประกอบด้วยสี่ขั้น

  1. Prepare the document Compose the agreement and treat it as final. The signature will protect this exact byte range and nothing added outside it without a new revision.
  2. Choose the obligation B-B proves who. B-T adds trusted time. B-LT embeds the material to validate later. B-LTA re-stamps for indefinite validity.
  3. Sign A CMS signature is embedded in the signature dictionary over the byte range; a timestamp is requested from a TSA if the level needs one.
  4. Preserve For long-term levels, the Document Security Store and a document timestamp are written so the signature outlives its certificate.
สถานการณ์ข้อตกลงที่ลงนามแบบครบวงจรตั้งแต่ต้นจนจบ แต่ละขั้นเพิ่มการรับประกันหนึ่งอย่าง และระดับที่คุณเลือกในขั้นที่สองเป็นตัวกำหนดว่าขั้นที่สามและสี่ต้องสร้างหลักฐานมากเพียงใด

enum ของระดับมีอยู่จริงและเข้ารหัสข้อผูกพันไว้อย่างตรงไปตรงมา B-B พิสูจน์ตัวตนของผู้ลงนาม B-T เพิ่มไทม์สแตมป์ที่เชื่อถือได้ เพื่อให้คำถามว่า “เมื่อใด” มีน้ำหนักเท่ากับคำถามว่า “ใคร” B-LT ฝังใบรับรองและการตอบสนองการเพิกถอนที่จำเป็นต่อการตรวจสอบยืนยันลายเซ็นหลังจากใบรับรองที่ใช้ลงนามหมดอายุ B-LTA เพิ่มไทม์สแตมป์ของเอกสารเพื่อให้สามารถขยายห่วงโซ่ความเชื่อถือ ออกไปอย่างไม่มีกำหนดด้วยการประทับซ้ำก่อนที่ใบรับรองของไทม์สแตมป์แต่ละใบจะหมดอายุ enum นี้รู้ว่าระดับใดต้องการไทม์สแตมป์และระดับใดต้องการวัสดุการตรวจสอบยืนยันแบบฝัง ดังนั้นเอนจินจึงสามารถปฏิเสธการประกอบที่เป็นไปไม่ได้ แทนที่จะสร้างไฟล์ที่ดูเหมือน “ลงนาม” แล้วอย่างชวนให้เข้าใจผิด

ลำดับขั้นนี้ มีมาตรฐานรองรับ Evidence: Standard-backed Spec: ETSI EN 319 142-2, §5.1 อธิบายระดับ PAdES ที่ต่อยอดจากหน่วยพื้นฐานของ EN 319 142-1 ตั้งแต่ลายเซ็นแบบฝังพื้นฐาน ขึ้นไป โครงสร้างระยะยาวกำหนดไว้โดย Spec: ISO 32000-2:2020, §12.8 : การตรวจสอบยืนยันระยะยาว อาศัย Document Security Store และพจนานุกรมไทม์สแตมป์ของเอกสาร ที่เขียนเข้าไปในไฟล์

โมเดลของระดับ มีโค้ดรองรับ Evidence: Code-backed enum SignatureLevel มีกรณี PAdES สี่กรณี (B-B, B-T, B-LT, B-LTA) พร้อมเมท็อดเพรดิเคตสำหรับ “ต้องการไทม์สแตมป์” “ต้องการ วัสดุการตรวจสอบยืนยันแบบฝัง” และ “ต้องการไทม์สแตมป์ของเอกสาร” ส่วน Document::setSignature() ระดับสูงถูกเชื่อมต่อภายในเข้ากับตัวป้องกันแบบล้มเหลวอย่างรวดเร็วที่ ยกข้อวินิจฉัยที่ขัดขวางและนำไปแก้ไขได้ขึ้นมา แทนที่จะปล่อยเอกสารที่ไม่มีลายเซ็น ออกมา ซึ่งเป็นพฤติกรรมที่ตรวจสอบยืนยันได้ ไม่ใช่ข้อกล่าวอ้าง

พฤติกรรมการบำรุงรักษาระยะยาวถูกบันทึกไว้ที่ ระดับความสามารถ สำหรับระดับ Premium พื้นผิวการเก็บถาวรเขียน DSS และ VRI ต่อลายเซ็น ตรวจสอบความครบถ้วนของการเก็บถาวรด้วยการตรวจสุขภาพ และประทับซ้ำด้วยไทม์สแตมป์ของเอกสารก่อนที่ใบรับรองของไทม์สแตมป์จะหมดอายุ เอกสารระบุอย่างชัดเจนว่าผู้ตรวจสอบยืนยันยังคงเป็นผู้ชี้ขาด

ตัวอย่างนี้แสดง การตัดสินใจ ซึ่งก็คือการเลือกข้อผูกพัน โดยใช้ enum จริง เส้นทางการลงนามที่เชื่อมต่อภายในแล้วคือ orchestrator ระดับล่าง การเรียกใช้ระดับสูงแสดงไว้เพียงเพื่อให้พฤติกรรมการล้มเหลวอย่างรวดเร็วชัดเจนเท่านั้น

<?php
declare(strict_types=1);
use NextPDF\Security\Signature\SignatureLevel;
/**
* Map a business obligation to a PAdES level.
*
* The obligation drives the level, not the reverse — choosing B-B for a
* 10-year contract is a decision you do not want to make implicitly.
*/
function levelForObligation(string $obligation): SignatureLevel
{
return match ($obligation) {
// Internal sign-off, short retention, signer identity is enough.
'internal_approval' => SignatureLevel::PAdES_B_B,
// Counterparty agreement: prove the moment of signing.
'counterparty_agreement' => SignatureLevel::PAdES_B_T,
// Regulated contract that must verify after cert expiry.
'regulated_contract' => SignatureLevel::PAdES_B_LT,
// Long-lived legal record: indefinite, re-stampable validity.
'long_term_legal_record' => SignatureLevel::PAdES_B_LTA,
default => throw new \InvalidArgumentException(
"Unknown obligation: {$obligation}",
),
};
}
$level = levelForObligation('regulated_contract');
// The enum carries the obligation's implications with it.
$needsTsa = $level->requiresTimestamp(); // true for B-T+
$needsDss = $level->requiresDss(); // true for B-LT+
$needsArchive = $level->requiresDocumentTimestamp(); // true only for B-LTA

ออบเจกต์ของระดับไม่ใช่แค่ป้ายกำกับ แต่ออบเจกต์นี้ตอบได้ว่าข้อผูกพันนั้นต้องมีอะไรตามมา เพื่อให้การเชื่อมต่อภายในปลายทางไม่ต้องอนุมานซ้ำ

ความเข้าใจผิดที่เกิดซ้ำคือ “ลายเซ็นมีผลใช้ได้ ดังนั้นจึงเสร็จสิ้น” ความมีผลใช้ได้ในวันนี้จำเป็นแต่ยังไม่เพียงพอ ลายเซ็นถูกคำนวณจากช่วงไบต์ สิ่งใดก็ตามที่ผนวกเข้ามานอกช่วงดังกล่าวในการแก้ไขภายหลังจะไม่ถูกครอบคลุมโดยลายเซ็นนั้น จึงต้องเตรียมเอกสารให้เรียบร้อยก่อนลงนาม และลายเซ็นที่ตรวจสอบยืนยันได้ในตอนนี้อาจล้มเหลวในภายหลังเมื่อใบรับรองหมดอายุ เว้นแต่วัสดุการตรวจสอบยืนยันจะถูกฝังไว้ในเวลาที่ลงนาม “มีผลใช้ได้” และ “คงทน” เป็นการรับประกันคนละอย่าง และมีเพียงข้อผูกพันเท่านั้นที่บอกได้ว่าคุณต้องการสิ่งใดจริง ๆ

กับดักที่เกี่ยวข้องซึ่งเฉพาะกับเอนจินนี้ คือการสันนิษฐานว่า setSignature() ระดับสูงสร้างไฟล์ที่ลงนามแล้วได้ในวันนี้ ความจริงคือยังไม่ได้สร้าง แต่จะล้มเหลวอย่างรวดเร็ว โดยตั้งใจ ให้ถือว่าการวินิจฉัยนั้นคือสัญญา

  • Document::setSignature() เป็นพื้นผิวสาธารณะที่ถูกตรึงไว้ ไม่ใช่ตัวลงนามที่เชื่อมต่อภายในแล้ว พื้นผิวนี้ล้มเหลวอย่างรวดเร็วพร้อมการวินิจฉัยที่ขัดขวาง และไม่เคยปล่อย PDF ที่ไม่มีลายเซ็นออกมาแทนที่ฉบับที่ลงนามแล้ว เส้นทางที่เชื่อมต่อภายในแล้วคือ orchestrator สองเฟสระดับล่าง
  • การบำรุงรักษาการตรวจสอบยืนยันระยะยาว (DSS/VRI การตรวจสุขภาพ และลูปไทม์สแตมป์การเก็บถาวร) เป็นความสามารถระดับ Premium Core ไม่มีลูปการเก็บถาวร ดูขอบเขตด้านล่าง
  • ลายเซ็นปกป้องเฉพาะช่วงไบต์ของลายเซ็นนั้น การแก้ไขที่ผนวกเข้ามาภายหลังเป็นส่วนแยกต่างหาก เอนจินไม่ขยายความครอบคลุมย้อนหลัง
  • NextPDF สร้างและบำรุงรักษาโครงสร้าง แต่ไม่ได้เป็นผู้ชี้ขาด การที่ลายเซ็น เชื่อถือได้ หรือไม่นั้นขึ้นอยู่กับจุดยึดความเชื่อถือและนโยบายของผู้ตรวจสอบยืนยัน ซึ่งอยู่นอกเอนจิน
  • B-LTA ไม่ได้ทำให้ลายเซ็นคงอยู่ชั่วนิรันดร์ด้วยตัวมันเอง B-LTA เปิดให้มีความใช้ได้อย่างไม่มีกำหนดเฉพาะเมื่อลูปการประทับซ้ำทำงานตามกำหนดเวลาก่อนที่ใบรับรองของไทม์สแตมป์แต่ละใบจะหมดอายุ
  • หน้านี้อธิบายในระดับพฤติกรรมสำหรับพื้นผิวการเก็บถาวรของ Premium หน้านี้ไม่ยืนยันการยอมรับโดยศาลหรือหน่วยงานใดเป็นการเฉพาะ
การลงนาม PAdES และความสมเหตุสมผลระยะยาว — edition availability
Edition Availability
Core

Core เปิดเผย enum SignatureLevel และพื้นผิว Document::setSignature() ที่ถูกตรึงไว้ (ล้มเหลวอย่างรวดเร็ว) orchestrator ระดับล่างที่เชื่อมต่อภายในแล้ว ครอบคลุมการลงนามแบบ baseline การบำรุงรักษาการเก็บถาวรระยะยาว ไม่อยู่ใน Core

Pro

การลงนามแบบ baseline ของ PAdES (B-B / B-T) ผ่าน orchestrator นั้นพร้อมใช้งาน

Enterprise

เพิ่ม B-LT / B-LTA การบำรุงรักษา Document Security Store และ VRI ต่อลายเซ็น การตรวจสุขภาพ LTV และลูปการเก็บถาวรไทม์สแตมป์ของเอกสาร เพื่อความสมเหตุสมผลอย่างไม่มีกำหนด

  • PAdES — PDF Advanced Electronic Signatures: ตระกูลโปรไฟล์ของ ETSI ที่นิยามวิธีบรรจุลายเซ็นอิเล็กทรอนิกส์ขั้นสูงไว้ใน PDF
  • Byte range — ช่วงไบต์ของไฟล์ที่ต่อเนื่องกันซึ่งใช้คำนวณลายเซ็น เนื้อหานอกช่วงนั้นจะไม่ถูกปกป้องโดยลายเซ็นนั้น
  • ระดับลายเซ็น (B-B / B-T / B-LT / B-LTA) — ลำดับขั้นของ PAdES ได้แก่ ใครลงนาม เมื่อใด พร้อมวัสดุการตรวจสอบยืนยันแบบฝัง และประทับซ้ำได้เพื่อความใช้ได้สำหรับการเก็บถาวรอย่างไม่มีกำหนด
  • TSA — Time-Stamping Authority: บริการตาม RFC 3161 ที่ยืนยันว่าสถานะหนึ่งของเอกสารมีอยู่ ณ ช่วงเวลา UTC ที่กำหนด
  • DSS (Document Security Store) — พื้นที่จัดเก็บในไฟล์สำหรับใบรับรอง การตอบสนอง OCSP และ CRL ที่จำเป็นต่อการตรวจสอบยืนยันลายเซ็นหลังจากใบรับรองหมดอายุ
  • LTV (Long-Term Validation) — การทำให้ลายเซ็นยังตรวจสอบยืนยันได้เมื่อเวลาผ่านไปด้วยการฝังหลักฐานการตรวจสอบยืนยันและประทับซ้ำ
  • Fail-fast — การปฏิเสธที่จะสร้างสิ่งประดิษฐ์ที่ชวนให้เข้าใจผิด และส่งข้อผิดพลาดที่นำไปแก้ไขได้แทน แทนที่จะปล่อยไฟล์ที่ผิดอย่างเงียบ ๆ ออกมา