2016-06-09 4 views
10

में है, मैं एंड्रॉइड डिवाइस पर एक एसएसएल एन्क्रिप्टेड टीसीपी सर्वर और कंप्यूटर पर क्लाइंट को कनेक्ट करना चाहता हूं जो डिवाइस से कनेक्ट होगा।एसएसएलएसकेट getInputStream पर लटकता है जब एंड्रॉइड डिवाइस wifi

मैं अपने स्वयं के कीस्टोर के साथ एंड्रॉइड डिवाइस पर एक SSLServerSocket बना देता हूं।

final KeyStore localTrustStore = KeyStore.getInstance("BKS"); //NON-NLS 
final InputStream in = context.getResources().openRawResource(R.raw.syncapp); 
localTrustStore.load(in, "secret".toCharArray()); //Keystore pw 
in.close(); 

final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //NON-NLS 

final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
trustManagerFactory.init(localTrustStore); 

final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
keyManagerFactory.init(localTrustStore, "secret".toCharArray()); //privat key pw 

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 

serverSocket = sslContext.getServerSocketFactory().createServerSocket(SERVER_PORT); 
((SSLServerSocket) serverSocket).setNeedClientAuth(true); 

तब मैं क्लाइंट से जुड़ने की प्रतीक्षा करता हूं। एक ग्राहक कनेक्ट करना चाहता है जब एक नया धागा शुरू कर दिया जाता है और नदियों की मांग की हो:

final DataInputStream input = new DataInputStream(this.clientSocket.getInputStream()); 
final DataOutputStream output = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream())); 

सबसे पहले मैं कंप्यूटर और Android डिवाइस के बीच एक कनेक्शन हासिल करने के लिए यूएसबी-टेदरिंग के साथ इस कोड का इस्तेमाल किया। तो कोई वाईफ़ाई/नेटवर्क सक्षम नहीं था। सब कुछ पूरी तरह से काम किया।

फिर मैंने एंड्रॉइड डिवाइस पर वाईफाई को सक्रिय किया और इंटरनेट के बिना एक वैलान से कनेक्ट किया। लेकिन अब इनपुटस्ट्रीम() प्राप्त करने के लिए कॉल 5 से 10 सेकंड लगते हैं। यदि मैं SSL को निष्क्रिय करता हूं तो यह पूरी तरह से काम करता है। यदि वैलान इंटरनेट से कनेक्ट होता है तो इसमें कोई देरी नहीं होती है। मैंने एंड्रॉइड 4.2 और 5.1 के साथ इसका परीक्षण किया। अद्यतन: अब मैं एंड्रॉइड 6 के साथ इस समस्या का परीक्षण कर सकता हूं। और यह मुद्दा वहां तय किया गया है ...

हैंडशेक सही ढंग से समाप्त हो गया है लेकिन इसके बाद एंड्रॉइड डिवाइस पर कुछ प्रकार की देरी होती है। (इनपुट स्ट्रीम प्राप्त करने के लिए कॉल उस समय उपभोग करता है) कुछ देव कह रहे हैं कि यह एक DNS रिवर्स लुकअप करेगा जो एक टाइमआउट में चलाएगा।

enter image description here

कब्जा पर एक नजर डालें, पहले कनेक्शन जबकि वाईफ़ाई अक्षम किया गया था बनाया गया था। डाटा ट्रांसफर करने में 0.3 सेकंड लग गए। तब मैंने वाईफ़ाई को सक्रिय किया, मैंने वाईफाई से कनेक्ट नहीं किया, यह अभी भी यूएसबी पर संचार करता है। और यह 5 सेकंड से अधिक ले लिया।

मुझे यहां समस्या भी मिली, लेकिन वे क्लाइंट सॉकेट का उपयोग कर रहे हैं। मुझे एक सर्वर सॉकेट चाहिए। क्या किसी को इस मुद्दे को ठीक करने का कोई विचार है?

TLS connection using SSLSocket is slow in Android OS

+0

यह दोनों कुंजी संग्रह और विश्वास दुकान के रूप में एक ही फाइल का उपयोग करने के लिए किसी भी मतलब नहीं है। – EJP

+0

क्या आप उस पर विस्तार कर सकते हैं? मेरे पास एक कुंजी जोड़ी और क्लाइंट से सार्वजनिक कुंजी के साथ सर्वर के लिए एक कीस्टोर है। ग्राहक की अपनी मुख्य जोड़ी और सर्वर से सार्वजनिक कुंजी है। इसलिए वे एक दूसरे को मान्य कर सकते हैं लेकिन कोई और इसके साथ जुड़ सकता है। – Rocket

+0

ट्रस्ट स्टोर वह है जिस पर आप भरोसा करते हैं। ऐसी ही चीज है जिसे एक समिति द्वारा तय किया जा सकता है, साइट-व्यापी या कंपनी-व्यापी हो सकता है, या वास्तव में जेडीके-वाईड डिफ़ॉल्ट रूप से हो सकता है। कीस्टोर में आपकी निजी कुंजी और हस्ताक्षरित प्रमाणपत्र शामिल है। ये ** रहस्य ** हैं। उनके आसपास सुरक्षा व्यवस्था प्रत्येक मामले में पूरी तरह से अलग है। यह दोनों के लिए एक ही भौतिक फ़ाइल का उपयोग करने के लिए कोई भी समझ नहीं आता है। – EJP

उत्तर

0

आप सही रिवर्स DNS लुकअप कि बाहर समय है कि देखते हैं। कुछ जावा रनटाइम वातावरण में, कच्चे आईपी पते के साथ हैंडशेक के दौरान, SSLContext अनावश्यक रूप से सर्वर के आईपी पते का एक लुकअप करता है। यह निर्धारित करना है कि सर्वर प्रमाणपत्र का सामान्य नाम मेल खाता है या नहीं। समाधान यहाँ उल्लेख से एक का उपयोग का प्रयास करें:

How to disable Java's SSL Reverse DNS Lookup

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