X509_STORE_CTX_SET_VERIFY_CB(3ssl)

الاسم
X509_STORE_CTX_get_cleanup, X509_STORE_CTX_get_lookup_crls, X509_STORE_CTX_get_lookup_certs, X509_STORE_CTX_get_check_policy, X509_STORE_CTX_get_cert_crl, X509_STORE_CTX_get_check_crl, X509_STORE_CTX_get_get_crl, X509_STORE_CTX_set_get_crl, X509_STORE_CTX_get_check_revocation, X509_STORE_CTX_get_check_issued, X509_STORE_CTX_get_get_issuer, X509_STORE_CTX_get_verify_cb, X509_STORE_CTX_set_verify_cb, X509_STORE_CTX_verify_cb, X509_STORE_CTX_print_verify_cb, X509_STORE_CTX_set_current_reasons - الحصول على مكونات X509_STORE_CTX وتعيينها، مثل رد الاتصال للتحقق.

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

 typedef int (*X509_STORE_CTX_verify_cb)(int, X509_STORE_CTX *);
 int X509_STORE_CTX_print_verify_cb(int ok, X509_STORE_CTX *ctx);

 X509_STORE_CTX_verify_cb X509_STORE_CTX_get_verify_cb(X509_STORE_CTX *ctx);

 void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
                                   X509_STORE_CTX_verify_cb verify_cb);

 X509_STORE_CTX_get_issuer_fn X509_STORE_CTX_get_get_issuer(X509_STORE_CTX *ctx);
 X509_STORE_CTX_check_issued_fn X509_STORE_CTX_get_check_issued(X509_STORE_CTX *ctx);
 X509_STORE_CTX_check_revocation_fn X509_STORE_CTX_get_check_revocation(X509_STORE_CTX *ctx);

 X509_STORE_CTX_get_crl_fn X509_STORE_CTX_get_get_crl(X509_STORE_CTX *ctx);

 void X509_STORE_CTX_set_get_crl(X509_STORE_CTX *ctx,
                                 X509_STORE_CTX_get_crl_fn get_crl);

 X509_STORE_CTX_check_crl_fn X509_STORE_CTX_get_check_crl(X509_STORE_CTX *ctx);
 X509_STORE_CTX_cert_crl_fn X509_STORE_CTX_get_cert_crl(X509_STORE_CTX *ctx);
 X509_STORE_CTX_check_policy_fn X509_STORE_CTX_get_check_policy(X509_STORE_CTX *ctx);
 X509_STORE_CTX_lookup_certs_fn X509_STORE_CTX_get_lookup_certs(X509_STORE_CTX *ctx);
 X509_STORE_CTX_lookup_crls_fn X509_STORE_CTX_get_lookup_crls(X509_STORE_CTX *ctx);
 X509_STORE_CTX_cleanup_fn X509_STORE_CTX_get_cleanup(X509_STORE_CTX *ctx);
 void X509_STORE_CTX_set_current_reasons(X509_STORE_CTX *ctx,
                                         unsigned int current_reasons);

الوصف
X509_STORE_CTX_set_verify_cb() تعيّن دالة استرجاع التحقق لـ ctx إلى verify_cb مع استبدال أي دالة استرجاع موجودة.

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

ومع ذلك، فإن دالة استرجاع التحقق ليست أساسية وغالبًا ما تكون العملية المبدئية كافية.

يشير المعامل ok إلى القيمة التي يجب أن تُرجعها دالة الاسترجاع للحفاظ على السلوك المبدئي. إذا كانت صفرًا، يُشار إلى حالة خطأ. إذا كانت 1، لم يحدث خطأ. إذا وُضعت العلامة X509_V_FLAG_NOTIFY_POLICY، فتُعيّن ok إلى 2 للإشارة إلى اكتمال فحص السياسة.

المعامل ctx لدالة الاسترجاع هو بنية X509_STORE_CTX التي تنفذ عملية التحقق. يمكن لدالة الاسترجاع فحص هذه البنية واستلام معلومات إضافية حول الخطأ، على سبيل المثال عن طريق استدعاء X509_STORE_CTX_get_current_cert(). يمكن تمرير بيانات تطبيق إضافية إلى دالة الاسترجاع عبر آلية ex_data.

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

X509_STORE_CTX_get_verify_cb() تُرجع قيمة دالة الاسترجاع الحالية لـ ctx المحدد.

X509_STORE_CTX_get_get_issuer()، X509_STORE_CTX_get_check_issued()، X509_STORE_CTX_get_check_revocation()، X509_STORE_CTX_get_get_crl()، X509_STORE_CTX_get_check_crl()، X509_STORE_CTX_get_cert_crl()، X509_STORE_CTX_get_check_policy()، X509_STORE_CTX_get_lookup_certs()، X509_STORE_CTX_get_lookup_crls() و X509_STORE_CTX_get_cleanup() تُرجع مؤشرات الدوال المخبأة من X509_STORE المقابل، يُرجى الاطلاع على X509_STORE_set_verify(3) لمزيد من المعلومات.

