تخطَّ إلى المحتوى

سير عمل الاتفاقيات الموقَّعة

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).
  • كن دقيقاً بشأن الربط. في واجهته عالية المستوى، يُبقي NextPDF Document::setSignature() سطح واجهة البرمجة العامة مُجمَّداً، لكنه يفشل سريعاً بدلاً من إخراج ملف غير موقَّع. المسار المربوط فعلياً هو المنسِّق الأدنى مستوى. وهذه الصفحة لا تدّعي خلاف ذلك.

يفصل ⁨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 يضيف طوابع زمنية للمستند بحيث يمكن تمديد سلسلة الثقة إلى أجل غير مسمى بإعادة الختم قبل انقضاء كل شهادة طابع زمني. يعرف التعداد أي المستويات يستلزم طابعاً زمنياً وأيها يستلزم مادة تحقق مُضمَّنة، فيتمكن المحرك من رفض تركيبة مستحيلة بدلاً من إنتاج ملف “موقَّع” على نحو مُضلِّل.

التدرج مدعوم بمعيار. Evidence: Standard-backed Spec: ETSI EN 319 142-2, §5.1 يصف مستويات PAdES المُبنية على لبنات ⁨EN 319 142-1⁩، بدءاً من توقيع أساسي مُضمَّن صعوداً. البنية طويلة الأمد مُثبَّتة بواسطة Spec: ISO 32000-2:2020, §12.8 : يستند التحقق طويل الأمد إلى مخزن أمان المستند وقاموس طابع زمني للمستند مكتوبَين داخل الملف.

نموذج المستوى مدعوم بالشيفرة. Evidence: Code-backed يحتوي تعداد SignatureLevel على حالات PAdES الأربع (B-B، B-T، B-LT، B-LTA) مع توابع مُسنِدة لـ”يستلزم طابعاً زمنياً” و”يستلزم مادة تحقق مُضمَّنة” و”يستلزم طوابع زمنية للمستند”. إن الواجهة عالية المستوى Document::setSignature() مربوطة بحارس فشل سريع يثير تشخيصاً حاجباً قابلاً للتنفيذ بدلاً من إخراج مستند غير موقَّع — سلوك قابل للتحقق، لا ادعاء.

سلوك الصيانة طويلة الأمد موثَّق على مستوى القدرة لفئة ⁨Premium⁩: يكتب سطح الأرشفة الـ⁨DSS⁩ والـ⁨VRI⁩ لكل توقيع، ويفحص اكتمال الأرشفة عبر تحقق صحي، ويُعيد الختم بطابع زمني للمستند قبل انتهاء صلاحية شهادة الطابع الزمني. وتنص الوثائق صراحةً على أن المُتحقِّق هو من يقرِّر في النهاية.

يوضح هذا المثال القرار — اختيار الالتزام — باستخدام التعداد الحقيقي. أما مسار التوقيع المربوط فهو المنسِّق الأدنى مستوى. ولا يُعرض الاستدعاء عالي المستوى إلا لإيضاح سلوك الفشل السريع.

<?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 غير موقَّع بدلاً من موقَّع. المسار المربوط هو المنسِّق الأدنى مستوى ذو الطورين.
  • صيانة التحقق طويل الأمد (⁨DSS/VRI⁩، والتحقق الصحي، وحلقة الطابع الزمني الأرشيفي) قدرة من فئة ⁨Premium.⁩ لا توفّر ⁨Core⁩ حلقة الأرشفة. انظر التخم أدناه.
  • يحمي التوقيع تحديداً نطاق بايتاته. المراجعات المُلحقة لاحقاً منفصلة. لا يمدِّد المحرك التغطية بأثر رجعي.
  • يُنتج ⁨NextPDF⁩ البِنى ويصونها؛ وهو لا يفصل في النزاع. أما كون التوقيع موثوقاً فيتوقف على مراسي ثقة المُتحقِّق وسياسته، وهي خارج المحرك.
  • ⁨B-LTA⁩ لا يجعل التوقيع أبدياً بذاته. إنه يتيح صلاحية غير محدودة المدة فقط إذا جرت حلقة إعادة الختم وفق جدول قبل انتهاء صلاحية كل شهادة طابع زمني.
  • هذه الصفحة تتناول السلوك فيما يخص سطح الأرشفة في ⁨Premium.⁩ وهي لا تؤكد قبولاً من أي محكمة أو سلطة بعينها.
PAdES signing and long-term validity — edition availability
Edition Availability
Core

تكشف Core تعداد SignatureLevel وسطح Document::setSignature() المُجمَّد (فشل سريع). المنسِّق الأدنى مستوى المربوط يغطي التوقيع الأساسي. أما صيانة الأرشفة طويلة الأمد فهي ليست في ⁨Core.⁩

Pro

التوقيع الأساسي بـPAdES (B-B / B-T) عبر المنسِّق متاح.

Enterprise

يضيف B-LT / B-LTA، ومخزن أمان المستند وصيانة الـVRI لكل توقيع والتحقق الصحي لـ⁨LTV⁩، وحلقة الأرشفة بالطابع الزمني للمستند من أجل صلاحية غير محدودة المدة.

  • ملفات PAdES الأساسيةB-B، B-T، B-LT، B-LTA مشروحة كتدرج ومعيار للاختيار.
  • التحقق طويل الأمد — لماذا قد يفشل بعد عشر سنوات توقيع يتحقق اليوم، وكيف يُضمِّن ⁨LTV⁩ الدليل.
  • دليل قرار التكامل — أي حزمة من المنظومة تناسب سير عمل التوقيع، بما في ذلك وصلة الموافقة البشرية في ⁨NextPDF Connect.⁩
  • PAdES — التواقيع الإلكترونية المتقدمة لـPDF: عائلة ملفات ETSI التي تحدِّد كيفية حمل توقيع إلكتروني متقدم في ملف PDF.
  • نطاق البايتات — الامتداد المتصل من بايتات الملف الذي يُحسب عليه التوقيع؛ ما خرج عنه لا يحميه ذلك التوقيع.
  • مستوى التوقيع (B-B / B-T / B-LT / B-LTA) — تدرج PAdES: مَن وقَّع، ومتى، ومع مادة تحقق مُضمَّنة، وقابل لإعادة الختم لصلاحية أرشيفية غير محدودة المدة.
  • TSA — سلطة الطوابع الزمنية: خدمة RFC 3161 تؤكد أن حالة مستند وُجدت في لحظة UTC معطاة.
  • ⁨DSS⁩ (مخزن أمان المستند) — المخزن داخل الملف للشهادات واستجابات ⁨OCSP⁩ وقوائم ⁨CRL⁩ اللازمة للتحقق من توقيع بعد انتهاء صلاحية شهادته.
  • ⁨LTV⁩ (التحقق طويل الأمد) — إبقاء التوقيع قابلاً للتحقق عبر الزمن بتضمين دليل التحقق وإعادة ختمه.
  • الفشل السريع — رفض إنتاج مُنتَج مُضلِّل وإثارة خطأ قابل للتنفيذ بدلاً منه، عوضاً عن إخراج ملف خاطئ بصمت.