.\" -*- coding: UTF-8 -*- .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .de IX .. .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .if n .ds AD l .\" .\" Required to disable full justification in groff 1.23.0. .\" ======================================================================== .\" .IX Title "SSL_CTX_SET_VERIFY 3ssl" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH SSL_CTX_SET_VERIFY 3ssl "7 أبريل 2026" 3.6.2 OpenSSL .if n .ad l .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .nh .SH الاسم SSL_get_ex_data_X509_STORE_CTX_idx, SSL_CTX_set_verify, SSL_set_verify, SSL_CTX_set_verify_depth, SSL_set_verify_depth, SSL_verify_cb, SSL_verify_client_post_handshake, SSL_set_post_handshake_auth, SSL_CTX_set_post_handshake_auth \&\- ضبط معاملات SSL/TLS مختلفة للتحقق من شهادة النظير .SH موجز .IX Header موجز .Vb 1 \& #include \& \& typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx); \& \& void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, SSL_verify_cb verify_callback); \& void SSL_set_verify(SSL *ssl, int mode, SSL_verify_cb verify_callback); \& SSL_get_ex_data_X509_STORE_CTX_idx(void); \& \& void SSL_CTX_set_verify_depth(SSL_CTX *ctx, int depth); \& void SSL_set_verify_depth(SSL *ssl, int depth); \& \& int SSL_verify_client_post_handshake(SSL *ssl); \& void SSL_CTX_set_post_handshake_auth(SSL_CTX *ctx, int val); \& void SSL_set_post_handshake_auth(SSL *ssl, int val); .Ve .SH الوصف .IX Header الوصف \&\fBSSL_CTX_set_verify()\fP تضبط أعلام التحقق لـ \fBctx\fP لتكون \fBmode\fP وتحدد دالة \fBverify_callback\fP المستخدمة. إذا لم تُحدد دالة رد نداء، يمكن استخدام المؤشر NULL لـ \fBverify_callback\fP. \fBctx\fP \fBيجب ألا\fP يكون NULL. .PP \&\fBSSL_set_verify()\fP تضبط أعلام التحقق لـ \fBssl\fP لتكون \fBmode\fP وتحدد دالة \fBverify_callback\fP المستخدمة. إذا لم تُحدد دالة رد نداء، يمكن استخدام المؤشر NULL لـ \fBverify_callback\fP. في هذه الحالة، يبقى آخر \fBverify_callback\fP مضبوط خصيصًا لهذا \fBssl\fP. إذا لم يُضبط \fBcallback\fP خاص من قبل، يُستخدم رد النداء المبدئي لـ \&\fBctx\fP الأساسي، الذي كان صالحًا وقت إنشاء \fBssl\fP باستخدام \&\fBSSL_new\fP\|(3). داخل دالة رد النداء، يمكن استدعاء \&\fBSSL_get_ex_data_X509_STORE_CTX_idx\fP للحصول على فهرس بيانات كائن SSL الحالي الذي يقوم بالتحقق. .PP في وضع العميل، قد تستدعي \fBverify_callback\fP أيضًا دالة \fBSSL_set_retry_verify\fP\|(3) على كائن \fBSSL\fP المضبوط في البيانات الإضافية \fIx509_store_ctx\fP (انظر \&\fBSSL_get_ex_data_X509_STORE_CTX_idx\fP\|(3)) وتُرجع 1. يُفعل هذا عادةً عندما لا يتمكن التحقق من الشهادة من النجاح بعد. يؤدي هذا إلى تعليق المصافحة وإعادة التحكم إلى التطبيق المستدعي مع \fBSSL_ERROR_WANT_RETRY_VERIFY\fP. يمكن للتطبيق، على سبيل المثال، جلب شهادات إضافية أو معلومات حالة الشهادة اللازمة للتحقق. استدعاء \fBSSL_connect\fP\|(3) مرة أخرى يستأنف محاولة الاتصال بإعادة محاولة خطوة التحقق من شهادة الخادم. قد تُكرر هذه العملية إذا لزم الأمر. لاحظ أن المصافحة قد تُلغى إذا أعاد استدعاء لاحق لرد النداء (مثلًا، على عمق أقل، أو لشرط خطأ منفصل) القيمة 0. .PP \&\fBSSL_CTX_set_verify_depth()\fP تضبط أقصى \fBdepth\fP للتحقق من سلسلة الشهادات المسموح به لـ \fBctx\fP. .PP \&\fBSSL_set_verify_depth()\fP تضبط أقصى \fBdepth\fP للتحقق من سلسلة الشهادات المسموح به لـ \fBssl\fP. .PP \&\fBSSL_CTX_set_post_handshake_auth()\fP و \fBSSL_set_post_handshake_auth()\fP تُفعِّلان إضافة امتداد المصادقة بعد المصافحة إلى ClientHello بحيث يمكن للخادم طلب المصادقة بعد المصافحة. إذا كانت \fBval\fP تساوي 0، لا يُرسل الامتداد، وإلا يُرسل. مبدئيًا، لا يُرسل الامتداد. يجب ضبط رد نداء شهادة عبر \&\fBSSL_CTX_set_client_cert_cb()\fP إذا لم تُقدم شهادة عند التهيئة. .PP \&\fBSSL_verify_client_post_handshake()\fP تُسبب إرسال رسالة طلب شهادة من خادم على اتصال \fBssl\fP المعطى. يجب ضبط العلم SSL_VERIFY_PEER؛ العلم SSL_VERIFY_POST_HANDSHAKE اختياري. .SH ملاحظات .IX Header ملاحظات يمكن التحكم في التحقق من الشهادات بواسطة مجموعة من أعلام \fBmode\fP المدمجة منطقيًا بـ "أو": .IP SSL_VERIFY_NONE 4 .IX Item SSL_VERIFY_NONE \&\fBوضع الخادم:\fP لن يرسل الخادم طلب شهادة عميل إلى العميل، لذا لن يرسل العميل شهادة. .Sp \&\fBوضع العميل:\fP إذا لم يُستخدم مُعمٍّ مجهول (معطل مبدئيًا)، سيرسل الخادم شهادة سيُفحص. يمكن فحص نتيجة عملية التحقق من الشهادة بعد مصافحة TLS/SSL باستخدام دالة \fBSSL_get_verify_result\fP\|(3). ستستمر المصافحة بغض النظر عن نتيجة التحقق. .IP SSL_VERIFY_PEER 4 .IX Item SSL_VERIFY_PEER \&\fBوضع الخادم:\fP يرسل الخادم طلب شهادة عميل إلى العميل. تُفحص الشهادة المُعادة (إن وُجدت). إذا فشلت عملية التحقق، تُنهى مصافحة TLS/SSL فورًا برسالة تنبيه تحتوي على سبب فشل التحقق. يمكن التحكم في السلوك بواسطة الأعلام الإضافية SSL_VERIFY_FAIL_IF_NO_PEER_CERT و SSL_VERIFY_CLIENT_ONCE و SSL_VERIFY_POST_HANDSHAKE. .Sp \&\fBوضع العميل:\fP تُتحقق شهادة الخادم. إذا فشلت عملية التحقق، تُنهى مصافحة TLS/SSL فورًا برسالة تنبيه تحتوي على سبب فشل التحقق. إذا لم تُرسل شهادة خادم، بسبب استخدام مُعمٍّ مجهول، يُتجاهل SSL_VERIFY_PEER. .IP SSL_VERIFY_FAIL_IF_NO_PEER_CERT 4 .IX Item SSL_VERIFY_FAIL_IF_NO_PEER_CERT \&\fBوضع الخادم:\fP إذا لم يُعد العميل شهادة، تُنهى مصافحة TLS/SSL فورًا بتنبية "فشل المصافحة". يجب استخدام هذا العلم مع SSL_VERIFY_PEER. .Sp \&\fBوضع العميل:\fP تم تجاهله (انظر الأخطاء) .IP SSL_VERIFY_CLIENT_ONCE 4 .IX Item SSL_VERIFY_CLIENT_ONCE \&\fBوضع الخادم:\fP يُطلب شهادة العميل مرة واحدة فقط أثناء الاتصال. لا يُطلب شهادة العميل مرة أخرى أثناء إعادة التفاوض أو ما بعد الاستيثاق إذا طُلبت شهادة أثناء المصافحة الأولية. يجب استخدام هذه العلامة مع SSL_VERIFY_PEER. .Sp \&\fBوضع العميل:\fP تم تجاهله (انظر الأخطاء) .IP SSL_VERIFY_POST_HANDSHAKE 4 .IX Item SSL_VERIFY_POST_HANDSHAKE \&\fBوضع الخادم:\fP لن يُرسل الخادم طلب شهادة عميل أثناء المصافحة الأولية، بل يُرسل الطلب عبر \&\fBSSL_verify_client_post_handshake()\fP. يسمح هذا بتكوين SSL_CTX أو SSL للتحقق من النظير بعد المصافحة قبل حدوث المصافحة. يجب استخدام هذه العلامة مع SSL_VERIFY_PEER. TLSv1.3 فقط؛ لا تأثير على اتصالات ما قبل TLSv1.3. .Sp \&\fBوضع العميل:\fP تم تجاهله (انظر الأخطاء) .PP إذا كان \fBالوضع\fP هو SSL_VERIFY_NONE، فلا يجوز تعيين أي من العلامات الأخرى. .PP إذا لم تُعدّل علامات التحقق صراحةً بواسطة \f(CWSSL_CTX_set_verify()\fP أو \f(CWSSL_set_verify()\fP، فستكون القيمة المبدئية هي SSL_VERIFY_NONE. .PP تُنفذ عملية التحقق الفعلية إما باستخدام إجراء التحقق المدمج أو باستخدام دالة تحقق مقدمة من تطبيق آخر معيّنة مع \&\fBSSL_CTX_set_cert_verify_callback\fP\|(3). تنطبق الأوصاف التالية في حالة الإجراء المدمج. كما أن للإجراء المقدم من التطبيق وصول إلى معلومات عمق التحقق ودالة \fBverify_callback()\fP، لكن طريقة استخدام هذه المعلومات قد تكون مختلفة. .PP \&\fBSSL_CTX_set_verify_depth()\fP و \fBSSL_set_verify_depth()\fP يضعان حدًا لعدد الشهادات بين شهادات الكيان النهائي ومرساة الثقة. لا تُحتسب شهادات الكيان النهائي ولا مرساة الثقة ضمن \fBالعمق\fP. إذا كانت سلسلة الشهادات اللازمة للوصول إلى مُصدر موثوق أطول من \fBالعمق+2\fP، فسيُصدر X509_V_ERR_CERT_CHAIN_TOO_LONG. يُحسب العمق كـ "المستوى 0: شهادة النظير"، "المستوى 1: شهادة CA"، "المستوى 2: شهادة CA ذات مستوى أعلى"، وهكذا. تعيين الحد الأقصى للعمق إلى 2 يسمح بالمستويات 0 و1 و2 و3 (0 هو الكيان النهائي و3 هو مرساة الثقة). الحد المبدئي للعمق هو 100، مما يسمح بشهادة النظير، وعلى الأكثر 100 شهادة CA وسيطة وشهادة مرساة ثقة نهائية. .PP تُستخدم دالة \fBverify_callback\fP للتحكم في السلوك عند تعيين علامة SSL_VERIFY_PEER. يجب أن تُوفر من قبل التطبيق وتستقبل وسيطين: يشير \fBpreverify_ok\fP إلى ما إذا كان التحقق من الشهادة المعنية قد نُجح (preverify_ok=1) أم لا (preverify_ok=0). \fBx509_ctx\fP هو مؤشر إلى السياق الكامل المستخدم للتحقق من سلسلة الشهادات. .PP تُفحص سلسلة الشهادات بدءًا من أعمق مستوى تداخل (شهادة CA الجذر) وتتجه صعودًا إلى شهادة النظير. في كل مستوى، تُفحص التوقيعات وسمات المُصدر. كلما وُجد خطأ تحقق، يُخزن رقم الخطأ في \fBx509_ctx\fP وتُستدعى \fBverify_callback\fP مع \fBpreverify_ok\fP=0. بتطبيق دوال X509_CTX_store_*، يمكن لـ \fBverify_callback\fP تحديد موقع الشهادة المعنية وتنفيذ خطوات إضافية (انظر الأمثلة). إذا لم يُعثر على خطأ لشهادة، تُستدعى \fBverify_callback\fP مع \fBpreverify_ok\fP=1 قبل التقدم إلى المستوى التالي. .PP تتحكم قيمة إرجاع \fBverify_callback\fP في استراتيجية عملية التحقق الإضافية. إذا أعادت \fBverify_callback\fP 0، تتوقف عملية التحقق فورًا مع حالة "فشل التحقق". إذا عُيّنت SSL_VERIFY_PEER، يُرسل تنبيه فشل التحقق إلى النظير وتُنهى مصافحة TLS/SSL. إذا أعادت \fBverify_callback\fP 1، تُستمر عملية التحقق. إذا أعادت \fBverify_callback\fP دائمًا 1، فلن تُنهى مصافحة TLS/SSL بسبب إخفاقات التحقق وسيُؤسس الاتصال. يمكن لعملية الاستدعاء مع ذلك استرداد رمز خطأ آخر خطأ تحقق باستخدام \&\fBSSL_get_verify_result\fP\|(3) أو بالحفاظ على مخزن أخطاء خاص بها يُدار بواسطة \fBverify_callback\fP. .PP إذا لم يُحدد \fBverify_callback\fP، فسيُستخدم الاستدعاء المبدئي. قيمته المرجعة مطابقة لـ \fBpreverify_ok\fP، لذا فإن أي فشل تحقق سيؤدي إلى إنهاء مصافحة TLS/SSL مع رسالة تنبيه، إذا عُيّنت SSL_VERIFY_PEER. .PP بعد استدعاء \fBSSL_set_post_handshake_auth()\fP، سيحتاج العميل إلى إضافة شهادة أو استدعاء شهادة إلى تكوينه قبل أن يتمكن من الاستيثاق بنجاح. يجب استدعاء هذا قبل \fBSSL_connect()\fP. .PP \&\fBSSL_verify_client_post_handshake()\fP يتطلب أن تكون علامات التحقق قد عُيّنت مسبقًا، وأن العميل قد أرسل امتداد الاستيثاق بعد المصافحة. عندما يُرجع العميل شهادة، سيُستدعى استدعاء التحقق. يجب أن تحدث عملية كتابة لإرسال طلب الشهادة إلى العميل، يمكن القيام بذلك باستخدام \fBSSL_do_handshake()\fP أو \fBSSL_write_ex()\fP. قد يكون طلب شهادة واحد فقط معلقًا في أي وقت. .PP عند حدوث الاستيثاق بعد المصافحة، تُرسل رسالة NewSessionTicket مُحدّثة إلى العميل. .PP لا يمكن استخدام الاستيثاق بعد المصافحة مع QUIC. \&\fBSSL_set_post_handshake_auth()\fP ليس له تأثير إذا استُدعي على كائن SSL من نوع QUIC. .SH العلل .IX Header العلل في وضع العميل، لا يُتحقق مما إذا كانت علامة SSL_VERIFY_PEER معيّنة، بل مما إذا كانت أي علامات غير SSL_VERIFY_NONE معيّنة. قد يؤدي هذا إلى سلوك غير متوقع إذا لم تُستخدم SSL_VERIFY_PEER والعلامات الأخرى كما هو مطلوب. .SH "القيم المُرجعة" .IX Header "القيم المُرجعة" لا توفر دوال SSL*_set_verify*() معلومات تشخيصية. .PP تُرجع دالة \fBSSL_verify_client_post_handshake()\fP 1 إذا نجح الطلب، و0 إذا فشل الطلب. يمكن فحص مكدس الأخطاء لتحديد سبب الفشل. .SH أمثلة .IX Header أمثلة تُحقق سلسلة التعليمات البرمجية التالية مثالاً لدالة \fBverify_callback\fP ستواصل دائمًا مصافحة TLS/SSL بغض النظر عن فشل التحقق، إذا رُغب. تُحقق الدالة回调 حدًا لعمق التحقق مع مخرجات معلوماتية أكثر. .PP تُطبع جميع أخطاء التحقق؛ وتُطبع معلومات عن سلسلة الشهادات عند الطلب. يُحقق المثال لخادم يسمح بشهادات العميل لكن لا يطلبها. .PP يستخدم المثال تقنية ex_data لتخزين بيانات التطبيق في/استرجاع بيانات التطبيق من بنية SSL (انظر \fBCRYPTO_get_ex_new_index\fP\|(3)، \&\fBSSL_get_ex_data_X509_STORE_CTX_idx\fP\|(3)). .PP .Vb 7 \& ... \& typedef struct { \& int verbose_mode; \& int verify_depth; \& int always_continue; \& } mydata_t; \& int mydata_index; \& \& ... \& static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) \& { \& char buf[256]; \& X509 *err_cert; \& int err, depth; \& SSL *ssl; \& mydata_t *mydata; \& \& err_cert = X509_STORE_CTX_get_current_cert(ctx); \& err = X509_STORE_CTX_get_error(ctx); \& depth = X509_STORE_CTX_get_error_depth(ctx); \& \& /* \& * Retrieve the pointer to the SSL of the connection currently treated \& * and the application specific data stored into the SSL object. \& */ \& ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()); \& mydata = SSL_get_ex_data(ssl, mydata_index); \& \& X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); \& \& /* \& * Catch a too long certificate chain. The depth limit set using \& * SSL_CTX_set_verify_depth() is by purpose set to "limit+1" so \& * that whenever the "depth>verify_depth" condition is met, we \& * have violated the limit and want to log this error condition. \& * We must do it here, because the CHAIN_TOO_LONG error would not \& * be found explicitly; only errors introduced by cutting off the \& * additional certificates would be logged. \& */ \& if (depth > mydata\->verify_depth) { \& preverify_ok = 0; \& err = X509_V_ERR_CERT_CHAIN_TOO_LONG; \& X509_STORE_CTX_set_error(ctx, err); \& } \& if (!preverify_ok) { \& printf("verify error:num=%d:%s:depth=%d:%s\en", err, \& X509_verify_cert_error_string(err), depth, buf); \& } else if (mydata\->verbose_mode) { \& printf("depth=%d:%s\en", depth, buf); \& } \& \& /* \& * At this point, err contains the last verification error. We can use \& * it for something special \& */ \& if (!preverify_ok && (err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)) { \& X509_NAME_oneline(X509_get_issuer_name(err_cert), buf, 256); \& printf("issuer= %s\en", buf); \& } \& \& if (mydata\->always_continue) \& return 1; \& else \& return preverify_ok; \& } \& ... \& \& mydata_t mydata; \& \& ... \& mydata_index = SSL_get_ex_new_index(0, "mydata index", NULL, NULL, NULL); \& \& ... \& SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE, \& verify_callback); \& \& /* \& * Let the verify_callback catch the verify_depth error so that we get \& * an appropriate error in the logfile. \& */ \& SSL_CTX_set_verify_depth(verify_depth + 1); \& \& /* \& * Set up the SSL specific data into "mydata" and store it into th SSL \& * structure. \& */ \& mydata.verify_depth = verify_depth; ... \& SSL_set_ex_data(ssl, mydata_index, &mydata); \& \& ... \& SSL_accept(ssl); /* check of success left out for clarity */ \& if (peer = SSL_get_peer_certificate(ssl)) { \& if (SSL_get_verify_result(ssl) == X509_V_OK) { \& /* The client sent a certificate which verified OK */ \& } \& } .Ve .SH "انظر أيضًا" .IX Header "انظر أيضًا" \&\fBssl\fP\|(7)، \fBSSL_new\fP\|(3)، \&\fBSSL_CTX_get_verify_mode\fP\|(3)، \&\fBSSL_get_verify_result\fP\|(3)، \&\fBSSL_CTX_load_verify_locations\fP\|(3)، \&\fBSSL_get_peer_certificate\fP\|(3)، \&\fBSSL_CTX_set_cert_verify_callback\fP\|(3)، \&\fBSSL_get_ex_data_X509_STORE_CTX_idx\fP\|(3)، \&\fBSSL_CTX_set_client_cert_cb\fP\|(3)، \&\fBCRYPTO_get_ex_new_index\fP\|(3) .SH التاريخ .IX Header التاريخ خيار SSL_VERIFY_POST_HANDSHAKE، والدالتان \fBSSL_verify_client_post_handshake()\fP و \fBSSL_set_post_handshake_auth()\fP أُضيفتا في OpenSSL 1.1.1. .SH "حقوق النسخ" .IX Header "حقوق النسخ" حقوق النشر 2000\-2024 لمؤلفي مشروع OpenSSL. جميع الحقوق محفوظة. .PP مرخص بموجب رخصة Apache 2.0 (المشار إليها فيما يلي بـ ”الرخصة“). لا يجوز لك استخدام هذا الملف إلا وفقًا لشروط الرخصة. يمكنك الحصول على نسخة منها في الملف LICENSE الموجود في حزمة التوزيع المصدرية أو على الرابط . .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .