को कैसे कार्यान्वित करें सी या सी ++ में ओपनएसएसएल पर सर्वर नाम संकेत (एसएनआई) को कैसे कार्यान्वित करें?सर्वर नाम संकेत (एसएनआई)
क्या कोई वास्तविक दुनिया उदाहरण उपलब्ध हैं?
को कैसे कार्यान्वित करें सी या सी ++ में ओपनएसएसएल पर सर्वर नाम संकेत (एसएनआई) को कैसे कार्यान्वित करें?सर्वर नाम संकेत (एसएनआई)
क्या कोई वास्तविक दुनिया उदाहरण उपलब्ध हैं?
ग्राहक पक्ष पर, आप SSL कनेक्शन शुरू करने से पहले SSL_set_tlsext_host_name(ssl, servername)
का उपयोग करते हैं।
सर्वर साइड पर, यह एक छोटे से अधिक जटिल है:
SSL_CTX()
;SSL_CTX_set_tlsext_servername_callback()
का उपयोग करके प्रत्येक SSL_CTX()
पर एक सेरनावैम कॉलबैक जोड़ें;SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name)
के साथ पुनर्प्राप्त करें। उस होस्ट नाम के साथ जाने के लिए दाएं SSL_CTX
पर चित्रित करें, फिर SSL
ऑब्जेक्ट SSL_CTX
पर SSL_set_SSL_CTX()
पर स्विच करें। OpenSSL स्रोत वितरण के apps/
निर्देशिका मेंs_client.c
और s_server.c
फ़ाइलें इस कार्यक्षमता को लागू है, इसलिए वे एक अच्छा संसाधन हैं देखने के लिए कि यह कैसे किया जाना चाहिए।
s_client.c और s_server.c अच्छे उदाहरण हैं। मैं एक ऐसे ग्राहक पर एसएनआई लागू करने की कोशिश कर रहा हूं जो भार जनरेटर (नेटवर्क) के रूप में कार्य करता है और http/https अनुरोधों वाला सर्वर हैमर करता है। और सर्वर पहले से ही सर्वर पक्ष एसएनआई लागू है। –
क्या सर्वर कॉल बहुमत वाले संदर्भ में होल्ड करते हैं? ऐसा लगता है कि SSL_set_SSL_CTX सहज रूप से थ्रेडसेफ नहीं है (यानी यदि आपके पास दो अलग-अलग कर्ट के साथ दो अलग-अलग इनबाउंड कनेक्शन हैं, तो आपको कोई समस्या होगी)। – chacham15
@ chacham15: इसे थ्रेड-सुरक्षित बनाने का एक तरीका है एक प्रति एसएसएल_सीटीएक्स() 'प्रति प्रमाणपत्र, प्रति थ्रेड आवंटित करना (और उसी थ्रेड से हमेशा 'एसएसएल' और 'एसएसएल_सीटीएक्स' ऑब्जेक्ट्स को संभालना)। दूसरा तरीका 'CRYPTO_set_id_callback()' और 'CRYPTO_set_locking_callback()' के साथ थ्रेड कॉलबैक सेट करना है, इस मामले में ओपनएसएसएल 'SSL_set_SSL_CTX() 'थ्रेड-सुरक्षित बनाने के लिए लॉकिंग कॉलबैक पर सही कॉल करेगा। – caf
कुछ कोड उदाहरणों और उपयोग के लिए यह भी देखें [एसएनआई के साथ एक बॉक्स में एकाधिक डोमेन की सेवा] [http://stackoverflow.com/questions/22373332/serving-multiple-domains-in-one-box-with-sni) अपने सर्वर का परीक्षण करने के लिए 's_client'। – jww