X509_STORE_CTX_set_get_crl() تعيّن الدالة للحصول على crl لشهادة معينة x. عند العثور عليها، يجب تعيين crl إلى *crl. يجب أن تُرجع هذه الدالة 0 عند الفشل و1 عند النجاح. إذا لم تُوفّر دالة للحصول على المُصدِر، فستُستخدم الدالة المبدئية الداخلية بدلاً من ذلك.

X509_STORE_CTX_set_current_reasons() تُستخدم بالتزامن مع X509_STORE_CTX_get_crl_fn. يجب أن تستخدم دالة الاسترجاع X509_STORE_CTX_get_crl_fn هذه الطريقة لتعيين سبب كون الشهادة غير صالحة.

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

ملاحظات
يمكن تعيين دالة استرجاع التحقق وتوريثها من البنية الأصلية التي تنفذ العملية. في بعض الحالات (مثل التحقق من S/MIME)، تُنشأ بنية X509_STORE_CTX وتُدمر داخليًا، والطريقة الوحيدة لتعيين دالة استرجاع تحقق مخصصة هي عن طريق توريثها من X509_STORE المرتبط.

القيم المُرجعة
X509_STORE_CTX_set_verify_cb() لا تُرجع قيمة.

أمثلة
عملية دالة الاسترجاع المبدئية:

 int verify_callback(int ok, X509_STORE_CTX *ctx) {
     return ok;
 }

مثال بسيط، افترض أن شهادة في السلسلة منتهية الصلاحية ونرغب في الاستمرار بعد هذا الخطأ:

 int verify_callback(int ok, X509_STORE_CTX *ctx) {
     /* Tolerate certificate expiration */
     if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_CERT_HAS_EXPIRED)
         return 1;
     /* Otherwise don't override */
     return ok;
 }

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

 int verify_callback(int ok, X509_STORE_CTX *ctx)
 {
     int err = X509_STORE_CTX_get_error(ctx);
     X509 *err_cert = X509_STORE_CTX_get_current_cert(ctx);

     if (err == X509_V_ERR_CERT_HAS_EXPIRED) {
         if (check_is_acceptable_expired_cert(err_cert)
             return 1;
     }
     return ok;
 }

دالة رد اتصال تسجيل كاملة الميزات. في هذه الحالة، يُفترض أن bio_err هو BIO تسجيل عام، وبديل ذلك هو تخزين BIO في ctx باستخدام ex_data.

 int verify_callback(int ok, X509_STORE_CTX *ctx)
 {
     X509 *err_cert;
     int err, depth;

     err_cert = X509_STORE_CTX_get_current_cert(ctx);
     err = X509_STORE_CTX_get_error(ctx);
     depth = X509_STORE_CTX_get_error_depth(ctx);

     BIO_printf(bio_err, "depth=%d ", depth);
     if (err_cert) {
         X509_NAME_print_ex(bio_err, X509_get_subject_name(err_cert),
                            0, XN_FLAG_ONELINE);
         BIO_puts(bio_err, "\n");
     }
     else
         BIO_puts(bio_err, "<no cert>\n");
     if (!ok)
         BIO_printf(bio_err, "verify error:num=%d:%s\n", err,
                    X509_verify_cert_error_string(err));
     switch (err) {
     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
         BIO_puts(bio_err, "issuer= ");
         X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert),
                            0, XN_FLAG_ONELINE);
         BIO_puts(bio_err, "\n");
         break;
     case X509_V_ERR_CERT_NOT_YET_VALID:
     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
         BIO_printf(bio_err, "notBefore=");
         ASN1_TIME_print(bio_err, X509_get_notBefore(err_cert));
         BIO_printf(bio_err, "\n");
         break;
     case X509_V_ERR_CERT_HAS_EXPIRED:
     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
         BIO_printf(bio_err, "notAfter=");
         ASN1_TIME_print(bio_err, X509_get_notAfter(err_cert));
         BIO_printf(bio_err, "\n");
         break;
     case X509_V_ERR_NO_EXPLICIT_POLICY:
         policies_print(bio_err, ctx);
         break;
     }
     if (err == X509_V_OK && ok == 2)
         /* print out policies */

     BIO_printf(bio_err, "verify return:%d\n", ok);
     return(ok);
 }

انظر أيضًا
X509_STORE_CTX_get_error(3) X509_STORE_set_verify_cb_func(3) X509_STORE_CTX_get_ex_new_index(3)

التاريخ
الدوال X509_STORE_CTX_get_get_issuer(), X509_STORE_CTX_get_check_issued(), X509_STORE_CTX_get_check_revocation(), X509_STORE_CTX_get_get_crl(), X509_STORE_CTX_get_check_crl(), X509_STORE_CTX_get_cert_crl(), X509_STORE_CTX_get_check_policy(), X509_STORE_CTX_get_lookup_certs(), X509_STORE_CTX_get_lookup_crls() و X509_STORE_CTX_get_cleanup() أُضيفت في OpenSSL 1.1.0.

X509_STORE_CTX_print_verify_cb() أُضيفت في OpenSSL 3.0.

حقوق النسخ
حقوق النشر 2009-2023 لمؤلفي مشروع 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.