2010-07-07 10 views
7

मेरे पास विकास में एक सर्वर है और कुछ डेवलपर्स इसे कनेक्ट कर रहे हैं। यह सर्वर SSLEngine के साथ जावा के TLS कार्यान्वयन का उपयोग करता है।जावा के एसएसएल रिवर्स डीएनएस लुकअप को अक्षम करने के लिए कैसे करें

हमने देखा कि, पहले, हर नए कनेक्शन में लंबी देरी होगी (30-40 सेकंड)। हमने डीएनएस लुकअप को रिवर्स करने के लिए इसे कम कर दिया। हमने हल किया कि हमारे सभी आईपी HOSTS फ़ाइल में डालकर।

अब समस्या यह है कि हम अपने उपयोगकर्ता आधार को प्रगतिशील रूप से विस्तारित करने जा रहे हैं और मैं HOSTS फ़ाइल को संपादित नहीं करना चाहता, खासकर जब से हम गारंटी नहीं दे सकते कि उनके पास स्थिर आईपी हैं।

जावा के एसएसएल/टीएलएस में रिवर्स डीएनएस लुकअप चरण को अक्षम करने का कोई तरीका है?

मैं इसे कॉन्फ़िगर करने योग्य पैरामीटर के रूप में रखना चाहता हूं, ताकि हम इसे विकास के दौरान बंद कर सकें।

+0

आप किस एप्लिकेशन सर्वर का उपयोग कर रहे हैं? ओरेकल वेबलॉगिक सर्वर सर्टिकॉम का उपयोग करता है, न कि सूर्य जेएसएसई कार्यान्वयन, इसलिए कॉन्फ़िगरेशन तंत्र भिन्न होते हैं। –

उत्तर

3

यह प्रश्न 2006 में Sun JSSE forums पर आया था। निचली पंक्ति यह है कि ऐसा लगता है कि यह केवल विंडोज जावा रनटाइम में होता है। this bug report में, नीचे की तरफ, एक प्रस्तावित समाधान है। और यहाँ another proposed solution है:

असल में, एसएसएल हाथ मिलाना दौरान रिवर्स DNS लुकअप एक लंबे टाइमआउट कारण बनता है।

समस्या को ठीक, एक InetAddress वस्तु के रूप में अपने सर्वर पता कैश और सॉकेट निर्माता जब भी आप अपने सर्वर से एक नया संबंध बना रहे हैं में यह पुन: उपयोग करने के लिए।

उम्मीद है कि इनमें से एक आपके लिए काम करेगा।

+0

कैश द्वारा आपका क्या मतलब है? हम उसे कैसे सहन कर सकते हैं? – Farhan

11

आज मुझे उसी समस्या का सामना करना पड़ा जब मैंने केवल आईपी पते द्वारा एसएसएल सॉकेट कनेक्शन बनाने की कोशिश की। इसके परिणामस्वरूप डीएनएस लुकअप प्रयास को उलट दिया गया, और इसलिए यह वास्तव में धीमा था ...

मेरे लिए समाधान बस एसएसएल कनेक्शन के लिए InetAddress बनाते समय होस्ट नाम के रूप में एक डमी खाली स्ट्रिंग को पास करने के लिए था। यही कारण है कि मैं

InetAddress.getByAddress("", addrBytes) 

को

InetAddress.getByAddress(addrBytes) 

बदल गया है और यह अब रिवर्स DNS लुकअप करती है।

0

InetAddress पर एक खाली होस्टनाम पास करने का एर का समाधान एक मेजबान से कनेक्ट करने के लिए काम करता था, लेकिन आईपी पते से एकाधिक होस्ट से कनेक्ट होने पर इसका कुछ दुष्प्रभाव था। जावा tuple <remote-hostname, port> का उपयोग कर SSLSession ऑब्जेक्ट को कैश करता है। इसे ओपनजेडीके here में देखा जा सकता है। इस प्रकार, पिछले कनेक्शन (विशेष रूप से मेरे मामले में टीएलएस प्रोटोकॉल संस्करण) के लिए टीएलएस सेटिंग्स को एक अलग मेजबान के नए कनेक्शन पर लागू किया गया था (क्योंकि दोनों ने एक ही खाली होस्टनाम साझा किया था)। मेरे मामले में, नए मेजबान ने पिछले होस्ट द्वारा बातचीत किए गए डाउनग्रेड किए गए टीएलएस वी 1 प्रोटोकॉल को खारिज कर दिया, जिससे टीएलएस हैंडशेक त्रुटियां आईं।

समाधान के बजाय तो जैसे दूरस्थ आईपी पते के आधार पर एक अनूठा होस्ट नाम के निर्माण के लिए किया गया था:

String hostname = String.format("host-%s", BaseEncoding.base16().encode(address.getAddress())); 
InetAddress newAddress = InetAddress.getByAddress(hostname, address.getAddress()); 

इस प्रकार रिवर्स DNS लुकअप जावा प्रदर्शन विकलांग था, लेकिन दूरदराज के मेजबान के लिए कैश की गई टीएलएस सेटिंग्स केवल करने के लिए लागू किया गया क्रॉसस्टॉक प्रभाव के बिना एक ही रिमोट होस्ट और पोर्ट।

संबंधित मुद्दे