CMS_VERIFY(3ssl)

الاسم
CMS_verify, CMS_SignedData_verify, CMS_get0_signers - تحقق من بنية CMS SignedData

موجز
 #include <openssl/cms.h>

 int CMS_verify(CMS_ContentInfo *cms, STACK_OF(X509) *certs, X509_STORE *store,
                BIO *detached_data, BIO *out, unsigned int flags);
 BIO *CMS_SignedData_verify(CMS_SignedData *sd, BIO *detached_data,
                            STACK_OF(X509) *scerts, X509_STORE *store,
                            STACK_OF(X509) *extra, STACK_OF(X509_CRL) *crls,
                            unsigned int flags,
                            OSSL_LIB_CTX *libctx, const char *propq);

 STACK_OF(X509) *CMS_get0_signers(CMS_ContentInfo *cms);

الوصف
CMS_verify() مشابهة جدًا لـ PKCS7_verify(3). تتحقق من بنية CMS SignedData الموجودة داخل بنية من نوع CMS_ContentInfo. يشير cms إلى بنية CMS_ContentInfo المراد التحقق منها. تشير المعامل الاختياري certs إلى مجموعة من الشهادات التي يُبحث فيها عن شهادات التوقيع. يُستخدم أيضًا كمصدر لشهادات CA الوسيطة غير الموثوقة لبناء السلسلة. قد يحتوي cms على شهادات CA إضافية غير موثوقة يمكن استخدامها لبناء السلسلة بالإضافة إلى قوائم CRL التي يمكن استخدامها للتحقق من صحة الشهادة. قد يكون store NULL أو يشير إلى مخزن الشهادات الموثوقة المستخدم للتحقق من السلسلة. يشير detached_data إلى البيانات الموقعة إذا كان المحتوى منفصلاً عن cms. وإلا يجب أن يكون detached_data NULL ويجب أن تكون البيانات الموقعة في cms. يُكتب المحتوى إلى BIO out ما لم يكن NULL. flags هي مجموعة اختيارية من الأعلام يمكن استخدامها لتعديل العملية.

CMS_SignedData_verify() تشبه CMS_verify() باستثناء أنها تعمل على إدخال CMS SignedData في الوسيطة sd، ولها بعض المعاملات الإضافية الموصوفة لاحقًا، وعند النجاح تُرجع المحتوى المُتحقق منه كـ BIO ذاكرة. يمكن استخدام المعامل الاختياري extra لتوفير شهادات CA غير موثوقة قد تكون مفيدة لبناء السلسلة في التحقق من صحة الشهادة. يجب ألا تحتوي قائمة الشهادات هذه على مكررات. يمكن استخدام المعامل الاختياري crls لتوفير قوائم CRL إضافية. أيضًا يجب ألا تحتوي قائمة CRL على مكررات. تُستخدم المعاملات الاختيارية سياق المكتبة libctx واستعلام الخاصية propq عند استرداد الخوارزميات من المزودين.

CMS_get0_signers() تسترجع شهادة (شهادات) التوقيع من cms؛ لا يمكن استدعاؤها إلا بعد عملية ناجحة لـ CMS_verify() أو CMS_SignedData_verify().

عملية التحقق
عادةً ما تسير عملية التحقق كما يلي.

مبدئيًا تُجرى بعض فحوصات الصلاحية على cms. يجب أن يكون نوع cms هو SignedData. يجب أن يكون هناك توقيع واحد على الأقل على البيانات، وإذا كان المحتوى منفصلاً فلا يمكن أن يكون detached_data NULL.

تُبذل محاولة لتحديد موقع جميع شهادات التوقيع، بالبحث أولاً في المعامل certs (إذا لم يكن NULL) ثم البحث في أي شهادات موجودة في بنية cms ما لم يُضبط CMS_NOINTERN. إذا تعذر تحديد موقع أي شهادة توقيع، تفشل العملية.

تُتحقق كل شهادة توقيع من السلسلة باستخدام الغرض smimesign وباستخدام مخزن الشهادات الموثوقة store إذا تم توفيره. تُستخدم أي شهادات داخلية في الرسالة، والتي قد أُضيفت باستخدام CMS_add1_cert(3)، كشهادات CA غير موثوقة. إذا كان فحص CRL مفعلاً في store ولم يُضبط CMS_NOCRL، تُستخدم أي قوائم CRL داخلية، والتي قد أُضيفت باستخدام CMS_add1_crl(3)، بالإضافة إلى محاولة البحث عنها في store. إذا لم يكن store NULL وفشل أي تحقق من السلسلة، يُعاد رمز خطأ.

أخيرًا يُقرَأ المحتوى الموقع (ويُكتب في out ما لم يكن NULL) ويُتَحَقَّق من التوقيع.

