के साथ एसएसएल कनेक्शन पुन: उपयोग मैं अपने स्वयं के कार्यान्वित जावा वेब प्रॉक्सी (जो वास्तविक वेब सेवा के लिए अनुरोध करता है) और एक एंड्रॉइड एप्लिकेशन के बीच एक सुरक्षित वेब सेवा विकसित कर रहा हूं।एंड्रॉइड एचटीपी क्लाइंट
मानक (असुरक्षित) http कनेक्शन के साथ ऐसा करने से पूरी तरह से अच्छा काम करता है। अब मैं प्रॉक्सी और एंड्रॉइड क्लाइंट के बीच एक सुरक्षित (एसएसएल) कनेक्शन का उपयोग करना चाहता हूं।
यह तब तक काम करता है जब तक मैं प्रत्येक अनुरोध के लिए एक नया एचटीपी क्लाइंट को तुरंत चालू करता हूं, जो संसाधनों को बहुत धीमा कर देता है क्योंकि मैं प्रत्येक अनुरोध के लिए दो तरह के हैंडशेक कर रहा हूं। कनेक्शन पहले से ही खुला:
तो मैं प्रत्येक अनुरोध जो निम्नलिखित अपवाद
java.lang.IllegalStateException में सुरक्षित कनेक्शन के लिए परिणाम के लिए HttpClient का पुन: उपयोग करने की कोशिश कर रहा हूँ। org.apache.http.impl.conn.AbstractPoolEntry.open (AbstractPoolEntry.java:150) org.apache.http.impl.conn.AbstractPooledConnAdapter.open पर (AbstractPooledConnAdapter.java:119) org.apache पर पर । http.impl.client.DefaultRequestDirector.execute (DefaultRequestDirector.java:360) org.apache.http.impl.client.AbstractHttpClient.execute (AbstractHttpClient.java:5255) org.apache.http.impl.client पर। AbstractHttpClient.execute (AbstractHttpClient.java:487) org.apache.http.impl.client.AbstractHttpClient.execute पर (AbstractHttpClient.java:465)
जब मैं SSL- नहीं करने के लिए अपने प्रॉक्सी और ग्राहक को बदलने संचार यह किसी भी समस्या के बिना काम करता है। क्या कोई जानता है कि मैं क्या गलत कर रहा हूं? आपकी सहायता के लिए धन्यवाद!
सर्वर सॉकेट का उपयोग करने के बजाय लोड किए गए प्रमाणपत्रों के साथ SSLServerSocket का उपयोग करने के अलावा सर्वर कोड पूरी तरह से समान है।
ग्राहक पैरामीटर सेटअप
// Set basic data
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams.setUserAgent(params, "Android app/1.0.0");
// Make pool
ConnPerRoute connPerRoute = new ConnPerRouteBean(12);
ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
ConnManagerParams.setMaxTotalConnections(params, 20);
// Set timeout
HttpConnectionParams.setStaleCheckingEnabled(params, false);
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);
HttpConnectionParams.setSocketBufferSize(params, 8192);
// Some client params
HttpClientParams.setRedirecting(params, false);
HTTP क्लाइंट निर्माण
// load truststore certificate
InputStream clientTruststoreIs = context.getResources().openRawResource(R.raw.server);
KeyStore trustStore = KeyStore.getInstance("BKS");
trustStore.load(clientTruststoreIs, "server".toCharArray());
// initialize trust manager factory with the read truststore
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
// setup client certificate
// load client certificate
InputStream keyStoreStream = context.getResources().openRawResource(R.raw.client);
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(keyStoreStream, "client".toCharArray());
// initialize key manager factory with the read client
// certificate
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "client".toCharArray());
// initialize SSLSocketFactory to use the certificates
SSLSocketFactory socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS, keyStore, "client", trustStore, null, null);
// Register http/s shemas!
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("https", socketFactory, port));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
httpClient = new DefaultHttpClient(conMgr, params);
क्लाइंट अनुरोध निष्पादन
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
in = entity.getContent();
String result = convertStreamToString(in);
in.close();
आपके उत्तर के लिए धन्यवाद। हां, जैसा कि आप प्रदान किए गए कोड में देख सकते हैं। अगर मैं एसएसएल के बिना इसका इस्तेमाल करता हूं, तो कोड पूरी तरह ठीक काम करता है, भले ही विभिन्न धागे से उपयोग किया जाता है। लेकिन जब मैं एसएसएल में बदल जाता हूं तो यह शीर्ष पर अपवाद के साथ टूट जाता है। कोई अन्य सुझाव? – user1033552