2012-04-05 2 views
0

Я пытаюсь установить взаимную аутентификацию SSL-соединения между java-узлом и клиентом android. Не знаю, почему это не связано. Ниже приведен код клиентского приложения Android и сервера Java.Ошибка соединения SSL между java-сервером и клиентом android

код клиента:

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-соединения между клиентом android и java-сервером] (http://stackoverflow.com/questions/10010618/ssl-connection-between-android-client-and-java-server) – EJP

+0

Причина дублирования: i я не получаю ответа на свой пост. Это какой-то вопрос, на который никто не может ответить? Никогда не откажешься от попыток и повторения этого вопроса, если я не отвечу. –

ответ

0

Решено! Проблема была связана с доверительным магазином java-хоста, после чего отправили сообщение this.

Для проверки подлинности клиента/сервера необходимо указать TrustStore, поскольку они используют доверительное хранилище по умолчанию, вызывая сбой. Использование -Djavax.net.ssl.trustStore = servertruststore.jks -Djavax.net.ssl.trustStorePassword = сервер на сервере и создание собственного хранилища ключей & truststore на клиенте позволяет завершить сеанс. Это было -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 = сервер SSLServer

Теперь я нахожусь для создания sslsession и многопоточного программирования.

1

Из трассировки стека это выглядит как исключение, которое вы поймали, не содержит сообщения.

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

Это не имеет никакого отношения к SSL.

+0

Да! ты был прав. Исправлено исключение NULL. Но факт SSL-соединения еще не работает. –

+0

ahanin, вы помогли мне выйти из этого исключения NULL. Спасибо за этот совет. Но я все еще теряюсь в установлении связи между java-сервером и клиентом android. –

+0

@iCan, пожалуйста, добавьте трассировку стека, чтобы люди могли вам помочь. – ahanin