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

Pro الإصدار

التوقيع عبر Cloud KMS — مرجع متعمّق

تُمثّل هذه الصفحة المرجع على مستوى العقد لواجهة التوقيع عبر ⁨cloud-KMS⁩ في ⁨NextPDF Pro⁩. تتكوّن هذه الواجهة من واجهة موفّر خدمة واحدة، ⁨NextPDF\Pro\Security\Signing\Kms\KmsSignerInterface⁩، وثلاثة موقّعات لموفّري الخدمة: ⁨AwsKmsSigner⁩ و⁨AzureKeyVaultSigner⁩ و⁨GcpKmsSigner⁩. ويربط محوّلان اثنان، ⁨AwsKmsSigningStrategy⁩ و⁨AzureKeyVaultSigningStrategy⁩، الموقّع بعقد ⁨SigningStrategy⁩ في ⁨Pro⁩. ويُرسل كل موقّع ملخّص رسالة فقط إلى موفّر خدمته عبر ⁨PSR-18 HTTP⁩. ولا يعبر المفتاح الخاص ولا المستند هذا الحد أبدًا. وتُوضّح هذه الصفحة واجهة ⁨API⁩ العامة، وعقد السلوك القابل للملاحظة، وأنماط الإخفاق المُصنّفة. أما تنظيم الجلسات (⁨RemoteSigningSession⁩، ⁨SequentialSigner⁩) والختم الزمني (⁨PadesBtTimestamper⁩) فموجودان في صفحاتهما الخاصة.

تُشحن هذه القدرة ضمن ⁨NextPDF Pro⁩ (⁨nextpdf/pro⁩) وتُفعَّل بحزمة ترخيص من فئة ⁨Pro⁩. ولا يُحمّل أي نشر لا يملك ذلك الاستحقاق أصنافَ القدرة. قارن الإصدارات واحصل على ترخيص.

