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

تخطيط مستويات الأساس في PAdES

التوقيعات الإلكترونية المتقدمة لملفات ⁨PDF⁩ (⁨PAdES⁩) هي عائلة ملفات التعريف المُوحَّدة في ⁨ETSI EN 319 142.⁩ وتُعرِّف أربعة مستويات مطابقة أساسية — ⁨B-B⁩ و⁨B-T⁩ و⁨B-LT⁩ و⁨B-LTA⁩ — يضيف فيها كل مستوى أعلى مادةً إلى المستوى الأدنى منه مباشرةً. تربط هذه الصفحة تلك المستويات بما يُنتجه ⁨NextPDF.⁩ كما تفصل سطح ⁨Core⁩ عن إصداري ⁨Pro⁩ و⁨Enterprise.⁩ هذا التخطيط سلوكي: فهو يصف ما يُصدِره المحرك، لا الفئات الداخلية.

الخلاصة: يُنتج ⁨NextPDF Core⁩ بنى توقيع متوافقة مع ⁨B-B⁩ و⁨B-T.⁩ ويُشحَن مسار إنتاج ⁨B-LT⁩ و⁨B-LTA⁩ في إصداري ⁨Pro⁩ و⁨Enterprise.⁩ أمّا قبول التوقيع المُنتَج بوصفه مطابقاً عند مستوى معين فيعتمد على المُتحقِّق ومراسي الثقة المُهيَّأة لديه. لا يستطيع المُنتِج تأكيد المطابقة نيابةً عن المُتحقِّق.

Terminal window
composer require nextpdf/core:^3

التوقيع الرقمي لملف ⁨PDF⁩ هو بنية ⁨CMS SignedData⁩ ضمن صيغة بناء جملة رسائل التشفير، تُخزَّن في مدخل Contents في قاموس التوقيع. تحدِّد مصفوفة ByteRange نطاقات البايتات التي يُغطِّيها الموجز — ⁨ISO 32000-2⁩ §12.8.1. يحمل ⁨CMS⁩ SignerInfo السمات الموقَّعة، ومنها سمتا ⁨content-type⁩ و⁨message-digest⁩ — ⁨RFC 5652⁩ §5.3. ويُحسَب موجز الرسالة على تلك السمات عبر عملية §5.4. يستخدم ⁨PAdES⁩ نموذج سمات التوقيعات الإلكترونية المتقدمة لـ⁨CMS⁩ (⁨CAdES⁩) داخل قاموس توقيع ⁨PDF.⁩

مستويات الأساس الأربعة تراكمية:

  • ⁨B-B⁩ يضم التوقيع الأساسي مع سماته الموقَّعة الإلزامية.
  • ⁨B-T⁩ يضيف سمة ختم زمني للتوقيع تُحسَب على قيمة التوقيع. تُثبِت سمة الختم الزمني أن التوقيع كان موجوداً عند اللحظة المختومة زمنياً — ⁨ETSI PAdES⁩ §5.4.3. وتُنتج سلطة الختم الزمني الرمز المميز وفق ⁨RFC 3161⁩ — ⁨RFC 3161⁩ §2.4.1.
  • ⁨B-LT⁩ يضيف مادة التحقق طويل الأمد — بيانات الشهادات، وبروتوكول حالة الشهادة عبر الإنترنت (⁨OCSP⁩)، وقائمة إبطال الشهادات (⁨CRL⁩) — الموضوعة في مخزن أمان المستند — ⁨ETSI PAdES⁩ §6.2.2، و⁨ISO 32000-2⁩ §12.8.4.3، وموضع بيانات التحقق كما يصفه ⁨ETSI EN 319 142-2⁩ §6.3.
  • ⁨B-LTA⁩ يضيف ختماً زمنياً أرشيفياً للمستند للحفاظ على الصلاحية عبر فترات طويلة — ⁨ETSI PAdES⁩ §6.2.2.

المستويات الأربعة تراكمية بشكل صارم — يحتفظ كل مستوى أعلى بكل ما يحمله المستوى الأدنى منه مباشرةً ويضيف طبقة مادة جديدة واحدة بالضبط. تُظهِر تسميات الانتقال إصدار المُنتِج الذي يوفّر كل خطوة.

+ RFC 3161 sig time-stamp

