table of contents
- trixie-backports 4.31.0-1~bpo13+1
- testing 4.32.4-1
- unstable 4.32.4-1
| X509_VERIFY_CERT(3SSL) | OpenSSL | X509_VERIFY_CERT(3SSL) |
الاسم¶
X509_verify_cert, X509_STORE_CTX_verify, X509_build_chain - بناء والتحقق من سلسلة شهادات X509
موجز¶
#include <openssl/x509_vfy.h>
int X509_verify_cert(X509_STORE_CTX *ctx);
int X509_STORE_CTX_verify(X509_STORE_CTX *ctx);
STACK_OF(X509) *X509_build_chain(X509 *target, STACK_OF(X509) *certs,
X509_STORE *store, int with_self_signed,
OSSL_LIB_CTX *libctx, const char *propq);
الوصف¶
X509_verify_cert و X509_STORE_CTX_verify¶
X509_verify_cert() تحاول بناء والتحقق من سلسلة شهادات للشهادة الهدف المعينة في ctx. سياق التحقق، من النوع X509_STORE_CTX، يجب أولاً إنشاؤه باستخدام X509_STORE_CTX_new(3) وتهيئته باستخدام X509_STORE_CTX_init(3). يحمل الشهادة الهدف، مخزن الثقة، كومة اختيارية من الشهادات غير الموثوقة التي قد تساعد في بناء السلسلة، معاملات تحقق مثل الأعلام والغرض من التحقق، دالة استدعاء تحقق اختيارية، وبعد الاستدعاء، نتيجة التحقق.
يمكن استخدام X509_STORE_CTX لتحقق واحد فقط. استدعاء X509_verify_cert() مرة ثانية على نفس السياق دون إعادة تهيئته يفشل بقيمة إرجاع سالبة، وX509_STORE_CTX_get_error(3) يعيد لاحقاً X509_V_ERR_INVALID_CALL.
عندما يكون الهدف شهادة، تؤدي الدالة الخطوات التالية بالترتيب. الخطوة الأولى التي تفشل توقف التحقق، إلا حيث تتنازل دالة استدعاء التحقق صراحة عن الخطأ (انظر "دالة استدعاء التحقق" أدناه):
- 1.
- بناء
السلسلة.
بدءاً من
الشهادة
الهدف،
تبحث آلية
التحقق عن
مُصدِر
للشهادة
الموجودة
حالياً في
أعلى
السلسلة،
مستمدة
المرشحين
من كومة ctx
غير
الموثوقة
ومن مخزن
الثقة.
افتراضياً،
يكون البحث
غير
الموثوق
أولاً:
تُفحص
الكومة غير
الموثوقة
قبل مخزن
الثقة.
تعيين X509_V_FLAG_TRUSTED_FIRST
على
معاملات
تحقق ctx
يعكس هذا.
عندما يفشل
بحث غير
موثوق
أولاً في
الوصول إلى
مرساة ثقة
وX509_V_FLAG_NO_ALT_CHAINS غير
معين،
يُعاد
البحث
ببادئات
غير موثوقة
أقصر
تدريجياً
في محاولة
لإيجاد
مسار موثوق
بديل. طول
السلسلة
محدود بحد
العمق
المُهيأ
(انظر
X509_VERIFY_PARAM_set_depth(3))؛
تجاوزه
يُنتج
X509_V_ERR_CERT_CHAIN_TOO_LONG. إذا
أمكن أكثر
من سلسلة
واحدة،
تُؤخذ
واحدة فقط.
فشل بناء سلسلة إلى مرساة ثقة يُنتج خطأ مثل X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT، X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY، X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN، X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT، أو X509_V_ERR_CERT_CHAIN_TOO_LONG.
- 2.
- التحقق من امتدادات الشهادة وفق RFC 5280، بما في ذلك القيود الأساسية، استخدام المفتاح والغرض من التحقق المُعين عبر X509_VERIFY_PARAM_set_purpose(3).
- 3.
- فحوصات مستوى الأمان ضد مستوى الاستيثاق المُهيأ، تغطي أحجام مفاتيح المُصدِر (X509_V_ERR_CA_KEY_TOO_SMALL) وقوة خوارزمية التوقيع (X509_V_ERR_CA_MD_TOO_WEAK). يُفحص مفتاح الورقة بشكل منفصل قبل بدء بناء السلسلة (X509_V_ERR_EE_KEY_TOO_SMALL).
- 4.
- فحوصات الهوية ضد أي أسماء مضيفين أو عناوين بريد إلكتروني أو عناوين IP مُهيأة على معاملات التحقق (X509_VERIFY_PARAM_set1_host(3) وما يتصل بها).
- 5.
- فحوصات الإلغاء عبر CRLs وعند التهيئة، OCSP. مجموعة الفحوصات المُنفذة تُتحكم بها أعلام مثل X509_V_FLAG_CRL_CHECK وX509_V_FLAG_CRL_CHECK_ALL.
- 6.
- فحوصات التوقيع وفترة الصلاحية على كل شهادة في السلسلة، متنقلاً من مرساة الثقة نزولاً إلى الهدف. توقيع الشهادة الختامية للسلسلة غير مُتحقق منه: تُؤخذ الثقة من وجودها في مخزن الثقة بدلاً من توقيعها. ينطبق هذا على مرساة ثقة ذاتية التوقيع تقليدية وعندما يكون X509_V_FLAG_PARTIAL_CHAIN سارياً، على وسيط غير ذاتي التوقيع مُرقى إلى حالة مرساة. X509_V_FLAG_CHECK_SS_SIGNATURE يطلب التحقق من التوقيع الذاتي على مُنهٍ ذاتي التوقيع؛ ليس له تأثير عندما يكون المُنهٍ شهادة غير ذاتية التوقيع. تُفحص فترات الصلاحية على كل شهادة، بما في ذلك المُنهٍ.
- 7.
- التحقق من قيود الاسم وفق RFC 5280 قسم 4.2.1.10؛ انظر NAME_CONSTRAINTS_check(3) لتفاصيل البدائية المطابقة وأنواع الأسماء العامة التي تغطيها.
- 8.
- التحقق من مسار RFC 3779 لامتدادات تفويض رقم AS وعنوان IP، مُنفذ افتراضياً ما لم يُبنَ OpenSSL مع no-rfc3779.
- 9.
- التحقق من سياسة الشهادة، مُنفذ فقط عندما يكون X509_V_FLAG_POLICY_CHECK معيناً.
عدة قيم X509_V_FLAG_* تعدل سلوك هذه الفحوصات؛ أُطلق على ممثلين منها في الخطوة ذات الصلة أعلاه، لكن القائمة هناك ليست شاملة. المجموعة الكاملة لأعلام التحقق، والتأثير الذي يملكه كل واحد، والدوال المستخدمة للاستعلام عنها وتعديلها موثقة في X509_VERIFY_PARAM_set_flags(3).
نادراً ما تستدعي التطبيقات X509_verify_cert() مباشرة. تُستدعى داخلياً بواسطة OpenSSL أثناء تحقق S/MIME وCMS وأثناء مصافحة TLS.
X509_STORE_CTX_verify() تتصرف بشكل مطابق لـ X509_verify_cert() باستثناء اختيار الشهادة الهدف: إذا لم يُعين هدف على ctx (انظر X509_STORE_CTX_set_cert(3)) والكومة غير الموثوقة غير فارغة، تُعتمد الشهادة الأولى في الكومة غير الموثوقة كهدف قبل بدء التحقق. إذا عُين هدف صراحة، تستخدمه X509_STORE_CTX_verify() ولا تستشير الكومة غير الموثوقة لهذا الغرض.
أهداف المفتاح العام الخام¶
عندما يكون هدف التحقق مفتاحاً عاماً خاماً بدلاً من شهادة (مُعين عبر X509_STORE_CTX_init_rpk(3))، تتحقق كلتا الدالتين من المفتاح العام الخام بدلاً من سلسلة شهادات. مجموعة الفحوصات الممكنة مُخفضة بشكل كبير: لا توجد امتدادات أو أسماء أو CRLs أو توقيعات للتحقق منها. يمكن استيثاق المفتاح العام الخام فقط عبر سجلات DANE TLSA، إما مُصنعة محلياً أو مُحصلة بواسطة التطبيق من DNS. يمكن إضافة سجلات DANE TLSA للمفتاح العام الخام عبر SSL_add_expected_rpk(3) أو SSL_dane_tlsa_add(3).
X509_build_chain¶
X509_build_chain() يبني سلسلة شهادات تبدأ من target، باستخدام نفس خوارزمية بناء السلسلة مثل X509_verify_cert() (انظر "X509_verify_cert و X509_STORE_CTX_verify" أعلاه). يستخدم داخليًا بنية X509_STORE_CTX مرتبطة بسياق المكتبة libctx وسلسلة استعلام الخصائص propq، وكلاهما قد يكون NULL. دور certs يعتمد على store:
- إذا كان store غير NULL، يُعامل certs كقائمة اختيارية من الشهادات الوسيطة غير الموثوقة التي قد تساعد في إكمال السلسلة، ويجب أن تصل السلسلة إلى مرساة ثقة موجودة في store. إذا تعذر بناء سلسلة إلى مرساة ثقة، تفشل الدالة وتُرجع NULL.
- إذا كان store هو NULL، يُثبَّت certs ككومة موثوقة للسياق الداخلي (انظر X509_STORE_CTX_set0_trusted_stack(3)). في هذا الوضع، تبني الدالة السلسلة قدر ما تستطيع ولكنها لا تتطلب الوصول إلى مرساة: إذا فشل بناء السلسلة في منتصف الطريق، تُرجع السلسلة الجزئية المبنية حتى الآن.
لأن X509_STORE_CTX الداخلي يُخصص ويُحرر داخل X509_build_chain()، فإن أعلام سياسة البحث مثل X509_V_FLAG_TRUSTED_FIRST و X509_V_FLAG_NO_ALT_CHAINS وحد العمق المكوَّن تأخذ دائمًا قيمها المبدئية، ولا يُبلَّغ عن رمز X509_V_ERR_* المحدد الذي تسبب في فشل بناء السلسلة: تشير الدالة فقط إلى النجاح أو الفشل من خلال قيمة الإرجاع (وعندما يكون store هو NULL، قد تُرجع أيضًا سلسلة جزئية).
عند النجاح، تبدأ الكومة المُرجعة بـ target مُشار إليه حديثًا يليه شهادات المُصدِر التي وُجدت. تُضمَّن شهادة موقعة ذاتيًا في أعلى السلسلة في الكومة المُرجعة عندما يكون with_self_signed هو 1، أو عندما تتكون السلسلة فقط من target (مثلًا لأن target نفسه موقَّع ذاتيًا أو لم يُعثر على مُصدِر إضافي). عندما تحتوي السلسلة على أكثر من عنصر واحد ويكون with_self_signed هو 0، يُحذف الجزء العلوي الموقَّع ذاتيًا من النتيجة.
المتصل مسؤول عن تحرير الكومة المُرجعة.
استدعاء التحقق¶
يحمل كل X509_STORE_CTX استدعاء تحقق بالتوقيع
int (*verify_cb)(int ok, X509_STORE_CTX *ctx);
يُستدعى هذا الاستدعاء بواسطة X509_verify_cert() و X509_STORE_CTX_verify() في نقاط متعددة أثناء التحقق، سواء لـ الإبلاغ عن الأخطاء أو لـ الإخطار بالتقدم. يُثبَّت بواسطة X509_STORE_CTX_set_verify_cb(3) على السياق، أو يُورَّث في وقت X509_STORE_CTX_init(3) من X509_STORE (انظر X509_STORE_set_verify_cb_func(3)). إذا لم يُثبَّت أي منهما، يُستخدم استدعاء مبدئي يُرجع ببساطة وسيطته ok دون تغيير، مما يتسبب في إيقاف التحقق عند كل خطأ.
عند استدعاء الاستدعاء¶
يوجد نمطان متميزان للاستدعاء:
- إخطار الخطأ (ok = 0)
- يُستدعى الاستدعاء مع ضبط ok على 0 في كل مرة يفشل فيها فحص. قبل الاستدعاء، تسجل آلية التحقق رمز X509_V_ERR_* الذي يصف الفشل على ctx، وبالنسبة لأخطاء مستوى الشهادة، تسجل أيضًا العمق الذي اكتُشف فيه الخطأ والشهادة المعنية. يفحص الاستدعاء هذه عبر X509_STORE_CTX_get_error(3)، X509_STORE_CTX_get_error_depth(3)، و X509_STORE_CTX_get_current_cert(3). الأخطاء المتعلقة بـ CRL و OCSP تُحدِّث رمز الخطأ فقط؛ يحتفظ العمق والشهادة الحالية بقيمهما من سياق سابق.
- إخطار النجاح لكل شهادة (ok = 1)
- أثناء مرور التوقيع والصلاحية، بعد فحص كل شهادة في السلسلة بنجاح، يُستدعى الاستدعاء مع ضبط ok على 1. تصف الشهادة الحالية والمُصدِر الحالي وعمق الخطأ (القابلة للاستعلام على التوالي عبر X509_STORE_CTX_get_current_cert(3)، X509_STORE_CTX_get0_current_issuer(3)، و X509_STORE_CTX_get_error_depth(3)) الشهادة التي قُبلت للتو. قد يستخدم الاستدعاء هذا لتسجيل التقدم، لكن يجب أن يُرجع قيمة غير صفرية، وإلا يُوقف التحقق.
تتحكم قيمة إرجاع الاستدعاء's في التحقق اللاحق:
- قيمة إرجاع غير صفرية تتسبب في استمرار التحقق. بالنسبة لإخطار الخطأ، يشكل هذا تنازلاً عن الخطأ.
- قيمة إرجاع صفرية تتسبب في إيقاف التحقق فورًا. تُرجع الدالة 0 إلى المتصل في هذه الحالة، بغض النظر عما إذا كان الاستدعاء قد استُدعي مع ok = 0 أو ok = 1.
الأخطاء اللاصقة¶
عندما يتنازل الاستدعاء الراجع عن خطأ بإرجاع قيمة غير صفرية، يُعامل الفحص الأساسي كأنه ناجح لأغراض تدفق التحكم، لكن رمز الخطأ المسجل على ctx لا يُعاد ضبطه إلى X509_V_OK. لذلك، فإن العودة الناجحة اللاحقة من X509_verify_cert() لا تعني أن X509_STORE_CTX_get_error(3) سيعيد X509_V_OK: فقد يحتفظ بآخر رمز خطأ تم التنازل عنه. هذا مقصود. فقط الاستدعاء الراجع نفسه مسموح له باستبدال رمز الخطأ، عبر X509_STORE_CTX_set_error(3)، وعلى مسؤوليته الخاصة فقط.
المخاطر¶
الاستدعاء الراجع للتحقق الذي يعيد قيمة غير صفرية عند إشعار خطأ قد، بحكم التعريف، كبت فحص استيثاق اعتبرته OpenSSL ضروريًا. يجب على المستدعين اعتبار تثبيت استدعاء راجع يتنازل عن الأخطاء إضعافًا متعمدًا لضمانات الأمان لـ X509_verify_cert()، يُنفذ فقط لأكواد خطأ محددة ومفهومة جيدًا. المزالق التالية شائعة:
- التنازلات الشاملة. الاستدعاء الراجع الذي يعيد 1 دون شروط يحول X509_verify_cert() إلى "قبول أي شيء" ويكون خاطئًا دائمًا تقريبًا خارج التشخيصات. افحص رمز الخطأ عبر X509_STORE_CTX_get_error(3) وتنازل فقط عن الأكواد المحددة التي تنويها.
- إفشال إشعار النجاح. نظرًا لأن الاستدعاء الراجع يُستدعى أيضًا مع ok = 1، فإن الاستدعاء الراجع الذي يعيد 0 بالخطأ في تلك الحالة يتسبب في فشل التحقق حتى مع نجاح كل فحص. لا يمكن للمستدعي تمييز هذا عن فشل حقيقي بناءً على قيمة الإرجاع وحدها.
- مسح رمز الخطأ. قاعدة الخطأ اللاصق موجودة بحيث يبقى الخطأ المتنازل عنه مرئيًا للمستدعي بعد عودة التحقق. الاستدعاء الراجع الذي يستدعي X509_STORE_CTX_set_error(3) مع X509_V_OK يخفي هذه المعلومات ويمكنه أيضًا إخفاء خطأ لاحق إذا استُدعي الاستدعاء الراجع مرة أخرى قبل اكتمال التحقق.
- تغيير سياق التحقق. يكون X509_STORE_CTX نشطًا أثناء الاستدعاء الراجع: دوال التحقق تقرأ بنشاط سلسلته ومعاملاته وحالته الأخرى. استدعاء دوال تغيير السياق من داخل الاستدعاء الراجع -- على سبيل المثال، استبدال السلسلة المُتحقق منها عبر X509_STORE_CTX_set0_verified_chain(3)، أو تبديل مخزن الثقة أو المكدس غير الموثوق، أو تغيير أعلام التحقق أو العمق أو الغرض أو الهدف -- يمكن أن يفسد التحقق الجاري، أو ينتج سلوكًا غير متناسق بين خطوات لاحقة من خط الأنابيب، أو، في حالة السلسلة المُتحقق منها، يتسبب في استخدام بعد التحرير. المعدِّلات الوحيدة المعقولة من داخل الاستدعاء الراجع هي المحددات المتعلقة بالخطأ (X509_STORE_CTX_set_error(3)، X509_STORE_CTX_set_error_depth(3)، X509_STORE_CTX_set_current_cert(3))، وحتى تلك يجب استخدامها باعتدال (انظر "الأخطاء اللاصقة").
- عمل ثقيل في الاستدعاء الراجع. يكون الاستدعاء الراجع على المسار الساخن لكل فحص شهادة؛ العمل المكلف المنفذ هناك سيُبطئ كل مصافحة TLS أو تحقق S/MIME يستخدم السياق المحيط.
- الثقة بالعمق وحده. عمق الخطأ، من X509_STORE_CTX_get_error_depth(3)، يسجل مكان اكتشاف الخطأ أثناء معالجة السلسلة، وليس موضع الشهادة في السلسلة النهائية. استشر دائمًا X509_STORE_CTX_get_current_cert(3) بالإضافة إلى العمق عند اتخاذ قرار التنازل.
- الهشاشة فيما يتعلق بترتيب الفحص. مجموعة الأخطاء التي يلاحظها الاستدعاء الراجع، والترتيب الذي يلاحظها به، يعتمدان على الترتيب الداخلي الذي تُنفذ به فحوصات التحقق. عندما تحتوي شهادة على أكثر من مشكلة واحدة، فقط الفحص الأول الذي يكتشف مشكلة يتسبب في استدعاء الاستدعاء الراجع لتلك الشهادة؛ لا تُصل الفحوصات اللاحقة إلا إذا تنازل الاستدعاء الراجع عن الخطأ السابق. هذا الترتيب تفصيل تنفيذي وليس جزءًا من الواجهة البرمجية المستقرة: إعادة هيكلة تعيد ترتيب الفحوصات الداخلية دون تغيير عقد النجاح/الفشل الثنائي لـ X509_verify_cert() قد تغير مع ذلك أي رمز X509_V_ERR_* يراه الاستدعاء الراجع، أو ما إذا كان رمز معين يُبلغ عنه أصلًا. الاستدعاءات الراجعة التي تتفرع على رمز خطأ محدد يُبلغ عنه، أو التي تفترض أن الفحوصات السابقة قد صفت بالفعل شروطًا معينة، يمكنها بالتالي تغيير السلوك بصمت عبر إصدارات OpenSSL. اكتب الاستدعاءات الراجعة دفاعيًا: أعد جلب رمز الخطأ والشهادة الحالية عبر X509_STORE_CTX_get_error(3) و X509_STORE_CTX_get_current_cert(3) من جديد في كل استدعاء، وعامل "هذا الرمز لا يظهر أبدًا" كافتراض قد يُبطل. بشكل أكثر جوهرية، نظرًا لأن مجموعة وترتيب إشعارات الأخطاء ليس عقدًا مستقرًا، لا يمكن الاعتماد على الاستدعاء الراجع لملاحظة أي شرط أو تسلسل شروط معين؛ هذا يجعله آلية غير سليمة لفرض أو تعديل سياسة الأمان. استخدام الاستدعاء الراجع للتحقق لتغيير نتائج التحقق -- للتنازل عن الأخطاء، أو لحقن قبول شرطي، أو لبوابة السلوك على رمز X509_V_ERR_* محدد يُبلغ عنه -- غير مشجع بالتالي في كود الإنتاج. احتفظ بالاستدعاء الراجع لأغراض التشخيص والتسجيل، حيث التغييرات المستقبلية في الأخطاء التي تظهر، أو في أي ترتيب، ليست ذات صلة بالأمان.
الاستدعاء الراجع الافتراضي لا يتنازل عن شيء وهو الخيار الآمن؛ إنه السلوك الصحيح لجميع استخدامات الإنتاج تقريبًا.
القيم المُرجعة¶
X509_verify_cert() و X509_STORE_CTX_verify() يعيدان:
- 1
- إذا بُنيت سلسلة كاملة ونجح كل فحص أو تنازل عنه الاستدعاء الراجع للتحقق. لاحظ أن الحالة الأخيرة لا تضمن أن X509_STORE_CTX_get_error(3) يعيد X509_V_OK؛ انظر "الأخطاء اللاصقة". قيمة الإرجاع هي إشارة النجاح/الفشل الموثوقة: لا يحتاج المستدعون إلى فحص إضافي أن X509_STORE_CTX_get_error(3) يعيد X509_V_OK لاعتبار التحقق ناجحًا. يمكنهم استشارتها لمعرفة ما إذا كانت الأخطاء، وأيها، قد تنازل عنها الاستدعاء الراجع للتحقق.
- 0
- إذا رُفض التحقق. يحدث هذا عندما يفشل فحص ولم يتنازل الاستدعاء الراجع عن الخطأ، أو عندما يرفض قرار ثقة السلسلة بنشاط، أو عندما يعيد الاستدعاء الراجع للتحقق 0 من إشعار نجاح (انظر "الاستدعاء الراجع للتحقق"). عندما كانت شهادة ستفشل في أكثر من فحص واحد، فإن رمز X509_V_ERR_* المحدد الذي يعيده X509_STORE_CTX_get_error(3) يعكس أي فحص أُطلق أولًا؛ هذا الترتيب تفصيل تنفيذي وليس مستقرًا عبر الإصدارات. لذلك يجب على المستدعين معاملة قيمة الإرجاع كإشارة النجاح/الفشل الموثوقة، ومعاملة رمز الخطأ المحدد كمعلومات تشخيصية قد تتغير بمرور الوقت.
- قيمة سلبية
- عند خطأ صعب منع التحقق من الاكتمال. الحالات الموثقة هي: ctx يساوي NULL؛ لا يحتوي ctx على شهادة هدف معينة؛ استُخدم ctx سابقًا في تحقق سابق؛ فشل تخصيص الذاكرة؛ أرجعت دالة البحث في مخزن الثقة خطأً؛ أو انتهك ثابت داخلي. في هذه الحالات، يُرجع X509_STORE_CTX_get_error(3) قيمة X509_V_ERR_* مناسبة (X509_V_ERR_INVALID_CALL، X509_V_ERR_OUT_OF_MEM، X509_V_ERR_STORE_LOOKUP أو X509_V_ERR_UNSPECIFIED).
في جميع أنماط الفشل، يمكن الحصول على معلومات إضافية من X509_STORE_CTX_get_error(3) والملحقات ذات الصلة. يجب على التطبيقات معاملة أي قيمة إرجاع <= 0 على أنها تحقق لم ينجح.
يُرجع X509_build_chain() NULL عند الخطأ. وإلا، يُرجع مكدسًا مخصصًا حديثًا من الشهادات يجب على المستدعي تحريره؛ قد يمثل المكدس سلسلة جزئية فقط عندما يكون store NULL.
العلل¶
تنحرف عدة جوانب من بناء السلسلة عن توصيات RFC 4158 (بناء مسار التصديق) وعن التحقق الصارم من المسار وفق RFC 5280. يجب أن يكون المستدعون على دراية بما يلي:
لا يُحسَّن البحث في السلسلة بالطريقة الموصوفة في RFC 4158 الأقسام 3.1 إلى 3.5. لا تُقيَّم الجهات المصدرة المرشحة مقابل مجموعة الاستدلالات التي توصي بها RFC 4158؛ في كل خطوة، يُلتزم بأول مرشح قابل للتطبيق، مع تفضيل وحيد لمرشح تغطي فترة صلاحيته الوقت الحالي. لا يوجد تراجع في اجتياز الشجرة: عندما لا تصل سلسلة أولية إلى مرساة ثقة، يُعاد البحث ببادئات غير موثوقة أقصر تدريجيًا (ما لم يُضبط X509_V_FLAG_NO_ALT_CHAINS)، لكن لا تُجرَّب جهات مصدرة مختلفة في مواضع وسيطة من السلسلة نفسها. في بيئات PKI الهرمية البسيطة، نادرًا ما يكون هذا مشكلة. في بيئات PKI المتصالبة أو الموصولة، قد يفشل X509_verify_cert() في إيجاد مسار تصديق صالح حتى عندما يوجد بوضوح في مجموعة الشهادات المتاحة.
لا يُفرض استخدام مفتاح المُصدِر أثناء بناء السلسلة. يستدعي القسم 6.1.4(n) من RFC 5280 والقسم 3.5.3 من RFC 4158 للتحقق من أن امتداد keyUsage لمرشح المُصدِر يسمح بتوقيع الشهادات (keyCertSign) قبل اختيار ذلك المرشح. يؤجل OpenSSL هذا الفحص إلى مرحلة التحقق من الامتدادات اللاحقة: إذا وُجد مرشحان مُصدِران لشهادة، واختير الأول الذي يفتقر إلى keyCertSign أولًا، يفشل التحقق عند فحص الامتداد بدلًا من التراجع ومحاولة المرشح الآخر. يُكتشف سوء الاستخدام في النهاية، لكن لا تُبنى سلسلة كانت ستُتحقق عبر المُصدِر البديل.
يُخفف X509_V_FLAG_PARTIAL_CHAIN متطلب مرساة الثقة من ذلك المعرّف في القسم 6.1.1(d) من RFC 5280. مع تعيين العلم، تُقبل أي شهادة في مخزن الثقة كخاتمة للسلسلة، حتى لو لم تكن جذرًا موقّعًا ذاتيًا. هذا انحراف مقصود وشائع الآن يدعم الممارسات الحديثة مثل تثبيت الثقة على وسيط معين، أو تقصير السلاسل بمعاملة وسيط موثوق بدرجة كافية كنقطة ثقة وحذف الجذر فوقه. ومع ذلك، يجب أن يدرك المستدعون أن السلسلة المُعادة في هذا الوضع لا تنتهي بالضرورة عند مرساة ثقة بنمط RFC 5280.
يحد NAME_CONSTRAINTS_check(3) كل فحص لكل زوج عند 2**20 مقارنة، لكن مُنسّق السلسلة يُصدر N(N-1)/2 من هذه الفحوصات لسلسلة من N شهادة. يمكن للخصم الذي يُرسل سلسلة مبنية بأقصى حد أن يُجبر على ما يصل إلى حوالي 6.3 مليون مقارنة لقيود الأسماء في سلسلة من أربع شهادات (ورقة واحدة وثلاثة مُوقّعين مقيدين بالأسماء)، أو حوالي 5.2 مليار عند حد عمق السلسلة المبدئي البالغ 100.
انظر أيضًا¶
NAME_CONSTRAINTS_check(3), SSL_add_expected_rpk(3), SSL_CTX_dane_enable(3), SSL_dane_tlsa_add(3), X509_STORE_CTX_new(3), X509_STORE_CTX_init(3), X509_STORE_CTX_init_rpk(3), X509_STORE_CTX_get_error(3), X509_STORE_CTX_set_verify_cb(3), X509_STORE_set_verify_cb_func(3), X509_VERIFY_PARAM_set_flags(3)
التاريخ¶
X509_build_chain() و X509_STORE_CTX_verify() أُضيفتا في OpenSSL 3.0.
حقوق النسخ¶
حقوق النشر 2009-2026 لمؤلفي مشروع OpenSSL. جميع الحقوق محفوظة.
مرخص بموجب رخصة Apache 2.0 (المشار إليها فيما يلي بـ ”الرخصة“). لا يجوز لك استخدام هذا الملف إلا وفقًا لشروط الرخصة. يمكنك الحصول على نسخة منها في الملف LICENSE الموجود في حزمة التوزيع المصدرية أو على الرابط <https://www.openssl.org/source/license.html>.
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 29 سبتمبر 2026 | 3.6.5 |