में है, मैं एंड्रॉइड डिवाइस पर एक एसएसएल एन्क्रिप्टेड टीसीपी सर्वर और कंप्यूटर पर क्लाइंट को कनेक्ट करना चाहता हूं जो डिवाइस से कनेक्ट होगा।एसएसएलएसकेट 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 रिवर्स लुकअप करेगा जो एक टाइमआउट में चलाएगा।
कब्जा पर एक नजर डालें, पहले कनेक्शन जबकि वाईफ़ाई अक्षम किया गया था बनाया गया था। डाटा ट्रांसफर करने में 0.3 सेकंड लग गए। तब मैंने वाईफ़ाई को सक्रिय किया, मैंने वाईफाई से कनेक्ट नहीं किया, यह अभी भी यूएसबी पर संचार करता है। और यह 5 सेकंड से अधिक ले लिया।
मुझे यहां समस्या भी मिली, लेकिन वे क्लाइंट सॉकेट का उपयोग कर रहे हैं। मुझे एक सर्वर सॉकेट चाहिए। क्या किसी को इस मुद्दे को ठीक करने का कोई विचार है?
TLS connection using SSLSocket is slow in Android OS
यह दोनों कुंजी संग्रह और विश्वास दुकान के रूप में एक ही फाइल का उपयोग करने के लिए किसी भी मतलब नहीं है। – EJP
क्या आप उस पर विस्तार कर सकते हैं? मेरे पास एक कुंजी जोड़ी और क्लाइंट से सार्वजनिक कुंजी के साथ सर्वर के लिए एक कीस्टोर है। ग्राहक की अपनी मुख्य जोड़ी और सर्वर से सार्वजनिक कुंजी है। इसलिए वे एक दूसरे को मान्य कर सकते हैं लेकिन कोई और इसके साथ जुड़ सकता है। – Rocket
ट्रस्ट स्टोर वह है जिस पर आप भरोसा करते हैं। ऐसी ही चीज है जिसे एक समिति द्वारा तय किया जा सकता है, साइट-व्यापी या कंपनी-व्यापी हो सकता है, या वास्तव में जेडीके-वाईड डिफ़ॉल्ट रूप से हो सकता है। कीस्टोर में आपकी निजी कुंजी और हस्ताक्षरित प्रमाणपत्र शामिल है। ये ** रहस्य ** हैं। उनके आसपास सुरक्षा व्यवस्था प्रत्येक मामले में पूरी तरह से अलग है। यह दोनों के लिए एक ही भौतिक फ़ाइल का उपयोग करने के लिए कोई भी समझ नहीं आता है। – EJP