استكشاف أخطاء التوقيع والطابع الزمني وإصلاحها
النطاق
قسم بعنوان «النطاق»تغطي هذه الصفحة إخفاقات التوقيع التي يُطلقها NextPDF\Exception\SignatureException وNextPDF\Security\Signature\Exception\SignatureLevelUnreachableException. يذكر كل مدخل طريقة المصنع أو الفئة باسمها الدقيق، حتى تتمكن من تأكيد السبب من الرسالة ومن 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. - الدليل / التشخيص. يُنتج المصنع
SignatureException::ltvCapabilityMissing()هذه الرسالة بالضبط. يُعيدgetContext()الحقلsignature_levelمضبوطًا على المستوى الذي حاولته. - الحلّ.
- ثبّت المزوّد بتشغيل
composer require nextpdf/enterprise. - شغّل استدعاء التوقيع مرة أخرى.
- إذا تعذّر عليك تثبيت المزوّد، فاطلب
B-BأوB-Tبدلًا من ذلك؛ فحزمة core تستطيع إنتاجهما.
- ثبّت المزوّد بتشغيل
- ذات صلة. مرجع الاستثناءات.
مدخل: مستوى التوقيع غير قابل للبلوغ ويُرفض الاستدعاء
قسم بعنوان «مدخل: مستوى التوقيع غير قابل للبلوغ ويُرفض الاستدعاء»- العَرَض.
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 إلى عميل هيئة طابع زمني، وليس لدى المنسّق أي عميل منها.
- الدليل / التشخيص. يُنتج المصنع
SignatureException::tsaRequired()هذه الرسالة؛ ويحملgetContext()الحقلsignature_levelالذي جرت محاولته. - الحلّ.
- اضبط عميل هيئة طابع زمني ومرّره إلى المنسّق.
- أعد تشغيل الاستدعاء.
- لإنتاج مستوى لا يحتاج إلى طابع زمني، اطلب
B-B.
- ذات صلة. مرجع الاستثناءات.
مدخل: عنوان URL لنقطة نهاية هيئة الطابع الزمني فارغ
قسم بعنوان «مدخل: عنوان URL لنقطة نهاية هيئة الطابع الزمني فارغ»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءTSA endpoint URL is empty. - السبب المُرجَّح. أُنشئ عميل هيئة الطابع الزمني بعنوان URL فارغ لنقطة النهاية.
- الدليل / التشخيص. يُنتج المصنع
SignatureException::tsaUrlEmpty()هذه الرسالة. هذا عيب في الإعداد، وليس إخفاقًا في الشبكة. - الحلّ.
- عيّن عنوان URL غير فارغ لنقطة النهاية في عميل هيئة الطابع الزمني، مثل
https://timestamp.example.com/tsa. - إذا كان المستوى المطلوب لا يتطلب الطابع الزمني، فأزِل ربط عميل هيئة الطابع الزمني بدلًا من ذلك.
- شغّل الاستدعاء مرة أخرى.
- عيّن عنوان URL غير فارغ لنقطة النهاية في عميل هيئة الطابع الزمني، مثل
- ذات صلة. مرجع الاستثناءات.
مدخل: العنصر النائب للتوقيع مفقود من المخزن المؤقت
قسم بعنوان «مدخل: العنصر النائب للتوقيع مفقود من المخزن المؤقت»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءno /Contents <…> field found in PDF buffer (signature placeholder missing). - السبب المُرجَّح. تلقّت مرحلة التوقيع مخزنًا مؤقتًا من دون حاوية توقيع محجوزة، فلم يعد لديها مكان لكتابة التوقيع.
- الدليل / التشخيص. يُنتج المصنع
SignatureException::signatureContentsNotFound()هذه الرسالة. - الحلّ.
- تأكّد من كتابة حقل التوقيع وعنصره النائب قبل تشغيل مرحلة التوقيع.
- أعد تشغيل خط الأنابيب حتى يكون العنصر النائب موجودًا عند بدء التوقيع.
- ذات صلة. مرجع الاستثناءات.
مدخل: حالة الإلغاء غير معروفة (رفض مُجيب OCSP)
قسم بعنوان «مدخل: حالة الإلغاء غير معروفة (رفض مُجيب OCSP)»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءOCSP responder returned non-successful OCSPResponseStatus "<status>". - السبب المُرجَّح. لم يُعِد مُجيب بروتوكول حالة الشهادة عبر الإنترنت (OCSP) حالة
successful، فلم يُنتِج أي تأكيد إلغاء. يتّبع المحرك RFC 6960 §4.2.1، كما يرد في المصدر: لا يُسمح بجسم استجابة مملوء إلا لحالةsuccessful (0). يرفض المحرك التعامل مع استجابة مرفوضة بوصفها نتيجة ثقة موجبة. - الدليل / التشخيص. يُنتج المصنع
SignatureException::nonSuccessfulOcspResponseStatus()هذه الرسالة ويُسمّي الحالة المُبلَّغ عنها، مثلtryLaterأوinternalError. أما بايت حالة محجوز أو غير معروف، فيُنتج بدلًا من ذلكSignatureException::reservedOcspResponseStatus(). - الحلّ.
- حدّد الحالة في الرسالة. بالنسبة إلى حالة عابرة مثل
tryLater، أعد محاولة جلب الإلغاء لاحقًا. - بالنسبة إلى
unauthorizedأوmalformedRequest، تحقّق من عنوان URL لطلب OCSP ومن الشهادة التي يتوقّعها المُجيب. - لا تُخفِ إخفاق الحصول على مُنتَج B-LT أو B-LTA؛ فتأكيد الإلغاء جزء من ذلك المستوى.
- حدّد الحالة في الرسالة. بالنسبة إلى حالة عابرة مثل
- ذات صلة. مرجع الاستثناءات.
مدخل: تعذّر فكّ ترميز عنصر في سلسلة الشهادات
قسم بعنوان «مدخل: تعذّر فكّ ترميز عنصر في سلسلة الشهادات»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءfailed to base64-decode PEM body — input is not valid PEM. - السبب المُرجَّح. عنصر في سلسلة الشهادات ليس بريدًا مُعزَّز الخصوصية (PEM) صالحًا، وغالبًا يكون ذلك بسبب الاقتطاع، أو محرف دخيل، أو كتلة قواعد الترميز المميِّز (DER) ثنائية قُدّمت في موضع كان يُتوقَّع فيه PEM.
- الدليل / التشخيص. يُنتج المصنع
SignatureException::pemDecodingFailed()هذه الرسالة أثناء تجميع السلسلة. - الحلّ.
- افحص كل شهادة في السلسلة بحثًا عن محارف دخيلة أو اقتطاع.
- أعد تصدير الشهادة المتأثرة بصيغة PEM.
- أعد تشغيل استدعاء التوقيع.
- ذات صلة. التشفير والأذونات.
مدخل: نوع المفتاح الخاص لا يطابق الخوارزمية
قسم بعنوان «مدخل: نوع المفتاح الخاص لا يطابق الخوارزمية»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءexpected private key of type "<x>" for the configured algorithm but got "<y>". - السبب المُرجَّح. المفتاح الخاص المُحمَّل لا يطابق خوارزمية التوقيع المُهيّأة، مثل مفتاح ريفست-شامير-أدلمان (RSA) عند تحديد خوارزمية التوقيع الرقمي بالمنحنى الإهليلجي (ECDSA).
- الدليل / التشخيص. يُنتج المصنع
SignatureException::unexpectedKeyType()هذه الرسالة ويُسمّي كلًّا من فئة المفتاح المتوقَّعة والفعلية. - الحلّ.
- تحقّق من أن الشهادة وزوج المفتاح يطابقان الخوارزمية التي اخترتها.
- غيّر تحديد الخوارزمية ليتطابق مع المفتاح، أو حمّل المفتاح الذي يطابق الخوارزمية.
- شغّل استدعاء التوقيع مرة أخرى.
- ذات صلة. مرجع الاستثناءات.
مدخل: مادة مفتاح أو توقيع Ed25519 مُشوَّهة
قسم بعنوان «مدخل: مادة مفتاح أو توقيع Ed25519 مُشوَّهة»- العَرَض.
SignatureExceptionوتتضمن نهاية الرسالة عدم تطابق في طول Ed25519 — على سبيل المثالEd25519 signature length <n> ≠ expected 64 bytes، أوEd25519 round-trip self-verify failed. - السبب المُرجَّح. أرجعت بنية التشفير في وقت التشغيل مادة مفتاح أو توقيعًا بطول خاطئ، أو فشل التحقق من توقيع مُنتَج حديثًا مقابل مفتاحه العام نفسه. يستشهد المحرك بـRFC 8032 §3.4 في المصدر، الذي يحدد توقيع Ed25519 المنفصل عند 64 بايت. يُجهض المحرك بدلًا من إصدار مادة لا يستطيع التحقق منها ذاتيًا.
- الدليل / التشخيص. المصانع ذات الصلة هي
SignatureException::ed25519SignatureMalformed()و::ed25519RoundTripVerifyFailed()و::ed25519KeyParseFailed()و::ed25519SeedInvalid()و::ed25519SecretKeyMalformed()و::ed25519PublicKeyInvalid(). ويُسمّي كلٌّ منها الطول المُلاحَظ. - الحلّ.
- أعد تثبيت امتداد libsodium لـPHP؛ فالبناء المُجرَّد أو التالف هو السبب المُوثَّق لمادة الطول الخاطئ.
- تأكّد من أن المفتاح من نوع Ed25519 وأن OpenSSL بإصدار 1.1.1 أو أحدث.
- أعد تشغيل استدعاء التوقيع.
- ذات صلة. مرجع الاستثناءات.
مدخل: لم يُصدَر قاموس الطابع الزمني للأرشفة
قسم بعنوان «مدخل: لم يُصدَر قاموس الطابع الزمني للأرشفة»- العَرَض.
SignatureExceptionوتنتهي الرسالة بالجزءno /Type /DocTimeStamp dictionary was emitted into the PDF buffer. - السبب المُرجَّح. اشتغلت حلقة الأرشفة B-LTA، لكن قاموس طابع المستند الزمني لم يصل قطّ إلى المخزن المؤقت. سيكون مُنتَج B-LTA مكتوبًا جزئيًا، لذا يرفض المحرك إعادته.
- الدليل / التشخيص. يُنتج المصنع
SignatureException::documentTimestampNotEmitted()هذه الرسالة. ينشأ هذا الإخفاق من شرط لاحق وقت الإنهاء. - الحلّ.
- تعامَل مع الخرج بوصفه مُلغًى؛ لا تسلّم المُنتَج الجزئي.
- أعد تشغيل خط أنابيب B-LTA مع هيئة طابع زمني قابلة للبلوغ.
- إذا تكرّر الإخفاق، فالتقط
getContext()والاستثناء السابق المُتسلسل لإعداد تقرير عيب.
- ذات صلة. مرجع الاستثناءات.
الحالات الحدّية والمزالق
قسم بعنوان «الحالات الحدّية والمزالق»- تضبط هذه المصانع
cert_infoعلى الموضوع أو البصمة عند توفّر أحدهما فقط؛ ويُتوقَّع أن يكونcert_infoفارغًا لإخفاقات القدرة والإعداد. - يُطلق طلب B-LT أو B-LTA من دون عميل بروتوكول نقل النص التشعّبي (HTTP) مُهيّأ الاستثناء
SignatureException::httpClientMissing()؛ فجلب الإلغاء يحتاج إلى عميل متوافق مع توصية معيار PHP (PSR)-18 ومُمرَّر إلى المنسّق. - تؤدي شهادة مدعومة بوحدة أمان عتادية (HSM) من دون تنفيذ مُوقِّع إلى إطلاق الاستثناء
SignatureException::hsmSignerMissing()؛ صِل المُوقِّع بالشهادة قبل التوقيع.
انظر أيضًا
قسم بعنوان «انظر أيضًا»المسرد: مستوى PAdES · تأكيد الإلغاء