الرمزالمعاملاتالسلوك الافتراضيالقيمة المُعادةيرمي أو يُخفق بـملاحظات
KmsSignerInterfaceيُوسّع عقد ⁨HsmSignerInterface⁩ في ⁨Core⁩واجهة ⁨SPI⁩ لمُشغّلات ⁨KMS⁩ و⁨HSM⁩؛ المعرّفات المدمجة المحجوزة: ⁨aws-kms⁩، ⁨azure-keyvault⁩، ⁨gcp-kms⁩، ⁨pkcs11⁩، ⁨openssl-cli
KmsSignerInterface::providerId()لا شيءمفتاح بحث ثابت في السجلّnon-empty-stringيجب على مُشغّلات الأطراف الخارجية وضع مُعرّفها في مساحة اسم خاصة
KmsSignerInterface::signWithVersion()$data, $algorithm = 'sha256WithRSAEncryption', $keyVersion = nullيعود إصدار المفتاح ⁨null⁩ إلى الإعداد الافتراضي لموفّر الخدمةstring⁩ ثمانيّات التوقيع: ⁨RSA⁩ كما يُعيدها موفّر الخدمة (تُوضع مباشرةً في ⁨SignerInfo.signature⁩)، و⁨ECDSA⁩ بصيغة ⁨DER⁩ ⁨ECDSA-Sig-Value⁩ وفق قواعد ⁨CMS⁩KeyManagementException, UnsupportedAlgorithmException, SignatureFailedExceptionتختلف دلالات ⁨null⁩ حسب موفّر الخدمة؛ راجع عقد السلوك
KmsSignerInterface::supportsAlgorithm()string $algorithmفحص قدرة؛ لا يُجري أي عمليات ⁨I/O⁩boolيُستدعى قبل اختيار موفّر الخدمة
KmsSignerInterface::supportedAlgorithms()لا شيءيُدرج الأسماء بنمط ⁨OpenSSL⁩ التي يقبلها موفّر الخدمةlist<non-empty-string>
AwsKmsSignerالباني: ⁨AwsKmsConfig⁩، شهادة ⁨DER⁩، سلسلة ⁨DER⁩، عميل ⁨PSR-18⁩، مصانع ⁨PSR-17⁩، مُسجّل ⁨PSR-3⁩الخوارزمية الافتراضية هي ⁨KmsSigningAlgorithm::RsaPkcs1Sha256راجع التوابعfinal⁩؛ ⁨PROVIDER_ID = 'aws-kms'
AwsKmsSigner::create()مُعرّف المفتاح، شهادة ⁨DER⁩، تبعيّات ⁨PSR⁩، سلسلة اختيارية، إعداد، مُسجّليبني ⁨AwsKmsConfig::fromEnvironment($keyId)⁩ عندما يكون ⁨$config⁩ يساوي ⁨nullselfيقرأ متغيّرات البيئة القياسية ⁨AWS_*
AwsKmsSigner::withAlgorithm()KmsSigningAlgorithm $algorithmيُعيد نسخة معدّلةselfيجب أن يطابق نوع المفتاح المُهيّأ في ⁨AWS KMS⁩
AwsKmsSigner::sign()$data, $algorithm = 'sha256WithRSAEncryption'يُفوّض إلى ⁨signWithVersion($data, $algorithm, null)stringكما في ⁨signWithVersion()مسار عقد ⁨Core⁩ القديم ثنائي الوسائط
AzureKeyVaultSignerالباني: ⁨AzureKeyVaultConfig⁩، شهادة ⁨DER⁩، سلسلة ⁨DER⁩، عميل ⁨PSR-18⁩، مصانع ⁨PSR-17⁩، مُسجّل ⁨PSR-3⁩الخوارزمية الافتراضية هي ⁨AzureSigningAlgorithm::Rs256⁩؛ ورمز وصول في الإعداد يُمهّد رمز الحامل ⁨bearer⁩راجع التوابعfinal⁩؛ ⁨PROVIDER_ID = 'azure-keyvault'
AzureKeyVaultSigner::create()اسم الخزنة، اسم المفتاح، شهادة ⁨DER⁩، تبعيّات ⁨PSR⁩، سلسلة اختيارية، إعداد، مُسجّليبني ⁨AzureKeyVaultConfig::fromEnvironment()⁩ عندما يكون ⁨$config⁩ يساوي ⁨nullselfيدعم رمزًا مُحصّلًا مسبقًا أو بيانات اعتماد كيان الخدمة (service-principal)
AzureKeyVaultSigner::withAlgorithm()AzureSigningAlgorithm $algorithmيُعيد نسخة معدّلةselfمفاتيح ⁨RSA⁩ تستخدم قيم ⁨RS/PS⁩؛ ومفاتيح ⁨EC⁩ تستخدم قيم ⁨ES⁩
GcpKmsSignerالباني: ⁨GcpKmsConfig⁩، شهادة ⁨DER⁩، سلسلة ⁨DER⁩، عميل ⁨PSR-18⁩، مصانع ⁨PSR-17⁩، مُسجّل ⁨PSR-3⁩الخوارزمية الافتراضية هي ⁨GcpKmsSigningAlgorithm::RsaSignPkcs1_2048Sha256راجع التوابعfinal⁩؛ ⁨PROVIDER_ID = 'gcp-kms'⁩، ⁨API_VERSION = 'v1'
GcpKmsSigner::create()مُعرّف المشروع، الموقع، حلقة المفاتيح، مفتاح التعمية، شهادة ⁨DER⁩، تبعيّات ⁨PSR⁩، سلسلة اختيارية، إعداد، مُسجّليبني ⁨GcpKmsConfig::fromEnvironment()⁩ عندما يكون ⁨$config⁩ يساوي ⁨nullselfيُفوَّض الحصول على رمز الحامل إلى المُستدعي
GcpKmsSigner::withAlgorithm()GcpKmsSigningAlgorithm $algorithmمعاينة وقت الإعداد فقط؛ واسم السلك لكل استدعاء هو الحاسم وقت التوقيعselfحجم المفتاح مُثبَّت بواسطة ⁨CryptoKeyVersion⁩ المُهيّأ
AwsKmsSigningStrategyالباني: AwsKmsSigner $signerمتزامن؛ ⁨isAsync()⁩ يُعيد ⁨falseيُمرّر استثناءات الموقّع المُغلَّفمحوّل لـ ⁨RemoteSigningSession::complete()
AzureKeyVaultSigningStrategyالباني: AzureKeyVaultSigner $signerمتزامن؛ ⁨isAsync()⁩ يُعيد ⁨falseيُمرّر استثناءات الموقّع المُغلَّفمحوّل لـ ⁨RemoteSigningSession::complete()
KmsSigningAlgorithmتعداد، 9 حالات (⁨RSA PKCS#1⁩، ⁨RSA-PSS⁩، ⁨ECDSA⁩؛ ⁨SHA-256/384/512⁩)قيم سلك ⁨SigningAlgorithm⁩ في ⁨AWS KMS⁩InvalidArgumentException⁩ من ⁨fromOpenSslName()resolveForWireName()⁩ يحافظ على ملخّص ⁨PSS⁩ المُهيّأ
AzureSigningAlgorithmتعداد، 9 حالات (⁨RS256⁩…⁨ES512⁩)قيم بنمط ⁨JWA⁩ في ⁨Azure Key Vault⁩InvalidArgumentException⁩ من ⁨fromOpenSslName()isEcdsa()⁩ يُعلّم القيم التي يحتاج ناتجها تحويلًا إلى ⁨DER⁩
GcpKmsSigningAlgorithmتعداد، 10 حالات (⁨EC P-256/P-384⁩، ⁨RSA PKCS#1⁩، ⁨RSA-PSS⁩)قيم خوارزمية ⁨CryptoKeyVersion⁩ في ⁨GCP⁩UnsupportedAlgorithmException⁩ من ⁨fromOpenSslName()يختار تحليل اسم السلك أصغر حجم مفتاح مطابق
public function providerId(): string;
public function signWithVersion(
string $data,
string $algorithm = 'sha256WithRSAEncryption',
?string $keyVersion = null,
): string;
public function supportsAlgorithm(string $algorithm): bool;
public function supportedAlgorithms(): array;
public static function create(
string $keyId,
string $certDer,
ClientInterface $httpClient,
RequestFactoryInterface $requestFactory,
StreamFactoryInterface $streamFactory,
array $chainDer = [],
?AwsKmsConfig $config = null,
?LoggerInterface $logger = null,
): self
public function withAlgorithm(KmsSigningAlgorithm $algorithm): self
public function sign(string $data, string $algorithm = 'sha256WithRSAEncryption'): string
public static function create(
string $vaultName,
string $keyName,
string $certDer,
ClientInterface $httpClient,
RequestFactoryInterface $requestFactory,
StreamFactoryInterface $streamFactory,
array $chainDer = [],
?AzureKeyVaultConfig $config = null,
?LoggerInterface $logger = null,
): self
public function withAlgorithm(AzureSigningAlgorithm $algorithm): self
public static function create(
string $projectId,
string $location,
string $keyRing,
string $cryptoKey,
string $certDer,
ClientInterface $httpClient,
RequestFactoryInterface $requestFactory,
StreamFactoryInterface $streamFactory,
array $chainDer = [],
?GcpKmsConfig $config = null,
?LoggerInterface $logger = null,
): self
public function withAlgorithm(GcpKmsSigningAlgorithm $algorithm): self
public function __construct(
private AwsKmsSigner $signer,
) {}
public function sign(string $signedAttributesDer): string
public function __construct(
private AzureKeyVaultSigner $signer,
) {}
public function sign(string $signedAttributesDer): string

يُوسّع ⁨KmsSignerInterface⁩ عقد ⁨HsmSignerInterface⁩ في ⁨Core⁩. ويُضيف ⁨providerId()⁩، و⁨signWithVersion()⁩ المُدرك لإصدار المفتاح، وفحصَي القدرة ⁨supportsAlgorithm()⁩ و⁨supportedAlgorithms()⁩. ويُفوّض التابع الموروث ⁨sign()⁩ ثنائي الوسائط إلى ⁨signWithVersion()⁩ بإصدار مفتاح ⁨null⁩ في الموقّعات الثلاثة جميعها. وتُنفَّذ ⁨getCertificateDer()⁩ و⁨getCertificateChainDer()⁩ و⁨getPublicKeyAlgorithm()⁩ من المواد المُزوَّدة عبر الباني. ولا تُجري فحوص القدرة أي عمليات ⁨I/O⁩. ويُتيح كل موقّع أيضًا مُوصِّلَي ⁨getSigningAlgorithm()⁩ و⁨getConfig()⁩ لأغراض الفحص.

يحسب كل موقّع ملخّص ⁨$data⁩ محليًا وفق ملخّص الخوارزمية المُحلَّلة، ويُرسل ذلك الملخّص فقط. يتلقّى ⁨AWS⁩ ملخّصًا بترميز ⁨base64⁩ مع ⁨MessageType: DIGEST⁩. ويتلقّى ⁨Azure⁩ ملخّصًا بترميز ⁨base64url⁩ في جسم طلب التوقيع. ويتلقّى ⁨GCP⁩ ملخّصًا بترميز ⁨base64⁩ في حقل الملخّص الخاص بالخوارزمية. ولا تظهر بايتات المستند أبدًا في طلب موفّر الخدمة. ويستخدم كل النقل عميل ⁨PSR-18 HTTP⁩ قياسيًا عبر نقطة نهاية ⁨HTTPS⁩ الخاصة بموفّر الخدمة؛ ولا تتدخّل أي ⁨SDK⁩ من مورّد سحابي.

يتحقّق ⁨signWithVersion()⁩ من وسيط إصدار المفتاح بأسلوب الإخفاق المُغلَق (fail-closed) قبل بناء أي طلب. وأي قيمة تُخالف قواعد موفّر الخدمة تُطلق ⁨KeyManagementException⁩ وتمنع حَقن مقطع ⁨URL⁩ أو ⁨KeyId⁩.

موفّر الخدمةإصدار المفتاح ⁨nullالسلسلة الفارغةقواعد التجاوز
AwsKmsSignerيستخدم ⁨AwsKmsConfig::$keyId⁩؛ ويُحلَّل الاسم المستعار (alias) أو ⁨ARN⁩ إلى المفتاح الحالي في جانب موفّر الخدمةمرفوضة⁨UUID⁩ (بشُرَط أو بدونها)، أو ⁨alias/<name>⁩، أو ⁨ARN⁩ لمفتاح/اسم مستعار في ⁨KMS⁩
AzureKeyVaultSignerيستخدم إصدار المفتاح المُهيّأ؛ وقيمة إعداد فارغة تختار أحدث إصدار مُفعّل على جانب الخادممرفوضةمُعرّف ست عشري من 32 حرفًا
GcpKmsSignerيستخدم الإصدار المُثبَّت في ⁨GcpKmsConfig⁩؛ وإن لم يُثبَّت أي إصدار، يُطلق ⁨KeyManagementExceptionمرفوضةمُعرّف ⁨CryptoKeyVersion⁩ عشري، أرقام فقط

لا يملك ⁨GCP⁩ بُنية أوّلية لـ ”الإصدار النشط“ على جانب الخادم. وتعمل نقطة نهاية التوقيع غير المتماثل على مورد ⁨cryptoKeyVersions/{n}⁩ محدّد فقط، لذا يجب أن يكون الإصدار قابلًا للتحليل دائمًا.

تُمرّر طبقة الاستراتيجية اسم سلك بنمط ⁨OpenSSL⁩. ويقبل ⁨AWS⁩ و⁨Azure⁩ سبعة أسماء سلك (⁨PKCS#1⁩ و⁨ECDSA⁩ عند ⁨SHA-256/384/512⁩، إضافةً إلى ⁨RSASSA-PSS⁩). ويقبل ⁨GCP⁩ خمسة (⁨sha256WithRSAEncryption⁩، ⁨sha512WithRSAEncryption⁩، ⁨RSASSA-PSS⁩، ⁨ecdsa-with-SHA256⁩، ⁨ecdsa-with-SHA384⁩). ولا يُرمّز اسم السلك ⁨RSASSA-PSS⁩ أي ملخّص، لذا فهو غامض من حيث الملخّص. ويُحلّله ⁨AwsKmsSigner⁩ عبر ⁨KmsSigningAlgorithm::resolveForWireName()⁩، الذي يحافظ على ملخّص متغيّر ⁨PSS⁩ المُهيّأ. ويثق ⁨AzureKeyVaultSigner⁩ بمتغيّر ⁨PSS⁩ المُهيّأ للاسم الغامض. ويُطلق ⁨UnsupportedAlgorithmException⁩ إذا كان ملخّص ⁨PSS⁩ المُحلَّل سيختلف عن المُهيّأ. ويُعيد ⁨GcpKmsSigner⁩ تحليل التعداد من اسم السلك في كل استدعاء؛ و⁨withAlgorithm()⁩ في ⁨GCP⁩ معاينة وقت إعداد ولا يُغيّر سلوك وقت التوقيع. وأي اسم سلك غير مدعوم يُطلق ⁨UnsupportedAlgorithmException⁩ قبل أي استدعاء شبكي. وفي ⁨AwsKmsSigner⁩ و⁨GcpKmsSigner⁩، يُحدّث استدعاء التوقيع القيمة التي يُبلّغ عنها ⁨getSigningAlgorithm()⁩ لاحقًا إلى الخوارزمية المُحلَّلة لكل استدعاء. وفي ⁨AzureKeyVaultSigner⁩، يكون التحليل محليًا للاستدعاء وتبقى القيمة المُهيّأة هي المرجعية.

يُعيد ⁨AWS⁩ و⁨GCP⁩ التواقيع بالصيغة التي يستهلكها ⁨CMS⁩: تدخل ثمانيّات توقيع ⁨RSA⁩ إلى ⁨SignerInfo.signature⁩ دون تغيير، ويصل ⁨ECDSA⁩ مُرمَّزًا بـ ⁨DER⁩. ويُعيد ⁨Azure⁩ توقيع ⁨ECDSA⁩ بصيغة ⁨IEEE P1363⁩ الخام (⁨r||s⁩)، والتي يُحوّلها الموقّع إلى ⁨ECDSA-Sig-Value⁩ بترميز ⁨DER⁩ قبل الإعادة.

يُوقّع محوّل ⁨SigningStrategy⁩ السمات المُوقَّعة المُرمَّزة بـ ⁨DER⁩ التي تُزوّدها الجلسة. ومع وجود السمات المُوقَّعة، يكون دخل توقيع ⁨CMS⁩ هو ملخّص ترميز ⁨DER⁩ الكامل لقيمة ⁨SignedAttrs⁩ — ⁨RFC 5652 §5.4⁩. ويُغذّي ⁨getSignatureAlgorithmOid()⁩ و⁨getDigestAlgorithm()⁩ في المحوّل حقلَي ⁨signatureAlgorithm⁩ و⁨digestAlgorithm⁩ في ⁨SignerInfo⁩ — ⁨RFC 5652 §5.3⁩. وتصبح البايتات المُعادة سلسلة ⁨OCTET STRING⁩ لتوقيع ⁨SignerInfo⁩ — ⁨RFC 5652 §5.5⁩. ويخصّ تجميع ⁨CMS⁩ ومعالجة ⁨ByteRange⁩ ودورة حياة الجلسة ⁨RemoteSigningSession⁩؛ وتخصّ التدفّقات متعدّدة الأطراف ⁨SequentialSigner⁩. ويُطبّق ⁨PadesBtTimestamper⁩ — لا هذه الموقّعات — خَتمًا زمنيًا لتوقيع ⁨PAdES B-T⁩، حيث يحسب ⁨messageImprint⁩ فيه بصمة قيمة توقيع ⁨SignerInfo⁩ — ⁨RFC 3161 Appendix A⁩. والثلاثة جميعها مُوثَّقة في المرجع الأمني المتعمّق لـ ⁨Pro⁩.

الحالات الحدّية وأنماط الإخفاق

قسم بعنوان «الحالات الحدّية وأنماط الإخفاق»
  • يُرفض إصدار المفتاح بسلسلة فارغة في موفّري الخدمة الثلاثة جميعهم. مرّر ⁨null⁩ لوراثة الإعداد الافتراضي المُهيّأ.
  • يُرفض أي إصدار مفتاح مُشوَّه قبل بناء أي طلب، مع تسمية القيمة المُخالِفة في الاستثناء.
  • يُطلق ⁨AwsKmsSigner⁩ استثناء ⁨KeyManagementException⁩ عند ⁨AwsKmsConfig::$keyId⁩ فارغ وإصدار مفتاح ⁨null⁩.
  • تُقابَل استجابات موفّر الخدمة التي تُشير إلى إخفاق في إدارة المفاتيح بـ ⁨KeyManagementException⁩: في ⁨AWS⁩ ⁨NotFoundException⁩ أو ⁨DisabledException⁩ أو ⁨KeyUnavailableException⁩ أو ⁨InvalidKeyUsageException⁩ أو ⁨HTTP 404⁩؛ وفي ⁨Azure⁩ ⁨HTTP 404⁩ أو ⁨KeyNotFound⁩ أو ⁨KeyDisabled⁩ أو ⁨KeyNotActive⁩؛ وفي ⁨GCP⁩ ⁨HTTP 404⁩ أو ⁨409⁩ أو ⁨NOT_FOUND⁩ أو ⁨FAILED_PRECONDITION⁩ أو ⁨HTTP 400⁩ تُسمّي رسالتها إصدارًا.
  • استجابات موفّر الخدمة الأخرى غير ⁨200⁩ تُطلق ⁨SignatureFailedException⁩ في ⁨AWS⁩ و⁨GCP⁩، و⁨AzureKeyVaultException⁩ في ⁨Azure⁩.
  • يُقابَل أي إخفاق نقل ⁨PSR-18⁩ أثناء التوقيع بـ ⁨SignatureFailedException⁩ مع الحفاظ على استثناء العميل كسبب سابق (previous throwable).
  • يُطلق ⁨AzureKeyVaultSigner⁩ استثناء ⁨AzureKeyVaultException⁩ عند غياب رمز الوصول وبيانات اعتماد كيان الخدمة قبل أي استدعاء للخزنة. كما يُطلق الحصول الفاشل على رمز ⁨Azure AD⁩ استثناء ⁨AzureKeyVaultException⁩.
  • يتحقّق ⁨AzureKeyVaultSigner⁩ من اسم الخزنة واسم المفتاح وإصدار المفتاح ومُعرّف المستأجر مقابل قواعد ⁨Azure⁩ المنشورة عند نقطة اختناق الطلب. وأي قيمة تحمل محارف بنيوية لعنوان ⁨URL⁩ تُخفق بأسلوب مُغلَق مع ⁨AzureKeyVaultException⁩.
  • يُطلق ⁨GcpKmsSigner⁩ استثناء ⁨SignatureFailedException⁩ عند غياب رمز حامل ⁨OAuth2⁩؛ والحصول على الرمز مسؤولية المُستدعي.
  • أي استجابة من موفّر الخدمة ليست ⁨JSON⁩ صالحًا، أو تفتقر إلى حقل التوقيع، تُطلق ⁨SignatureFailedException⁩ (في ⁨Azure⁩: حقل ⁨value⁩ مفقود يُطلق ⁨AzureKeyVaultException⁩).
  • حقل توقيع من موفّر الخدمة يُخفق في فك ترميز ⁨base64⁩ يُطلق ⁨SignatureFailedException⁩ في ⁨AWS⁩ و⁨GCP⁩، و⁨AzureKeyVaultException⁩ في ⁨Azure⁩.
  • لا يُشحن أي محوّل ⁨SigningStrategy⁩ لـ ⁨GcpKmsSigner⁩ في ⁨3.1.0⁩. ويُستهلك موقّع ⁨GCP⁩ عبر عقد ⁨KmsSignerInterface⁩ مباشرةً.

يُوجّه ⁨AwsKmsConfig::withFipsEndpoint()⁩ الطلبات إلى نقطة نهاية ⁨kms-fips⁩ الخاصة بالمنطقة. وحالة اعتماد ⁨FIPS⁩ لتلك النقطة هي خاصية لـ ⁨AWS⁩، لا لـ ⁨NextPDF⁩. ولا يُتيح ⁨AzureKeyVaultConfig⁩ و⁨GcpKmsConfig⁩ أي مُساعد مخصّص لنقطة نهاية ⁨FIPS⁩ في ⁨3.1.0⁩. ويجري حساب الملخّص داخل العملية بدالة ⁨PHP⁩ ⁨hash()⁩ وليس هو نفسه وحدة معتمَدة. ويمكن لـ ⁨NextPDF Pro⁩ العمل مقابل حد ⁨KMS⁩ أو ⁨HSM⁩ معتمَد وفق ⁨FIPS⁩، لكن ⁨NextPDF⁩ ليس وحدة تعمية معتمَدة وفق ⁨FIPS⁩ ولا يطرح أي ادّعاء باعتماد ⁨FIPS⁩.

الادّعاءالمعيارالبند
يُوقّع الاستراتيجية السمات المُوقَّعة المُرمَّزة بـ ⁨DER⁩؛ ويُغطّي ملخّص دخل توقيع ⁨CMS⁩ ترميز ⁨DER⁩ الكامل لـ ⁨SignedAttrs⁩.RFC 5652§5.4
⁨SignedAttributes⁩ مُرمَّزة بـ ⁨DER⁩ وتحمل ⁨content-type⁩ و⁨message-digest⁩ كحد أدنى؛ ويُحدّد ⁨signatureAlgorithm⁩ خوارزمية الموقّع.RFC 5652§5.3
البايتات المُعادة للتوقيع مُرمَّزة كسلسلة ⁨OCTET STRING⁩ ومحمولة في حقل توقيع ⁨SignerInfo⁩.RFC 5652§5.5
⁨messageImprint⁩ الخاص بختم زمني للتوقيع يحسب بصمة قيمة توقيع ⁨SignerInfo⁩ (سطح ⁨B-T⁩ مُجاور، لا هذه الموقّعات).RFC 3161Appendix A

جميع البنود مُعاد صياغتها؛ ولا يُعيد ⁨NextPDF⁩ إنتاج النص المعياري. وهذه بيانات قدرة، لا شهادات اعتماد. ولا يحمل ⁨NextPDF⁩ أي شهادة اعتماد ولا يمنح أيًّا منها. أما هل يتحقّق توقيع مُنتَج أم لا فهو قرار المُتحقِّق مقابل مراسي الثقة والسياسة الخاصة به؛ والموقّعات تُعيد بايتات التوقيع ولا تؤكّد أي نتيجة موثوقة. وحِفظ المفتاح، وحماية المفتاح، والتحقّق من الخوارزمية في جانب موفّر الخدمة، هي خصائص لـ ⁨KMS⁩ المُهيّأ، لا لـ ⁨NextPDF⁩.

  • التوفّر ضمن حزمة ⁨Pro⁩: ⁨AwsKmsSigner⁩ منذ ⁨1.9.0⁩، و⁨AzureKeyVaultSigner⁩ منذ ⁨2.0.0⁩، و⁨GcpKmsSigner⁩ و⁨KmsSignerInterface⁩ منذ ⁨2.1.0⁩. وجميعها حاليّ في ⁨nextpdf/pro⁩ ⁨3.1.0⁩.
  • تعتمد الموقّعات على ⁨PSR-18⁩ و⁨PSR-17⁩ و⁨PSR-3⁩ فقط. ولا تُطلب أو تُحزَّم أي ⁨SDK⁩ من ⁨AWS⁩ أو ⁨Azure⁩ أو ⁨Google⁩.
  • افحص ⁨supportsAlgorithm()⁩ قبل التوقيع حتى يُرفض موفّر الخدمة غير المتوافق وقت الاختيار، لا في منتصف الجلسة.
  • تُحقَن حقول بيانات الاعتماد عبر الباني وتُعلَّم كمعاملات حسّاسة. وتحمل رسائل السجلّ حقولًا بنيوية فقط؛ ولا يُكتب أي بيان اعتماد أو رمز أو محتوى مستند في السجلّات.
  • ثبّت إصدارات المفاتيح صراحةً في عمليات النشر الخاضعة للتنظيم. فالإعدادات الافتراضية لتحليل الاسم المستعار (في ⁨AWS⁩) وأحدث إصدار مُفعّل (في ⁨Azure⁩) مريحة لكنها ليست حتمية عبر عمليات التدوير.
  • تُنفّذ مُشغّلات الأطراف الخارجية ⁨KmsSignerInterface⁩ ويجب أن تضع ⁨providerId()⁩ الخاص بها في مساحة اسم لتجنّب التصادم مع المعرّفات المدمجة المحجوزة.

تُوثّق هذه الصفحة السلوك القابل للملاحظة خارجيًا وواجهة ⁨API⁩ العامة المدعومة فقط. أما مسارات مساحات الأسماء الداخلية، والأصناف المساعدة، وجداول الآليات، وأسماء ملفات أدلة التشغيل، وبادئات التذاكر فهي خارج النطاق.