(Core / Enterprise
+ Document Security Store

(Enterprise only)
+ archive doc time-stamp

(Enterprise only)

B-B

CMS signature + signed attributes

B-T

+ signature time-stamp (over the signature value)

B-LT

+ DSS validation material (cert, OCSP, CRL)

B-LTA

+ archive document time-stamp (over the DSS)

;

not

Pro)

Diagram

استخدم تعداد SignatureLevel لاختيار مستوى. فهو يُعرِّف الحالات PAdES_B_B وPAdES_B_T وPAdES_B_LT وPAdES_B_LTA. تُبيِّن طرائقه requiresTimestamp() وrequiresDss() وrequiresDocumentTimestamp() وisAvailableInEnvironment() متطلبات كل مستوى وما إذا كان وقت التشغيل الحالي يستطيع تلبيتها. في توزيعة ⁨Core⁩، تُرجِع isAvailableInEnvironment() القيمة true لـ⁨B-B⁩ و⁨B-T⁩ والقيمة false لـ⁨B-LT⁩ و⁨B-LTA.⁩ وهي تُرجِع false لـ⁨B-LT⁩ و⁨B-LTA⁩ لأن مُنتِج التحقق طويل الأمد يُحَل في وقت التشغيل وليس جزءاً من الحزمة مفتوحة المصدر. استخدم في كود الإنتاج عقد SignerInterface بدلاً من هذه الأنواع الداخلية.

المستوىما يضيفه⁨Core⁩ (nextpdf/core)⁨Pro⁩ / ⁨Enterprise⁩
⁨B-B⁩التوقيع الأساسي مع السمات الموقَّعة الإلزاميةيُنتج بنيةً متوافقة؛ مُختبَرة على خطوط أساس ذهبية اصطناعيةالسطح نفسه
⁨B-T⁩ختم زمني للتوقيع على قيمة التوقيعيُنتج بنيةً متوافقة عند توفير خدمة ختم زمني وفق ⁨RFC 3161⁩السطح نفسه
⁨B-LT⁩بيانات التحقق في مخزن أمان المستندلا يُشحَن المُنتِج في ⁨Core⁩؛ اختيار ⁨B-LT⁩ دون حزمة ⁨Enterprise⁩ يفشل بأمانالمُنتِج مشحون
⁨B-LTA⁩ختم زمني أرشيفي للمستندلا يُشحَن المُنتِج في ⁨Core⁩؛ يفشل بأمان كما سبقالمُنتِج مشحون

يعني “يُنتج بنيةً متوافقة” أن ⁨NextPDF⁩ يُصدِر توقيعاً تتبع بنيتُه البنود المُستشهَد بها. وتتحقق مجموعات الاختبار في tests/Corpus/pades/ وtests/Golden/baselines/ من تلك البنية. ولا يعني ذلك أن مُتحقِّقاً خارجياً يُصادِق على المُخرَج عند ذلك المستوى. راجع قسم المطابقة.

مثال على الكود — بداية سريعة

قسم بعنوان «مثال على الكود — بداية سريعة»
examples/contracts/signing-quickstart.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Contracts\SignerInterface;
/**
* Sign a byte range with any SignerInterface implementation.
*
* @param SignerInterface $signer A Core or Premium signer.
* @param string $byteRange The PDF byte range to sign.
*
* @return string Hex-encoded CMS SignedData for the PDF /Contents field.
*/
function signByteRange(SignerInterface $signer, string $byteRange): string
{
return $signer->sign($byteRange)->toHex();
}

تعتمد الدالة على عقد SignerInterface لا على فئة ملموسة. ويُحقِّق هذا العقد كلٌّ من موقِّع ⁨Core⁩ البرمجي (⁨B-B⁩ أو ⁨B-T⁩) وموقِّع وحدة أمان عتادية (⁨HSM⁩) في إصدار ⁨Premium.⁩ لا يتغيّر كود المُستدعي عند تغيُّر الإصدار.

examples/contracts/signing-level.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Security\Signature\SignatureLevel;
/**
* Resolve the highest baseline level the current runtime can produce.
*
* B-B and B-T are produced by the Core distribution. B-LT and B-LTA
* require the Enterprise long-term-validation package; without it the
* level reports unavailable so callers fail closed rather than emit a
* structure that does not carry the validation material the level names.
*
* @return SignatureLevel The highest level available in this runtime.
*/
function highestAvailableLevel(): SignatureLevel
{
foreach ([
SignatureLevel::PAdES_B_LTA,
SignatureLevel::PAdES_B_LT,
SignatureLevel::PAdES_B_T,
SignatureLevel::PAdES_B_B,
] as $level) {
if ($level->isAvailableInEnvironment()) {
return $level;
}
}
return SignatureLevel::PAdES_B_B;
}