إذا تُحُقِّقَ من جميع التوقيعات بشكل صحيح، تكون الدالة ناجحة.

يمكن تمرير أي من الأعلام التالية (مجمعة بـ OR) في المعامل flags لتغيير سلوك التحقق المبدئي.

إذا ضُبط CMS_NOINTERN، لا تُبحث الشهادات في الرسالة نفسها عند تحديد موقع شهادات التوقيع. هذا يعني أن جميع شهادات التوقيع يجب أن تكون في المعامل certs.

إذا ضُبط CMS_NOCRL وكان فحص CRL مفعلاً في store، تُتجاهل أي قوائم CRL في الرسالة نفسها والمقدمة عبر المعامل crls.

إذا جرى ضبط علم CMS_TEXT، تُحذَف رؤوس MIME للنوع "text/plain" من المحتوى. إذا لم يكن المحتوى من النوع "text/plain" فسيُرجَع خطأ.

إذا ضُبط CMS_NO_SIGNER_CERT_VERIFY، لا تُتحقق شهادات التوقيع من السلسلة، ما لم يُضبط أيضًا علم CMS_CADES.

إذا ضُبط CMS_NO_ATTR_VERIFY، لا يُتحقق توقيع السمات الموقعة، ما لم يُضبط أيضًا علم CMS_CADES.

إذا ضُبط CMS_CADES، تُفحص كل شهادة موقع مقابل امتداد ESS signingCertificate أو ESS signingCertificateV2 المطلوب في السمات الموقعة للتوقيع.

إذا ضُبط CMS_NO_CONTENT_VERIFY، لا يُفحص ملخص المحتوى.

ملاحظات
أحد تطبيقات CMS_NOINTERN هو قبول الرسائل الموقعة بعدد صغير من الشهادات فقط. تُمرر الشهادات المقبولة في المعامل certs. في هذه الحالة، إذا لم تكن شهادة الموقع واحدة من الشهادات المقدمة في certs، سيفشل التحقق لأنه لا يمكن العثور على الموقع.

في بعض الحالات، التقنيات القياسية للبحث عن الشهادات والتحقق منها ليست مناسبة: على سبيل المثال، قد يرغب تطبيق في البحث عن شهادات في قاعدة بيانات أو إجراء تحقق مخصص. يمكن تحقيق ذلك بوضع والتحقق من شهادات الموقع يدويًا باستخدام دوال أداة البيانات الموقعة.

يجب أخذ الحذر عند تعديل سلوك التحقق المبدئي، على سبيل المثال وضع CMS_NO_CONTENT_VERIFY سيعطل كليًا كل تحقق المحتوى وأي محتوى معدل سيُعتبر صالحًا. هذه التركيبة مفيدة مع ذلك إذا أراد المرء فقط كتابة المحتوى إلى out ولا تُعتبر صلاحيته مهمة.

يُفترض إجراء التحقق من السلسلة باستخدام وقت التوقيع بدلاً من الوقت الحالي. ومع ذلك، وبما أن وقت التوقيع يقدمه الموقع، فلا يمكن الوثوق به دون أدلة إضافية (مثل طابع زمني موثوق).

القيم المُرجعة
CMS_verify() يُرجع 1 للتحقق الناجح و0 إذا حدث خطأ.

CMS_SignedData_verify() يُرجع BIO ذاكرة يحتوي على المحتوى المُتحقق منه، أو NULL عند الخطأ.

CMS_get0_signers() يُرجع كل الموقعين أو NULL إذا حدث خطأ.

يمكن الحصول على الخطأ من ERR_get_error(3).

العلل
مخزن الشهادة الموثوقة لا يُبحث عنه لشهادة التوقيع. هذا يرجع أساسًا إلى عدم كفاية وظيفة X509_STORE الحالية.

غياب المعالجة بمرور واحد يعني وجوب الاحتفاظ بجميع المحتوى الموقع في الذاكرة إذا لم يكن منفصلاً.

انظر أيضًا
PKCS7_verify(3), CMS_add1_cert(3), CMS_add1_crl(3), OSSL_ESS_check_signing_certs(3), ERR_get_error(3), CMS_sign(3)

التاريخ
CMS_SignedData_verify() أُضيف في OpenSSL 3.2.

حقوق النسخ
حقوق النشر 2008-2024 مؤلفو مشروع OpenSSL. جميع الحقوق محفوظة.

مرخص بموجب رخصة Apache 2.0 (المشار إليها فيما يلي بـ ”الرخصة“). لا يجوز لك استخدام هذا الملف إلا وفقًا لشروط الرخصة. يمكنك الحصول على نسخة منها في الملف LICENSE الموجود في حزمة التوزيع المصدرية أو على الرابط <https://www.openssl.org/source/license.html>.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.