การแก้ไขปัญหา: ลายเซ็นและการประทับเวลาล้มเหลว
รายการเหล่านี้ครอบคลุมความล้มเหลวของลายเซ็นที่ถูกยกผ่าน NextPDF\Exception\SignatureException และ NextPDF\Security\Signature\Exception\SignatureLevelUnreachableException แต่ละรายการระบุชื่อ factory method หรือคลาสที่แน่นอน เพื่อให้ยืนยันสาเหตุได้จากข้อความและ getContext() แทนการคาดเดา
หมายเหตุด้านถ้อยคำ: เอนจินไม่ได้รับรองว่าลายเซ็นถูกต้องหรือเอกสารได้รับการปกป้อง เอนจินรายงานความล้มเหลวที่ตรวจพบเท่านั้น ให้ถือว่าการแก้ไขแต่ละข้อเป็นขั้นตอนเพื่อตัดสาเหตุที่ถูกรายงานออก
รายการ: ไม่สามารถสร้างระดับ PAdES “B-LT” หรือ “B-LTA” ได้
หัวข้อที่มีชื่อว่า “รายการ: ไม่สามารถสร้างระดับ PAdES “B-LT” หรือ “B-LTA” ได้”- อาการ
SignatureExceptionพร้อมส่วนท้ายของข้อความnextpdf/enterprise package is required for B-LT/B-LTA signatures - สาเหตุที่เป็นไปได้ ไม่มีผู้ให้บริการความสามารถสำหรับการตรวจสอบความถูกต้องระยะยาว B-LT และ B-LTA ฝังวัสดุการเพิกถอนและการประทับเวลาแบบจัดเก็บถาวร และผู้ให้บริการนี้มาพร้อมกับ
nextpdf/enterprise - หลักฐาน / การวินิจฉัย factory
SignatureException::ltvCapabilityMissing()สร้างข้อความนี้โดยตรงgetContext()คืนค่าsignature_levelที่ตั้งเป็นระดับที่พยายามใช้ - การแก้ไข
- ติดตั้งผู้ให้บริการโดยรัน
composer require nextpdf/enterprise - รันการเรียกเซ็นอีกครั้ง
- หากไม่สามารถติดตั้งผู้ให้บริการได้ ให้ร้องขอ
B-BหรือB-Tแทน ซึ่งแพ็กเกจ core สามารถสร้างได้
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: ระดับลายเซ็นเข้าถึงไม่ได้และการเรียกถูกปฏิเสธ
หัวข้อที่มีชื่อว่า “รายการ: ระดับลายเซ็นเข้าถึงไม่ได้และการเรียกถูกปฏิเสธ”- อาการ
SignatureLevelUnreachableExceptionพร้อมข้อความในรูปแบบPAdES level "<x>" is unreachable (highest achievable: "<y>") - สาเหตุที่เป็นไปได้ ระดับความสอดคล้องที่ร้องขอต้องใช้โครงสร้างพื้นฐานที่ไม่พร้อมใช้งานในเวลาเซ็น โดยส่วนใหญ่คือผู้ออกใบรับรองการประทับเวลาสำหรับ B-T ขึ้นไป เอนจินล้มเหลวแบบปิด: เอนจินไม่ลดระดับลงอย่างเงียบๆ แล้วประกาศระดับที่สูงกว่า
- หลักฐาน / การวินิจฉัย
getContext()คืนค่าrequestedLevel,highestAchievableLevel, และreasonฟิลด์reasonระบุช่องว่างของโครงสร้างพื้นฐาน นี่คือค่าเริ่มต้นแบบล้มเหลวแบบปิดที่ใช้เพื่อป้องกันไม่ให้เอกสารอ้างระดับที่ไม่เป็นไปตามเงื่อนไข - การแก้ไข
- อ่านฟิลด์
reasonเพื่อระบุโครงสร้างพื้นฐานที่ขาดหายไป - จัดหาส่วนประกอบที่ขาดหายไป ตัวอย่างเช่น กำหนดค่าผู้ออกใบรับรองการประทับเวลา แล้วรันการเรียกอีกครั้ง
- หากต้องการยอมรับระดับที่ต่ำกว่าโดยเจตนา ให้ส่ง
allowDegradation: trueไปยังPadesOrchestratorจากนั้นการเรียกจะสร้างhighestAchievableLevelและรายงานระดับที่สร้างได้
- ที่เกี่ยวข้อง การเข้ารหัสลับและสิทธิ์
รายการ: จำเป็นต้องมีไคลเอนต์ผู้ออกใบรับรองการประทับเวลาแต่ไม่มี
หัวข้อที่มีชื่อว่า “รายการ: จำเป็นต้องมีไคลเอนต์ผู้ออกใบรับรองการประทับเวลาแต่ไม่มี”- อาการ
SignatureExceptionพร้อมส่วนท้ายTSA client is required for level <x> but none was provided - สาเหตุที่เป็นไปได้ การร้องขอ B-T, B-LT หรือ B-LTA ต้องมีไคลเอนต์ผู้ออกใบรับรองการประทับเวลา แต่ orchestrator ไม่มีไคลเอนต์นี้
- หลักฐาน / การวินิจฉัย factory
SignatureException::tsaRequired()สร้างข้อความนี้;getContext()มีsignature_levelที่พยายามใช้ - การแก้ไข
- กำหนดค่าไคลเอนต์ผู้ออกใบรับรองการประทับเวลาและส่งไปยัง orchestrator
- รันการเรียกใหม่อีกครั้ง
- หากต้องการสร้างระดับที่ไม่ต้องมีการประทับเวลา ให้ร้องขอ
B-B
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: URL ของปลายทางผู้ออกใบรับรองการประทับเวลาว่างเปล่า
หัวข้อที่มีชื่อว่า “รายการ: URL ของปลายทางผู้ออกใบรับรองการประทับเวลาว่างเปล่า”- อาการ
SignatureExceptionพร้อมส่วนท้ายTSA endpoint URL is empty - สาเหตุที่เป็นไปได้ ไคลเอนต์ผู้ออกใบรับรองการประทับเวลาถูกสร้างด้วย URL ของปลายทางที่ว่างเปล่า
- หลักฐาน / การวินิจฉัย factory
SignatureException::tsaUrlEmpty()สร้างข้อความนี้ กรณีนี้เป็นข้อบกพร่องในการกำหนดค่า ไม่ใช่ความล้มเหลวของเครือข่าย - การแก้ไข
- ตั้ง URL ของปลายทางที่ไม่ว่างเปล่าบนไคลเอนต์ผู้ออกใบรับรองการประทับเวลา เช่น
https://timestamp.example.com/tsa - หากระดับที่ร้องขอไม่จำเป็นต้องมีการประทับเวลา ให้นำการเชื่อมต่อไคลเอนต์ผู้ออกใบรับรองการประทับเวลาออกแทน
- รันการเรียกอีกครั้ง
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: ตัวยึดตำแหน่งลายเซ็นขาดหายไปจากบัฟเฟอร์
หัวข้อที่มีชื่อว่า “รายการ: ตัวยึดตำแหน่งลายเซ็นขาดหายไปจากบัฟเฟอร์”- อาการ
SignatureExceptionพร้อมส่วนท้ายno /Contents <…> field found in PDF buffer (signature placeholder missing) - สาเหตุที่เป็นไปได้ ขั้นตอนการเซ็นได้รับบัฟเฟอร์ที่ไม่มีคอนเทนเนอร์ลายเซ็นที่จองไว้ จึงไม่มีที่ให้เขียนลายเซ็น
- หลักฐาน / การวินิจฉัย factory
SignatureException::signatureContentsNotFound()สร้างข้อความนี้ - การแก้ไข
- ตรวจสอบให้แน่ใจว่าฟิลด์ลายเซ็นและตัวยึดตำแหน่งถูกเขียนก่อนที่ขั้นตอนการเซ็นจะทำงาน
- รันไปป์ไลน์อีกครั้งเพื่อให้มีตัวยึดตำแหน่งอยู่แล้วเมื่อการเซ็นเริ่มต้น
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: สถานะการเพิกถอนไม่ทราบ (ผู้ตอบ OCSP ปฏิเสธ)
หัวข้อที่มีชื่อว่า “รายการ: สถานะการเพิกถอนไม่ทราบ (ผู้ตอบ OCSP ปฏิเสธ)”- อาการ
SignatureExceptionพร้อมส่วนท้ายOCSP responder returned non-successful OCSPResponseStatus "<status>" - สาเหตุที่เป็นไปได้ ผู้ตอบ Online Certificate Status Protocol (OCSP) ไม่ได้คืนสถานะ
successfulจึงไม่ได้สร้างการยืนยันการเพิกถอน เอนจินปฏิบัติตาม RFC 6960 §4.2.1 ซึ่งอ้างไว้ในซอร์ส: เนื้อหาของการตอบกลับที่มีข้อมูลได้รับอนุญาตเฉพาะสำหรับสถานะsuccessful (0)เท่านั้น เอนจินจึงปฏิเสธที่จะถือว่าการตอบกลับที่ถูกปฏิเสธเป็นผลลัพธ์ที่เชื่อถือได้ - หลักฐาน / การวินิจฉัย factory
SignatureException::nonSuccessfulOcspResponseStatus()สร้างข้อความนี้และระบุชื่อสถานะที่รายงาน เช่นtryLaterหรือinternalErrorไบต์สถานะที่สงวนไว้หรือไม่รู้จักจะสร้างSignatureException::reservedOcspResponseStatus()แทน - การแก้ไข
- ระบุสถานะในข้อความ สำหรับสถานะชั่วคราว เช่น
tryLaterให้ลองดึงข้อมูลการเพิกถอนอีกครั้งในภายหลัง - สำหรับ
unauthorizedหรือmalformedRequestให้ตรวจสอบ URL คำขอ OCSP และใบรับรองที่ผู้ตอบคาดหวัง - อย่าระงับความล้มเหลวในการได้มาซึ่งสิ่งประดิษฐ์ B-LT หรือ B-LTA; การยืนยันการเพิกถอนเป็นส่วนหนึ่งของระดับเหล่านั้น
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: รายการในห่วงโซ่ใบรับรองถอดรหัสไม่สำเร็จ
หัวข้อที่มีชื่อว่า “รายการ: รายการในห่วงโซ่ใบรับรองถอดรหัสไม่สำเร็จ”- อาการ
SignatureExceptionพร้อมส่วนท้ายfailed to base64-decode PEM body — input is not valid PEM - สาเหตุที่เป็นไปได้ รายการในห่วงโซ่ใบรับรองไม่ใช่ Privacy-Enhanced Mail (PEM) ที่ถูกต้อง โดยทั่วไปเกิดจากการตัดทอน อักขระแปลกปลอม หรือ blob ไบนารี Distinguished Encoding Rules (DER) ที่ส่งมาในตำแหน่งที่คาดว่าจะเป็น PEM
- หลักฐาน / การวินิจฉัย factory
SignatureException::pemDecodingFailed()สร้างข้อความนี้ระหว่างการประกอบห่วงโซ่ - การแก้ไข
- ตรวจสอบใบรับรองแต่ละรายการในห่วงโซ่เพื่อหาอักขระแปลกปลอมหรือการตัดทอน
- ส่งออกใบรับรองที่ได้รับผลกระทบใหม่ในรูปแบบ PEM
- รันการเรียกเซ็นใหม่อีกครั้ง
- ที่เกี่ยวข้อง การเข้ารหัสลับและสิทธิ์
รายการ: ชนิดของคีย์ส่วนตัวไม่ตรงกับอัลกอริทึม
หัวข้อที่มีชื่อว่า “รายการ: ชนิดของคีย์ส่วนตัวไม่ตรงกับอัลกอริทึม”- อาการ
SignatureExceptionพร้อมส่วนท้ายexpected private key of type "<x>" for the configured algorithm but got "<y>" - สาเหตุที่เป็นไปได้ คีย์ส่วนตัวที่โหลดมาไม่ตรงกับอัลกอริทึมลายเซ็นที่กำหนดค่าไว้ เช่น ใช้คีย์ Rivest-Shamir-Adleman (RSA) กับ Elliptic Curve Digital Signature Algorithm (ECDSA)
- หลักฐาน / การวินิจฉัย factory
SignatureException::unexpectedKeyType()สร้างข้อความนี้และระบุชื่อทั้งคลาสของคีย์ที่คาดหวังและที่เกิดขึ้นจริง - การแก้ไข
- ตรวจสอบว่าใบรับรองและคู่คีย์ตรงกับอัลกอริทึมที่เลือก
- เปลี่ยนการเลือกอัลกอริทึมให้ตรงกับคีย์ หรือโหลดคีย์ที่ตรงกับอัลกอริทึม
- รันการเรียกเซ็นอีกครั้ง
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: คีย์ Ed25519 หรือวัสดุลายเซ็นมีรูปแบบไม่ถูกต้อง
หัวข้อที่มีชื่อว่า “รายการ: คีย์ Ed25519 หรือวัสดุลายเซ็นมีรูปแบบไม่ถูกต้อง”- อาการ
SignatureExceptionพร้อมส่วนท้ายที่ระบุความยาว Ed25519 ไม่ตรงกัน — ตัวอย่างเช่นEd25519 signature length <n> ≠ expected 64 bytesหรือEd25519 round-trip self-verify failed - สาเหตุที่เป็นไปได้ บิลด์การเข้ารหัสลับขณะรันไทม์คืนวัสดุคีย์หรือลายเซ็นที่มีความยาวไม่ถูกต้อง หรือลายเซ็นที่เพิ่งสร้างขึ้นตรวจสอบกับคีย์สาธารณะของตัวเองไม่ผ่าน เอนจินอ้าง RFC 8032 §3.4 ในซอร์ส ซึ่งกำหนดลายเซ็น Ed25519 แบบแยกไว้ที่ 64 ไบต์ เอนจินจึงยกเลิกแทนที่จะปล่อยวัสดุที่ตรวจสอบตัวเองไม่ได้ออกไป
- หลักฐาน / การวินิจฉัย factory ที่เกี่ยวข้องคือ
SignatureException::ed25519SignatureMalformed(),::ed25519RoundTripVerifyFailed(),::ed25519KeyParseFailed(),::ed25519SeedInvalid(),::ed25519SecretKeyMalformed(), และ::ed25519PublicKeyInvalid()แต่ละตัวระบุชื่อความยาวที่สังเกตได้ - การแก้ไข
- ติดตั้งส่วนขยาย libsodium PHP ใหม่; บิลด์ที่ถูกตัดทอนหรือเสียหายเป็นสาเหตุที่บันทึกไว้ของวัสดุที่มีความยาวไม่ถูกต้อง
- ยืนยันว่าคีย์เป็นคีย์ Ed25519 และ OpenSSL เป็นเวอร์ชัน 1.1.1 หรือใหม่กว่า
- รันการเรียกเซ็นใหม่อีกครั้ง
- ที่เกี่ยวข้อง การอ้างอิง Exception
รายการ: ดิกชันนารีการประทับเวลาแบบจัดเก็บถาวรไม่ได้ถูกปล่อยออกมา
หัวข้อที่มีชื่อว่า “รายการ: ดิกชันนารีการประทับเวลาแบบจัดเก็บถาวรไม่ได้ถูกปล่อยออกมา”- อาการ
SignatureExceptionพร้อมส่วนท้ายno /Type /DocTimeStamp dictionary was emitted into the PDF buffer - สาเหตุที่เป็นไปได้ ลูปการจัดเก็บถาวร B-LTA ทำงานแล้ว แต่ดิกชันนารีการประทับเวลาเอกสารไม่เคยไปถึงบัฟเฟอร์ สิ่งประดิษฐ์จะเป็น B-LTA ที่เขียนไม่ครบ เอนจินจึงปฏิเสธที่จะคืนค่า
- หลักฐาน / การวินิจฉัย factory
SignatureException::documentTimestampNotEmitted()สร้างข้อความนี้ ความล้มเหลวของเงื่อนไขภายหลังนี้ถูกยกขึ้นตอนสรุปขั้นสุดท้าย - การแก้ไข
- ถือว่าเอาต์พุตถูกทิ้ง; อย่าจัดส่งสิ่งประดิษฐ์บางส่วน
- รันไปป์ไลน์ B-LTA อีกครั้งด้วยผู้ออกใบรับรองการประทับเวลาที่เข้าถึงได้
- หากความล้มเหลวเกิดซ้ำ ให้บันทึก
getContext()และ exception ก่อนหน้าที่เชื่อมโยงกันไว้สำหรับรายงานข้อบกพร่อง
- ที่เกี่ยวข้อง การอ้างอิง Exception
กรณีขอบและข้อควรระวัง
หัวข้อที่มีชื่อว่า “กรณีขอบและข้อควรระวัง”- factory เหล่านี้ตั้ง
cert_infoเป็นชื่อเจ้าของหรือลายนิ้วมือเฉพาะเมื่อมีข้อมูลดังกล่าว;cert_infoที่ว่างเปล่าเป็นสิ่งที่คาดหมายได้สำหรับความล้มเหลวด้านความสามารถและการกำหนดค่า - การร้องขอ B-LT หรือ B-LTA โดยไม่มีไคลเอนต์ Hypertext Transfer Protocol (HTTP) ที่กำหนดค่าไว้จะยก
SignatureException::httpClientMissing(); การดึงข้อมูลการเพิกถอนต้องมีไคลเอนต์ PHP Standards Recommendation (PSR)-18 ที่ส่งไปยัง orchestrator - ใบรับรองที่รองรับด้วย hardware security module (HSM) แต่ไม่มีการนำ signer ไปใช้จะยก
SignatureException::hsmSignerMissing(); เชื่อม signer เข้ากับใบรับรองก่อนการเซ็น
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”อภิธานศัพท์: ระดับ PAdES · การยืนยันการเพิกถอน