SSL_CTX_SET_GENERATE_SESSION_ID(3SSL)

الاسم
SSL_CTX_set_generate_session_id, SSL_set_generate_session_id, SSL_has_matching_session_id, GEN_SESSION_CB - معالجة توليد مُعرّفات جلسة SSL (للخادم فقط)

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

 typedef int (*GEN_SESSION_CB)(SSL *ssl, unsigned char *id,
                               unsigned int *id_len);

 int SSL_CTX_set_generate_session_id(SSL_CTX *ctx, GEN_SESSION_CB cb);
 int SSL_set_generate_session_id(SSL *ssl, GEN_SESSION_CB, cb);
 int SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
                                 unsigned int id_len);

الوصف
SSL_CTX_set_generate_session_id() تُعيِّن دالة الاستدعاء لتوليد مُعرّفات جلسة جديدة لجلسات SSL/TLS لـ ctx لتكون cb.

SSL_set_generate_session_id() تُعيِّن دالة الاستدعاء لتوليد مُعرّفات جلسة جديدة لجلسات SSL/TLS لـ ssl لتكون cb.

SSL_has_matching_session_id() تتحقق مما إذا كانت جلسة ذات مُعرّف id (بطول id_len) موجودة بالفعل في خبيئة الجلسة الداخلية للسياق الأصلي لـ ssl.

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

بدون تعيين دالة استدعاء، سيُولِّد خادم OpenSSL مُعرّف جلسة فريدًا من أرقام شبه عشوائية بأقصى طول ممكن. باستخدام دالة الاستدعاء، يمكن تغيير مُعرّف الجلسة ليحتوي على معلومات إضافية مثل مُعرّف مضيف لتحسين موازنة التحميل أو تقنيات التخزين المؤقت الخارجي.

تستقبل دالة الاستدعاء مؤشرًا إلى موقع الذاكرة لوضع id فيه ومؤشرًا إلى الحد الأقصى المسموح به للطول id_len. المخزن المؤقت في الموقع id مضمون فقط أن يكون بحجم id_len. يُسمح لدالة الاستدعاء فقط بتوليد مُعرّف أقصر وتقليل id_len؛ يجب ألّا تزيد دالة الاستدعاء id_len أو تكتب في الموقع id متجاوزة الحد المعطى.

يُملأ الموقع id بـ 0x00 قبل استدعاء دالة الاستدعاء، لذا قد تملأ دالة الاستدعاء جزءًا فقط من الطول الممكن وتترك id_len دون تغيير مع الحفاظ على قابلية التكرار.

نظرًا لأن الجلسات يجب أن تُفرَّق، يجب أن تكون مُعرّفات الجلسة فريدة. بدون دالة الاستدعاء، يُستخدم رقم عشوائي، بحيث يكون احتمال توليد نفس مُعرّف الجلسة صغيرًا جدًا (2^256 لـ SSLv3/TLSv1). لضمان تفرد مُعرّف الجلسة المُولَّد، يجب على دالة الاستدعاء استدعاء SSL_has_matching_session_id() وتوليد مُعرّف آخر إذا حدث تعارض. إذا لم يُحل تعارض المُعرّف، سيفشل المصافحة. إذا رمّز التطبيق مثلًا مُعرّف مضيف فريد، ورقم عملية فريد، ورقم تسلسلي فريد في مُعرّف الجلسة، يمكن تحقيق التفرد بسهولة دون إضافة عشوائية (ومع ذلك يجب الحرص على عدم تسريب معلومات سرية بهذه الطريقة). إذا لم يستطع التطبيق ضمان التفرد، يُوصى باستخدام الحد الأقصى id_len وملء البايتات غير المستخدمة لترميز معلومات خاصة ببيانات عشوائية لتجنب التصادمات.

SSL_has_matching_session_id() ستستعلم فقط عن خبيئة الجلسة الداخلية، وليس الخارجية. نظرًا لأن مُعرّف الجلسة يُولَّد قبل اكتمال المصافحة، لا يُضاف فورًا إلى الخبيئة. إذا كان خيط آخر يستخدم نفس خبيئة الجلسة الداخلية، يمكن أن تحدث حالة سباق حيث يُولِّد خيط آخر نفس مُعرّف الجلسة. يمكن أن تحدث التصادمات أيضًا عند استخدام خبيئة جلسة خارجية، لأن الخبيئة الخارجية لا تُختبر مع SSL_has_matching_session_id() وتنطبق نفس حالة السباق.

يجب أن تُرجع دالة الاستدعاء 0 إذا لم تستطع توليد مُعرّف جلسة لأي سبب، وتُرجع 1 عند النجاح.

القيم المُرجعة
SSL_CTX_set_generate_session_id() و SSL_set_generate_session_id() تُرجعان 1 عند النجاح و0 عند الفشل.

SSL_has_matching_session_id() تُرجع 1 إذا كانت جلسة أخرى بنفس المُعرّف موجودة بالفعل في الخبيئة، أو 0 بخلاف ذلك.

أمثلة
دالة الاستدعاء المدرجة ستُولِّد مُعرّف جلسة مع مُعرّف الخادم المُعطى، وستملأ الباقي ببايتات شبه عشوائية:

 const char session_id_prefix = "www-18";

 #define MAX_SESSION_ID_ATTEMPTS 10
 static int generate_session_id(SSL *ssl, unsigned char *id,
                                unsigned int *id_len)
 {
     unsigned int count = 0;

     do {
         RAND_pseudo_bytes(id, *id_len);
         /*
          * بادئة مُعرّف الجلسة بالبادئة المطلوبة. ملاحظة: إذا كانت
          * البادئة طويلة جدًا، قصّها - لكن ستكون هناك تأثيرات أسوأ
          * على أي حال، مثلًا قد يتمكن الخادم من إنشاء مُعرّف جلسة
          * واحد فقط (أي البادئة!) لذا ستفشل جميع مفاوضات الجلسة
          * المستقبلية بسبب التعارضات.
          */
         memcpy(id, session_id_prefix, strlen(session_id_prefix) < *id_len ?
                                       strlen(session_id_prefix) : *id_len);
     } while (SSL_has_matching_session_id(ssl, id, *id_len)
               && ++count < MAX_SESSION_ID_ATTEMPTS);
     if (count >= MAX_SESSION_ID_ATTEMPTS)
         return 0;
     return 1;
 }

انظر أيضًا
ssl(7), SSL_get_version(3)

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