2012-04-05 16 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があり、証明書とトラストストアを作成します。 Truststoreとkestoreが作成したのはhere

私はAndroid 2.2とBKSProvider 1.46を使用していますが、どこが間違っているのかを教えてください。私はこのプロジェクトをできるだけ早く終わらせなければなりません。

ありがとうございます。

+0

「接続していません」と定義します。代わりに何が起こるのですか?スタックトレース? – EJP

+0

[AndroidクライアントとJavaサーバー間のSSL接続]の複製が可能です。(http://stackoverflow.com/questions/10010618/ssl-connection-between-android-client-and-java-server) – EJP

+0

複製の理由は、私です私のポストには答えられない。それは誰も答えることができない種類の質問ですか?私が答えられない限り、この質問をもう一度試してみることを断念することは決してありません。 –

答えて

0

解決済みです!問題は、Javaホストのトラストストアで、thisの投稿に続きました。

デフォルトのtrustStoreを使用しているため、クライアント/サーバーにtrustStoreを指定する必要があります。サーバー上で-Djavax.net.ssl.trustStore = servertruststore.jks -Djavax.net.ssl.trustStorePassword = serverを使用し、クライアントで独自のキーストア&トラストストアを作成すると、セッションが完了することができます。それはたくさんの助けをした-Djavax.net.debug = sslハンドシェイクでした。

全体のコマンドは次のとおりです。javaの-Djavax.net.ssl.keyStore = server.jks -Djavax.net.ssl.keyStorePassword =サーバー-Djavax.net.ssl.trustStore = servertruststore.jks -Djavax.net.ssl .trustStorePassword = server SSLServer

今、私はsslsessionとマルチスレッドプログラミングを作成しています。

1

スタックトレースから、捕捉した例外にメッセージが含まれていないように見えます。

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

SSLとは関係ありません。

+0

はい!あなたは正しかった。 NULL例外を取り除きました。しかし、SSL接続はまだ機能していません。 –

+0

ahanin、あなたはそのNULL例外ブローから私を助けました。あなたのアドバイスをありがとう。しかし、私はまだJavaサーバーとアンドロイドクライアント間の接続を確立で失われています。 –

+0

@iCan、スタックトレースを追加して、人々があなたを助けることができるようにしてください。 – ahanin

関連する問題