تُرجِع isAvailableInEnvironment() القيمة true لـ⁨B-B⁩ و⁨B-T⁩ دون حزمة إضافية. ولا تُرجِع true لـ⁨B-LT⁩ و⁨B-LTA⁩ إلا عند تثبيت حزمة التحقق طويل الأمد لإصدار ⁨Enterprise.⁩ إذا اخترت مستوى غير متاح دون تفعيل التراجع صراحةً، يطرح ⁨NextPDF⁩ استثناءً مُصنَّفاً لمستوى غير قابل للوصول، وتُسمِّي رسالة الاستثناء الحزمة المفقودة. وبذلك يفشل النشر ذو التهيئة الخاطئة بأمان بدلاً من إصدار مستوى أدنى مما طلبه المُستدعي بصمت.

  • التوقيع ⁨B-T⁩ من الناحية البنيوية لا يساوي توقيعاً جرى التحقق منه بوصفه ⁨B-T.⁩ يجري التحقق لدى المُتحقِّق اعتماداً على مراسي ثقته وحداثة بيانات الإبطال لديه. لا يستطيع المُنتِج تأكيد النتيجة.
  • يتطلّب المستويان ⁨PAdES B-LT⁩ و⁨B-LTA⁩ حزمة ⁨NextPDF Enterprise⁩ (nextpdf/enterprise). إذا لم تكن مُثبَّتة، يفشل الموقِّع بأمان ويكون ⁨B-LT/B-LTA⁩ غير متاحين. يُوفِّر ⁨Core⁩ المستويين ⁨B-B/B-T⁩ عبر NextPDF\Contracts\SignerInterface العام؛ ويبقى التحقق طويل الأمد خلف LtvManagerInterface. اختيار مستوى غير متاح في ⁨Core⁩ يفشل بأمان افتراضياً. يُسمِّي الاستثناء المُصنَّف الحزمة العامة المفقودة، لا نوعاً داخلياً. التدهور السلس إلى مستوى أدنى اختياري، وليس افتراضياً أبداً.
  • يجب أن يستثني موجز نطاق البايتات قيمة التوقيع. إذا غطّى الموجز أيضاً ثُمانيات Contents، فلن يَنجح التحقق أبداً — ⁨ISO 32000-2⁩ §12.8.1.
  • في ⁨B-T⁩، يكون الختم الزمني للتوقيع على قيمة التوقيع، لا على بايتات المستند. في ⁨B-LTA⁩، يكون الختم الزمني الأرشيفي ختماً زمنياً منفصلاً للمستند. وهما غير قابلين للتبادل — ⁨ETSI PAdES⁩ §5.4.3 و§6.2.2.
  • ⁨ETSI EN 319 142-1⁩ (جزء مستويات الأساس) ليس ضمن مجموعة أدلة هذا المشروع. تستند ادعاءات بنية المستويات هنا إلى ⁨ETSI EN 319 142-2⁩، ومستند ملف التعريف pades، و⁨ISO 32000-2⁩ §12.8، و⁨RFC 5652⁩ / ⁨RFC 3161.⁩ وتَرِد أسماء المستويات والبنية التراكمية بوصفها مُطبَّقة في ⁨v3.x.⁩ لا تدّعي هذه الصفحة أي نتيجة اختبار مطابقة أو إثبات من طرف ثالث.

تزداد التكلفة مع المستوى. ⁨B-B⁩ عملية توقيع واحدة تستغرق أعداداً أحادية الرقم من المللي ثانية لمفتاح برمجي. يضيف ⁨B-T⁩ رحلة شبكة واحدة ذهاباً وإياباً إلى سلطة الختم الزمني. ويضيف ⁨B-LT⁩ عملية جلب واحدة لبيانات الإبطال لكل شهادة في السلسلة. ويضيف ⁨B-LTA⁩ ختماً زمنياً إضافياً للمستند. تُغطِّي ميزانية زمن الجدار البالغة 1500 ⁨ms⁩ توقيع ⁨B-T⁩ واحداً مع سلطة ختم زمني بعيدة (⁨TSA⁩) عبر اتصال قائم مسبقاً. أما ⁨B-LT⁩ أو ⁨B-LTA⁩ مقابل نقطة نهاية إبطال بطيئة فيتجاوزانها وينبغي وضعهما خارج مسار الطلب. ملف إعادة الإنتاج هو structural، لا bitwise. يُضمِّن الختم الزمني لحظة التوقيع، لذلك تختلف عمليتا تشغيل في بايتات الختم الزمني بينما تظل بنية المستند متطابقة.

