2012-09-21 19 views
5

के साथ एसएसएल कनेक्शन पुन: उपयोग मैं अपने स्वयं के कार्यान्वित जावा वेब प्रॉक्सी (जो वास्तविक वेब सेवा के लिए अनुरोध करता है) और एक एंड्रॉइड एप्लिकेशन के बीच एक सुरक्षित वेब सेवा विकसित कर रहा हूं।एंड्रॉइड एचटीपी क्लाइंट

मानक (असुरक्षित) 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(); 

उत्तर

0

आप एक धागा सुरक्षित कनेक्शन प्रबंधक का उपयोग कर रहे हैं? यदि नहीं, तो यह समस्या हो सकती है यदि आप एकाधिक थ्रेड में एक ही HttpClient का उपयोग कर रहे हैं। http://candrews.integralblue.com/2011/09/best-way-to-use-httpclient-in-android/

+0

आपके उत्तर के लिए धन्यवाद। हां, जैसा कि आप प्रदान किए गए कोड में देख सकते हैं। अगर मैं एसएसएल के बिना इसका इस्तेमाल करता हूं, तो कोड पूरी तरह ठीक काम करता है, भले ही विभिन्न धागे से उपयोग किया जाता है। लेकिन जब मैं एसएसएल में बदल जाता हूं तो यह शीर्ष पर अपवाद के साथ टूट जाता है। कोई अन्य सुझाव? – user1033552

3

मैं Android और HttpClient के साथ इस ठीक उसी मुद्दा है - यह केवल जब एक क्लाइंट-साइड प्रमाणपत्र का उपयोग, जैसे आप स्पष्ट नजर लगता है:

यह लेख विवरण है। क्लाइंट ऑथ निकालें और यह ठीक काम करता है, अभी तक एक वर्कअराउंड नहीं मिला है।

संपादित करें:

बासी कनेक्शन की जाँच सक्षम करें।

HttpConnectionParams.setStaleCheckingEnabled (पैरा, सत्य);

मेरे लिए इसे ठीक किया गया।

+0

Thx। यह पुष्टि कर सकता है कि क्लाइंट केर्ट सक्षम होने के साथ ही ऐसा होता है और यह मेरे लिए भी तय करता है। – icyerasor

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