2012-04-05 5 views
0

자바 호스트와 안드로이드 클라이언트 간의 상호 인증 SSL 연결을 설정하려고합니다. 왜 연결되지 않는지 모르겠다. 다음은 Android 클라이언트 앱 및 Java 서버 코드입니다.자바 서버와 안드로이드 클라이언트 간의 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()); 
     } 
    } 
}; 

서버 코드 :

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

가능한 복제 안드로이드 클라이언트와 자바 서버 간의 SSL 연결] (http://stackoverflow.com/questions/10010618/ssl-connection-between-android-client-and-java-server) – EJP

+0

중복의 이유는 내가이다 내 게시물에 답변을 얻지 못하고있다. 아무도 대답 할 수없는 종류의 질문입니까? 내가 대답하지 않으면 다시 시도하고이 질문을 포기하지 않을 것입니다. –

답변

0

해결되었습니다. 문제는 자바 호스트의 truststore와 함께, 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 = server -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 예외 동생 도와 줬어. 당신의 충고에 감사드립니다. 하지만 난 여전히 자바 서버와 안드로이드 클라이언트 사이의 연결을 설정에서 길을 잃었습니다. –

+0

@iCan, 사람들이 당신을 도울 수 있도록 스택 추적을 추가하십시오. – ahanin

관련 문제