المستوى الذي يدّعيه التوقيع والمستوى الذي يجري التحقق منه عنده أمران مختلفان. تصف هذه الصفحة سطح المُنتِج فقط. يعتمد التحقق طويل الأمد على بيانات التحقق المُجمَّعة وقت التوقيع وعلى استمرار ثقة المُتحقِّق بالمراسي نفسها لاحقاً. لا يستطيع المُنتِج ضمان أيٍّ من الأمرين. وتعود الثقة بالختم الزمني إلى الثقة بسلطة الختم الزمني، التي يضبطها النشر عبر مُزوِّد قابل للحقن. هذه الصفحة مُعلَّمة بـexport_control_class: legal-review-required لأنها تتعلّق بملفات تعريف لتوقيعات تشفيرية. جميع المصادر المعيارية مُعاد صياغتها، ولا يُعاد إنتاج أيٍّ منها، حفاظاً على سلامة الاستشهاد.

الادعاءالمعيارالبندالدليل
تُخزَّن قيمة التوقيع مُرمَّزة بـ⁨DER⁩ بوصفها ⁨CMS SignedData⁩ أو ⁨TimeStampToken⁩ في مدخل Contents في قاموس التوقيع.⁨ISO 32000-2⁩§12.8.1
يُحسَب الموجز على نطاقات ByteRange ويستثني قيمة التوقيع.⁨ISO 32000-2⁩§12.8.1
تُحسَب سمة الختم الزمني للتوقيع على قيمة التوقيع (⁨B-T⁩).⁨ETSI PAdES⁩ (⁨EN 319 142⁩)§5.4.3
تُحمَل مواد التحقق طويل الأمد في مخزن أمان المستند (⁨B-LT⁩).⁨ETSI PAdES⁩ (⁨EN 319 142⁩) / ⁨ISO 32000-2⁩§6.2.2 / §12.8.4.3،
تُوضَع بيانات التحقق في قاموسَي ⁨DSS⁩ و⁨VRI.⁩⁨ETSI EN 319 142-2⁩§6.3،
يحافظ الختم الزمني الأرشيفي للمستند على الصلاحية عبر فترات طويلة (⁨B-LTA⁩).⁨ETSI PAdES⁩ (⁨EN 319 142⁩)§6.2.2
يحمل ⁨SignerInfo⁩ سمتي ⁨content-type⁩ و⁨message-digest⁩ الموقَّعتين.⁨RFC 5652⁩§5.3
يُحسَب موجز الرسالة على السمات الموقَّعة المُرمَّزة بـ⁨DER⁩ (عملية §5.4).⁨RFC 5652⁩§5.4
يُطلَب الختم الزمني من ⁨RFC 3161 TSA⁩ ويُرجِع بنية ⁨TSTInfo.⁩⁨RFC 3161⁩§2.4.1

جميع البنود مُعاد صياغتها. لا يُعيد ⁨NextPDF⁩ إنتاج النص المعياري. راجع المعايير المنشورة للحصول على الصياغة المُعتمَدة. ⁨ETSI EN 319 142-1⁩ ليس ضمن مجموعة الأدلة. تستند الادعاءات البنيوية حول مستويات الأساس إلى المصادر أعلاه، وهي مذكورة بوصفها مُطبَّقة في ⁨v3.x.⁩

يُنتج ⁨Core⁩ بنى توقيع ⁨B-B⁩ و⁨B-T.⁩ ويتوفر مسار إنتاج ⁨B-LT⁩ و⁨B-LTA⁩، وحفظ مفاتيح ⁨HSM⁩ و⁨PKCS⁩#11، وملف سياسة التشفير ⁨FIPS 140-3⁩ في إصداري ⁨Pro⁩ و⁨Enterprise.⁩ يَحُل ⁨Core⁩ مُنتِج التحقق طويل الأمد في وقت التشغيل، لذلك لا يحمل المحرك مفتوح المصدر أي تبعية تجارية. لا تتغيّر واجهة برمجة تطبيقات SignerInterface عند الترقية.