Enterprise รุ่น
Validation — เอกสารอ้างอิงเชิงลึก
ภาพรวมโดยสังเขป
หัวข้อที่มีชื่อว่า “ภาพรวมโดยสังเขป”โมดูล Validation รันนโยบายการปฏิบัติตามข้อกำหนดเชิงโครงสร้างแบบอ่านอย่างเดียวสำเร็จรูปกับไบต์ PDF ดิบ Compliance::assess() ใช้ CompliancePolicy หนึ่งรายการพอดีและคืนค่า ComplianceReport พร้อมผลการตรวจพบที่แบ่งตามระดับความรุนแรงและข้อความปฏิเสธความรับผิดทางกฎหมายที่บังคับ นโยบายมีให้สำหรับ PDF/A-4 (พร้อมตัวแปร e และ f ) โครงสร้าง PAdES baseline โปรไฟล์เชิงโครงสร้าง eIDAS สุขภาพ LTV/DSS ZUGFeRD / Factur-X FDA 21 CFR Part 11 และการเก็บถาวรแบบ WORM ตาม SEC Rule 17a-4 ทุกนโยบายเป็นฟังก์ชันบริสุทธิ์ คือไบต์เข้า ผลการตรวจพบออก Validation ไม่เคยแก้ไขเอกสารและไม่เคยดำเนินการตรวจสอบทางการเข้ารหัสลับ
ความพร้อมใช้งานและการอนุญาต
หัวข้อที่มีชื่อว่า “ความพร้อมใช้งานและการอนุญาต”ความสามารถนี้มาในแพ็กเกจ NextPDF Enterprise (nextpdf/enterprise ) และเปิดใช้งานด้วยซองสิทธิ์การใช้งานระดับชั้น Enterprise การปรับใช้ที่ไม่มีสิทธิ์ดังกล่าวจะไม่โหลดคลาสของความสามารถนี้ เปรียบเทียบรุ่นและขอรับสิทธิ์การใช้งาน
พื้นผิว Validation/Evidence ได้รับอนุญาตด้วยความสามารถ enterprise.compliance.evidence สิทธิ์ที่ถูกปฏิเสธจะปฏิเสธฟีเจอร์แทนที่จะลดระดับลงอย่างเงียบ ๆ
| ระดับชั้น | พื้นผิว Validation |
|---|---|
| Core | เครื่องมือตรวจสอบสตรีมไบต์ในกระบวนการและการตรวจสอบไขว้ไวยากรณ์ ผลที่ไม่พบรายการใดเป็นผลที่ตรวจสอบแล้ว ไม่ใช่ใบรับรอง |
| Pro | การตรวจสอบ EN 16931 / Factur-X / ZUGFeRD ในกระบวนการที่เลเยอร์ใบแจ้งหนี้อิเล็กทรอนิกส์ ไม่มีนโยบายสำเร็จรูปของ PDF/A-4, PAdES, LTV, FDA หรือ SEC |
| Enterprise | นโยบายเชิงโครงสร้างสำเร็จรูปสำหรับ PDF/A-4, PAdES, LTV, ZUGFeRD, FDA Part 11 และ SEC 17a-4 พร้อมรายงานแบบรวม (โมดูลนี้) |
เกตเวย์ไซด์คาร์ภายนอกของ Enterprise Compliance เป็นโมดูลที่แยกต่างหากและเป็นอิสระ
พื้นผิว API สาธารณะ
หัวข้อที่มีชื่อว่า “พื้นผิว API สาธารณะ”composer require nextpdf/enterprise:^3| สัญลักษณ์ | พารามิเตอร์ | พฤติกรรมเริ่มต้น | คืนค่า | โยนหรือล้มเหลวด้วย | หมายเหตุ |
|---|---|---|---|---|---|
Compliance::__construct | ?ClockInterface $clock = null | ใช้นาฬิการะบบเมื่อไม่มีการฉีดนาฬิกา | — | — | รูปแบบ instance ที่เป็นมิตรกับ DI นาฬิกาประทับ validatedAt |
Compliance::run | string $pdfData, CompliancePolicy $policy, array $context = [] | ใช้นโยบายหนึ่งรายการพอดีและวัดระยะเวลาตามเวลานาฬิกาจริง | ComplianceReport | ส่งต่อ exception ของนโยบายกำหนดเอง นโยบายในตัวจะเก็บผลการตรวจพบแทนที่จะโยน | เมท็อดแบบ instance |
Compliance::assess (static) | string $pdfData, CompliancePolicy $policy, array $context = [] | สร้าง instance เริ่มต้นและมอบหมายให้ run() | ComplianceReport | เหมือนกับ run() | เส้นทางเร่งด่วนแบบไม่ต้องตั้งค่า |
Policies::pdfA4 / ::pdfA4e / ::pdfA4f (static) | — | นโยบายเชิงโครงสร้าง PDF/A-4 ตาม ISO 19005-4:2020 | CompliancePolicy | — | e อนุญาตคำอธิบายประกอบแบบ 3D/rich-media f เพิ่มการตรวจสอบความสัมพันธ์ของไฟล์ที่ฝัง |
Policies::padesBaseline (static) | — | การตรวจสอบเชิงโครงสร้าง PAdES B-B | CompliancePolicy | — | โครงสร้างเท่านั้น ไม่มีการตรวจสอบทางการเข้ารหัสลับ |
Policies::eidasQualified (static) | — | การตรวจสอบเชิงโครงสร้าง PAdES ภายใต้โปรไฟล์ที่ระบุป้าย eIDAS | CompliancePolicy | — | การมีคุณสมบัติขึ้นอยู่กับ TSP และใบรับรองที่มีคุณสมบัติเหมาะสม |
Policies::ltvHealth (static) | — | การตรวจสอบสุขภาพเชิงโครงสร้างของ DSS | CompliancePolicy | — | การมีอยู่ของ DSS resolve จากกราฟอ็อบเจกต์ที่ใช้งานอยู่ แบบ fail-closed |
Policies::zugferd (static) | string $profile = 'BASIC' | ทำให้นามแฝงของโปรไฟล์เป็นมาตรฐานและสร้างเครื่องมือตรวจสอบ ZUGFeRD | CompliancePolicy | \ValueError (โปรไฟล์ที่ไม่รู้จัก) | โปรไฟล์: MINIMUM, BASIC, BASIC_WL, EN16931, EXTENDED |
Policies::fdaPart11 (static) | — | นโยบายเชิงโครงสร้าง FDA 21 CFR Part 11 | CompliancePolicy | — | การตรวจสอบเชิงโครงสร้างเจ็ดรายการ รวมถึงความสมบูรณ์ของ hash-chain ของร่องรอยการตรวจสอบ |
Policies::sec17a4 / ::sec17a4Compatible / ::sec17a4Structural / ::sec17a4PreSign (static) | — | นโยบาย WORM ตาม SEC 17a-4 ที่ระดับความเข้มงวดที่ระบุชื่อ | CompliancePolicy | — | ระดับความเข้มงวดจับคู่กับ WormComplianceLevel |
CompliancePolicy (interface) | — | สัญญาแบบ strategy สำหรับหนึ่งมาตรฐาน | — | — | getName(), getIdentifier(), getStandardReference(), validate() ลูกค้าสามารถ implement ได้ |
ComplianceReport | อ็อบเจกต์ค่าแบบอ่านอย่างเดียว | ผลการตรวจพบถูกแบ่งตามระดับความรุนแรงตอนสร้าง | — | — | passes(), fails(), totalFindings(), getDisclaimer() สาธารณะ findings, errors, warnings, infos, policyName, policyId, standard, validatedAt, durationMs |
ComplianceFinding | Severity $severity, string $ruleId, string $message, string $clause = '', string $suggestion = '' | ผลของกฎหนึ่งรายการพร้อมการอ้างอิงอนุประโยคและคำแนะนำการแก้ไข | — | — | static error() / warning() / info() isError() |
Severity (enum) | 3 กรณีที่มีสตริงรองรับ | Error, Warning, Info | — | — | มีเพียง Error ที่ทำให้รายงานไม่ผ่าน |
WormComplianceLevel (enum) | 4 กรณีที่มีสตริงรองรับ | Full, Compatible, Structural, PreSign | — | — | requiresSignature(), requiresDocMdp(), requiresLtv(), maxDocMdpLevel() |
PdfAPolicy, PadesValidator, LtvHealthCheck, ZugferdValidator, Sec17a4WormPolicy, Fda\FdaPart11Policy | คอนสตรัคเตอร์ต่อคลาส | implement CompliancePolicy สำหรับหนึ่งมาตรฐานต่อคลาส | list<ComplianceFinding> จาก validate() | — | รับผ่าน Policies Sec17a4WormPolicy::getLevel() เปิดเผยระดับความเข้มงวดที่กำหนดค่าไว้ |
Fda\FdaSigningIntent (enum) | 6 กรณีที่มีสตริงรองรับ | Authoring, Review, Approval, Certification, Verification, Rejection | — | — | toPdfReasonString() ให้สตริง /Reason แบบ canonical |
Fda\FdaAuditEvent::__construct | DateTimeImmutable $timestamp, string $actor, FdaSigningIntent $action, string $documentHash, string $certificateSerial, string $previousEventHash = '' | คำนวณ hash ของเชน SHA-256 ตอนสร้าง | — | InvalidArgumentException (timestamp ไม่ใช่ UTC) | eventHash สาธารณะ toXmpRdf() ทำ serialize รายการ XMP list หนึ่งรายการ |
Fda\FdaAuditTrail::addEvent | FdaAuditEvent $event | เพิ่มเหตุการณ์เมื่อลิงก์เชนของมันตรงกับส่วนท้ายของร่องรอย | self | InvalidArgumentException (hash chain เสียหาย) | รวมถึง createEvent(), verifyChain(), getLastEventHash(), getEvents(), embedInMetadata() |
Fda\FdaSignatureEnforcer::configureSeedValue | FdaSigningIntent $intent, string $tsaUrl | สร้างการกำหนดค่า seed-value ของลายเซ็นที่ถูกจำกัดตาม FDA | SeedValueConfig | — | ต้องใช้ชุดเหตุผล FDA, timestamp และไดเจสต์ SHA-256 หรือแข็งแกร่งกว่า |
Fda\FdaSignatureEnforcer::applyTo | SequentialSigner $signer, SigningStrategy $strategy, string $signerName, FdaSigningIntent $intent, string $tsaUrl, string $fieldName = '', ?string $reason = null | เพิ่มผู้ลงนามที่ถูกจำกัดตาม FDA ให้กับ SequentialSigner ของ Pro | SequentialSigner | — | ทำ serialize ข้อจำกัดลงในฟิลด์ลายเซ็นที่สร้างขึ้น |
namespace NextPDF\Enterprise\Validation;
final readonly class Compliance{ public function __construct(?ClockInterface $clock = null);
/** @param array<string, mixed> $context */ public function run(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;
/** @param array<string, mixed> $context */ public static function assess(string $pdfData, CompliancePolicy $policy, array $context = []): ComplianceReport;}final class Policies{ public static function pdfA4(): CompliancePolicy; // also pdfA4e(), pdfA4f() public static function padesBaseline(): CompliancePolicy; public static function eidasQualified(): CompliancePolicy; public static function ltvHealth(): CompliancePolicy; public static function zugferd(string $profile = 'BASIC'): CompliancePolicy; public static function fdaPart11(): CompliancePolicy; public static function sec17a4(): CompliancePolicy; // also sec17a4Compatible(), sec17a4Structural(), sec17a4PreSign()}interface CompliancePolicy{ public function getName(): string;
public function getIdentifier(): string;
public function getStandardReference(): string;
/** * @param array<string, mixed> $context * @return list<ComplianceFinding> */ public function validate(string $pdfData, array $context = []): array;}
final readonly class ComplianceReport{ public const string LEGAL_DISCLAIMER;
public function passes(): bool;
public function fails(): bool;
public function totalFindings(): int;
public function getDisclaimer(): string;}สัญญาพฤติกรรม
หัวข้อที่มีชื่อว่า “สัญญาพฤติกรรม”Compliance::assess() (static) และ Compliance::run() (instance, พร้อม Psr\Clock\ClockInterface ที่ฉีดได้) ใช้นโยบายหนึ่งรายการพอดีและคืนค่า ComplianceReport กฎที่สังเกตได้จากภายนอก:
- อ่านอย่างเดียวบริสุทธิ์ ทุก
CompliancePolicy::validate()เป็นฟังก์ชันบริสุทธิ์ คือไบต์เข้า ผลการตรวจพบออก นโยบายจะไม่แก้ไขไบต์ PDF เลย invariant เชิงสถาปัตยกรรมนี้ทำให้การตรวจสอบความถูกต้องแยกจากการแก้ไขอัตโนมัติและจากโมดูล Evidence - เกตระดับความรุนแรง
ComplianceReport::passes()เป็น true เฉพาะเมื่อerrors === []คำเตือนและข้อมูลไม่เคยทำให้รายงานไม่ผ่านfails()เป็นส่วนเติมเต็ม - ข้อความปฏิเสธความรับผิดที่บังคับ
ComplianceReport::getDisclaimer()คืนค่าข้อความปฏิเสธความรับผิดทางกฎหมายแบบคงที่ สัญญากำหนดให้ต้องแสดงข้อความนี้ในเอาต์พุตที่ผู้ใช้มองเห็น - ที่มาของรายงาน รายงานพกพาชื่อนโยบาย ตัวระบุ และการอ้างอิงมาตรฐานจากนโยบาย เวลาประทับการตรวจสอบจากนาฬิกาที่ฉีดหรือนาฬิการะบบ และระยะเวลาที่วัดได้เป็นมิลลิวินาที
- เก็บรวบรวม อย่ายกเลิก นโยบายในตัวรันการตรวจสอบที่เกี่ยวข้องทั้งหมดและเก็บทุกผลการตรวจพบแทนที่จะหยุดที่ข้อผิดพลาดแรก
- เฉพาะ DSS ที่เข้าถึงได้ผ่าน catalog
LtvHealthCheckresolve การมีอยู่ของ DSS จากกราฟอ็อบเจกต์ที่ใช้งานอยู่ คือ trailer ที่ใช้งานอยู่ จากนั้น catalog/Rootแล้วจึง/DSSและคีย์ย่อยของมัน ไบต์ marker ที่ฝังในคอมเมนต์ สตริง อ็อบเจกต์กำพร้า หรือ revision ที่ถูกแทนที่ไม่นับ อินพุตที่แจงไม่ได้ถือเป็นไม่มี DSS ดังนั้นการตรวจสอบจึง fail closed การตรวจสอบเป็นเชิงโครงสร้าง ไม่ได้ตรวจสอบข้อมูล OCSP/CRL ที่ฝังไว้ในทางการเข้ารหัสลับ - การตรวจสอบลายเซ็นเชิงโครงสร้าง
Policies::padesBaseline()และPolicies::eidasQualified()ตรวจสอบโครงสร้าง PAdES ในระดับ PDF เท่านั้น การมีคุณสมบัติภายใต้ eIDAS ขึ้นอยู่กับ TSP และใบรับรองที่มีคุณสมบัติเหมาะสม ซึ่งอยู่นอกโมดูลนี้ - นโยบายอุตสาหกรรมที่มีการกำกับดูแลเป็นเชิงโครงสร้าง
FdaPart11Policyตรวจสอบการมีลายเซ็น เจตนา/Reasonเวลาลงนาม/Midentity/Nameการไม่มี JavaScript namespace ของร่องรอยการตรวจสอบ FDA และความสมบูรณ์ของ hash-chainSec17a4WormPolicyตรวจสอบกฎ WORM สูงสุด 13 รายการWormComplianceLevelเลือกระดับความเข้มงวดFullเรียกร้อง DocMDP ระดับ 1Compatibleยอมรับระดับ 2 และStructural/PreSignข้ามกฎลายเซ็น DocMDP และ DSS ไม่มีนโยบายใดสร้างการปฏิบัติตามข้อกำหนดทางกฎหมาย - บริบท ZUGFeRD
Policies::zugferd()ตรวจสอบข้อกำหนดระดับ PDF เสมอ มันตรวจสอบ XML ของใบแจ้งหนี้เฉพาะเมื่อผู้เรียกส่ง['xml' => $xmlData]ใน$contextมิฉะนั้นจะปล่อยผลการตรวจพบระดับข้อมูลzugferd-xml-skipped - ร่องรอยการตรวจสอบที่ตรวจจับการปลอมแปลงได้
FdaAuditTrailเป็น hash chain SHA-256 แบบเพิ่มได้อย่างเดียวaddEvent()ปฏิเสธลิงก์ที่เสียหายverifyChain()คำนวณทุก hash ใหม่ และembedInMetadata()เขียนร่องรอยลงใน XMP ภายใต้http://ns.nextpdf.dev/fda/1.0/พร้อม extension schema ของ PDF/A
กรณีขอบและโหมดความล้มเหลว
หัวข้อที่มีชื่อว่า “กรณีขอบและโหมดความล้มเหลว”- อินพุตที่ไม่ใช่ PDF หรือว่างเปล่าจะให้ผลการตรวจพบที่เป็นข้อผิดพลาดแทนที่จะเป็น exception ในนโยบายในตัว ตรวจสอบ
passes()และแสดงข้อความปฏิเสธความรับผิดเสมอ Policies::zugferd()ทำให้นามแฝงของโปรไฟล์เป็นมาตรฐาน (BASIC_WL,EN16931,EN_16931) โปรไฟล์ที่ไม่รู้จักจะยก\ValueErrorตอนสร้างจากโรงงาน ก่อนที่การตรวจสอบใด ๆ จะเริ่ม- DSS ที่มี CRL แต่ไม่มีการตอบสนอง OCSP ยังคงเป็นไปตามการตรวจสอบวัสดุการเพิกถอน ผลการตรวจพบจะระบุทางเลือกที่ยอมรับได้ การที่ไม่มีทั้งสองอย่างเลยจึงเป็นข้อผิดพลาด
/VRIdictionary หรือ/Certsarray ที่หายไปทำให้เกิดคำเตือน ไม่ใช่ข้อผิดพลาด รายงานยังคงผ่านได้FdaAuditEventปฏิเสธ timestamp ที่ไม่ใช่ UTC ใด ๆ ด้วยInvalidArgumentExceptionตอนสร้างFdaAuditTrail::verifyChain()คืนค่า false เมื่อมีเหตุการณ์ที่ถูกปลอมแปลงหรือถูกจัดลำดับใหม่ใด ๆ และไม่เคยโยน exception- การ implement
CompliancePolicyแบบกำหนดเองอาจโยน exception จากvalidate()Compliance::run()ไม่ดักจับ ดังนั้น exception ดังกล่าวจะส่งต่อไปยังผู้เรียก
พฤติกรรมในโหมด FIPS
หัวข้อที่มีชื่อว่า “พฤติกรรมในโหมด FIPS”โมดูลนี้ไม่ดำเนินการลงนาม ไม่ตรวจสอบทางการเข้ารหัสลับ และไม่ดูแลรักษาคีย์ นโยบายอัลกอริทึมในโหมด FIPS ถูกควบคุมโดยโมดูล Security และ Signature ค่า seed ของ FdaSignatureEnforcer จำกัดฟิลด์ลายเซ็นที่ผูกกับ FDA ให้ใช้วิธีไดเจสต์ SHA-256, SHA-384 หรือ SHA-512
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”นโยบายเหล่านี้ตรวจสอบแอตทริบิวต์เชิงโครงสร้างเทียบกับมาตรฐานที่ระบุชื่อ คำตัดสินเรื่องความสอดคล้องสำหรับโปรไฟล์ ISO/ETSI ยังคงเป็นคุณสมบัติของไฟล์สุดท้ายร่วมกับเครื่องมือตรวจสอบภายนอก
| พฤติกรรม | การอ้างอิง |
|---|---|
| การเป็นไปตามข้อกำหนดถูกกำหนดเทียบกับมาตรฐาน ไม่ใช่เทียบกับผู้ผลิต | ISO 19005-4:2020 §5.2 |
| พจนานุกรมลายเซ็นดิจิทัล / DSS สำหรับการตรวจสอบความถูกต้องแบบระยะยาว | ISO 32000-2:2020 §12.8 |
DSS เป็นพจนานุกรมที่ถือโดยคีย์ DSS ของ catalog เอกสาร | ISO 32000-2:2020 §12.8.4.3 |
| ระดับลายเซ็น PAdES baseline | ETSI EN 319 142-1 §5.4.3 |
| แบบจำลองเชิงความหมายของโปรไฟล์ EN 16931 (การอ้างอิงสนับสนุน) | Factur-X 1.08 (EN 16931) |
นโยบาย FDA 21 CFR Part 11 และ SEC 17a-4 ตรวจสอบแอตทริบิวต์เชิงโครงสร้างเท่านั้น ข้อบังคับเหล่านั้นอยู่นอกคลังข้อมูลการตรวจสอบและไม่มีการอ้างความสอดคล้องแบบ verified สตริงอนุประโยคภายในผลการตรวจพบของ FDA (ตัวอย่างเช่น §11.50, §11.10(e)) เป็นการอ้างอิงกฎที่ผลิตภัณฑ์ปล่อยออกมา แถว EN 16931 เป็นการอ้างอิงสนับสนุนที่อยู่ต่ำกว่าระดับการดึงข้อมูล ไม่ใช่ข้ออ้างความสอดคล้องที่เด็ดขาด การรองรับมาตรฐานไม่ใช่การเป็นไปตามมาตรฐานนั้น และการเป็นไปตามข้อกำหนดก็ไม่ใช่การออกใบรับรอง — NextPDF ไม่ได้ถือใบรับรองใด ๆ และไม่ได้มอบใบรับรองใด ๆ เอกสารอ้างอิงนี้ไม่ใช่คำให้ความเห็นทางกฎหมาย ให้ปรึกษาทีมการปฏิบัติตามข้อกำหนดของคุณเกี่ยวกับความเพียงพอทางกฎหมาย
หมายเหตุการพัฒนา
หัวข้อที่มีชื่อว่า “หมายเหตุการพัฒนา”- การตรวจสอบความถูกต้องทำงานภายในกระบวนการและในเครื่องโดยไม่มี I/O ผ่านเครือข่าย นโยบายไม่สามารถเปลี่ยนแปลงอินพุตได้
- ถือว่าไบต์ PDF จากแหล่งที่ไม่น่าเชื่อถือเป็นอันตราย นโยบายในตัวครอบคลุมไบต์ตามอำเภอใจอย่างสมบูรณ์และ fail closed เมื่อไม่สามารถ resolve โครงสร้างได้
- แสดง
ComplianceReport::getDisclaimer()ในทุกการเรนเดอร์รายงานที่ผู้ใช้มองเห็น - รายงานและผลการตรวจพบอาจมีข้อมูลส่วนบุคคลจากเอกสารที่ลงนามและเมทาดาทาของร่องรอยการตรวจสอบ (ชื่อผู้ลงนาม หมายเลขซีเรียลใบรับรอง) ผู้ดำเนินการเป็นเจ้าของมาตรการควบคุมการเก็บรักษาและการลดข้อมูล
- นโยบายกำหนดเอง implement
CompliancePolicyรักษาgetIdentifier()ให้ไม่ซ้ำกันในทุกนโยบายเพื่อการ serialize และการแคช - โมดูลนี้เกี่ยวข้องกับฟังก์ชันการเข้ารหัสลับ ให้ถือว่ามีความอ่อนไหวด้านความปลอดภัยในการรีวิวของคุณเอง
- รายละเอียดกลไกภายในอยู่ในเอกสารภายในของ repository ต้นทางและอยู่นอกขอบเขตของคู่มือนี้
ขอบเขตการเผยแพร่
หัวข้อที่มีชื่อว่า “ขอบเขตการเผยแพร่”หน้านี้บันทึกเฉพาะพฤติกรรมที่สังเกตได้จากภายนอกและพื้นผิว API สาธารณะที่รองรับเท่านั้น เส้นทาง namespace ภายใน คลาสตัวช่วย ตารางกลไก ชื่อไฟล์ runbook และคำนำหน้า ticket อยู่นอกขอบเขต