2012-01-20 66 views
2

我有一個問題,我的defaultHttpClient安全連接與httpclient在Android

我必須與使用HTTPS連接的服務器建立連接。我發現HttpClient默認使用TLS安全協議,而我想連接的服務器不支持它。

我不能改變這一點,我被迫在我的應用程序中更改我的安全協議!

我該怎麼做?

回答

0

試試這個客戶端它幫助了我很多次。

public class MyHttpClient1 extends DefaultHttpClient { 

    final Context context; 


    MyHttpClient1 mHttpClient=null; 

    public MyHttpClient1(Context context) { 
      this.context = context; 
    } 

    @Override 
    protected ClientConnectionManager createClientConnectionManager() { 
     SchemeRegistry registry = new SchemeRegistry(); 
     KeyStore trustStore = null; 
     try { 
      trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } 
     try { 
      trustStore.load(null, null); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (CertificateException e) { 
      e.printStackTrace(); 
     } 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     // Register for port 443 our SSLSocketFactory with our keystore 
     // to the ConnectionManager 
     try { 
      registry.register(new Scheme("https",new MySSLSocketFactory(trustStore), 443)); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      e.printStackTrace(); 
     } catch (UnrecoverableKeyException e) { 
      e.printStackTrace(); 
     } 
     return new SingleClientConnManager(getParams(), registry); 
    } 

    public class MySSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("SSL"); //or TLS 

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

     TrustManager tm = new X509TrustManager() { 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     }; 

     sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
    } 

} 
0

這似乎並不工作,但我已經通過添加方法解決它:

setEnableProtocols(new String[]{"SSLv3"}); 

在創造我的個人SSLSocket

現在一切似乎工作!

+0

你能告訴我你在哪裏提到這個? – sachin