2012-04-05 98 views
0

我想在java主機和android客戶端之間建立相互認證SSL連接。不知道爲什麼它沒有連接。以下是Android客戶端應用程序和Java服務器的代碼。java服務器和android客戶端之間的SSL連接失敗

客戶端代碼:

private SSLContext createSSLContext(final Context cont){ 
    SSLContext ssl_cont = null; 
    try { 
     Log.d(TAG, "TrustStore - Initializing"); 
     KeyStore trustStore = KeyStore.getInstance("BKS"); 
     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
     InputStream trustStoreStream = cont.getResources().openRawResource(R.raw.myclienttruststore); 
     trustStore.load(trustStoreStream, "client".toCharArray()); 
     trustManagerFactory.init(trustStore); 
     Log.d(TAG, "TrustStore - Initialized"); 

     // Setup keystore 
     Log.d(TAG, "KeyStore - Initializing"); 
     KeyStore keyStore = KeyStore.getInstance("BKS"); 
     KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
     InputStream keyStoreStream = cont.getResources().openRawResource(R.raw.myclient); 
     keyStore.load(keyStoreStream, "client".toCharArray()); 
     keyManagerFactory.init(keyStore, "client".toCharArray()); 
     Log.d(TAG, "KeyStore - Initialized"); 

     ssl_cont = SSLContext.getInstance("TLS"); 
     ssl_cont.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     alertbox("SSLClient", "ERROR: " + e.getMessage()); 
     Log.d(TAG, "ERROR: " + e.getMessage()); 
    } 
    return ssl_cont; 
} 

OnClickListener onConnClick = new OnClickListener() { 

    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 
     try { 
      // Setup the SSL context to use the truststore and keystore 
      Log.d(TAG, "Started.."); 
      SSLContext ssl_context = createSSLContext(cont); 
      Log.d(TAG,"here 1..."); 
      SSLSocketFactory socketFactory = (SSLSocketFactory) ssl_context.getSocketFactory(); 
      Log.d(TAG,"here 2..."); 
      socket = (SSLSocket) socketFactory.createSocket(ipadd.getText().toString().trim(), Integer.parseInt(port.getText().toString().trim())); 
      Log.d(TAG,"here 3..."); 
      dataOut = new DataOutputStream(socket.getOutputStream()); 
      dataIn = new DataInputStream(socket.getInputStream()); 
      dataOut.writeUTF("Hello !!"); 
      msgin.setText("Connected"); 
      Log.d(TAG, "Completed.."); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      msgin.setText("Not connected"); 
      alertbox("Main", "ERROR: " + e.getMessage()); 
      Log.d(TAG, "ERROR: " + e.getMessage()); 
     } 
    } 
}; 

Server代碼:

try { 
     mySSLServerFac = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); 
     mySSLServerSocket = (SSLServerSocket) mySSLServerFac.createServerSocket(9999); 
     System.out.println("Listening on 9999\n"); 
     mySSLSocket = (SSLSocket) mySSLServerSocket.accept();   
     DataInputStream input = new DataInputStream(mySSLSocket.getInputStream()); 
     DataOutputStream output = new DataOutputStream(mySSLSocket.getOutputStream());  
     do{ 
      System.out.println("Remote IP Address : " + mySSLSocket.getInetAddress()); 
      msg = input.readUTF().toString(); 
      System.out.println(msg); 
      java.util.Scanner sc = new java.util.Scanner(System.in); 
      output.writeUTF(sc.nextLine()); 
     }while(msg != "exit"); 
     System.out.println(msg);     
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

我堅持在服務器錯誤 「沒有共同的密碼套件」。由於我無法使用SSL連接設置。如果您發現錯誤或主要問題,請讓我幫忙。

這裏是link我也跟着創建證書和信任。我創建的信任庫和kestore是here

我使用的是Android 2.2和BKSProvider 1.46,請讓我知道我錯了哪裏。我必須儘快結束這個項目。

在此先感謝。

+0

定義「未連接」。會發生什麼呢?堆棧跟蹤? [Android客戶端和java服務器之間的SSL連接]的 – EJP 2012-04-06 00:46:29

+0

可能重複(http://stackoverflow.com/questions/10010618/ssl-connection-between-android-client-and-java-server)後面重複 – EJP 2012-04-06 00:47:33

+0

原因,爲i我沒有得到我的帖子回答。這是一個沒人能回答的問題嗎?除非我回答,否則永遠不會放棄嘗試再問這個問題。 – 2012-04-09 19:13:02

回答

0

它已經解決了!問題是與java主機的truststore,其次是this後。

信任庫需要,因爲他們使用的是默認的trustStore,引起故障將客戶端/服務器指定。在服務器上使用-Djavax.net.ssl.trustStore = servertruststore.jks -Djavax.net.ssl.trustStorePassword =服務器並創建自己的密鑰存儲在客戶端&信任允許會話完成。這是-Djavax.net.debug = ssl,握手幫助了很多。

整個命令是:java -Djavax.net.ssl.keyStore = server.jks -Djavax.net.ssl.keyStorePassword = server -Djavax.net.ssl.trustStore = servertruststore.jks -Djavax.net.ssl .trustStorePassword =服務器

現在我已經創造的SSLSession和多線程編程SSLServer上。

1

從堆棧跟蹤它看起來像你抓不包含消息的異常。

Log.d(TAG, e.getMessage()); 

它與SSL無關。

+0

是的!你是對的。擺脫了NULL異常。但事實是SSL連接還沒有工作。 – 2012-04-05 18:34:21

+0

ahanin,你幫我從NULL異常兄弟中解脫出來。感謝你的建議。但我仍然在建立java服務器和android客戶端之間的連接。 – 2012-04-05 18:50:29

+0

@iCan,請添加堆棧跟蹤,以便人們可以幫助您。 – ahanin 2012-04-10 07:58:14

相關問題