2013-04-11 3 views
3

나는 안드로이드에서 상대적인 초보자이며 자바 서버에서 작동하는 간단한 SSL 연결을 얻는 데 문제가 있습니다.Android to JAVA SSL

서버와 Java 클라이언트와 동일한 키 저장소를 사용하여 Java 서버를 테스트 한 결과 Java 서버가 작동한다는 것을 알고 있습니다.

안드로이드 클라이언트는 자바 서버가 연결을 허용하고 readline 변수에 null 값을 표시하고 오류 메시지를 표시하지 않기 때문에 무언가를 보냅니다.

나는 bks 형식의 키 스토어 및 트러스트 스토어를 가지고 있으며 res/raw 폴더에 추가되었습니다.

안드로이드 클라이언트 :

SSLContext sslContext = SSLContext.getDefault(); 

    KeyStore trustSt = KeyStore.getInstance("BKS"); 
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore); 
    trustSt.load(trustStoreStream, "password".toCharArray()); 
    trustManagerFactory.init(trustSt); 

    KeyStore keyStore = KeyStore.getInstance("BKS"); 
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore); 
    keyStore.load(keyStoreStream, "password".toCharArray()); 
    keyManagerFactory.init(keyStore, "password".toCharArray()); 

    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 
    } 
    catch (NoSuchAlgorithmException nsae){Log.d("SSL", nsae.getMessage());} 
    catch (KeyStoreException kse){Log.d("SSL", kse.getMessage());} 
    catch (IOException ioe){Log.d("SSL", ioe.getMessage());} 
    catch (CertificateException ce){Log.d("SSL", ce.getMessage());} 
    catch (KeyManagementException kme){Log.d("SSL", kme.getMessage());} 
    catch(AccessControlException ace){Log.d("SSL", ace.getMessage());} 
    catch(UnrecoverableKeyException uke){Log.d("SSL", uke.getMessage());} 

    try{ 
     //error catch 
     String error = "test"; 

     sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     s = (SSLSocket) sslsocketfactory.createSocket("192.168.2.101", port); 

      outStream = s.getOutputStream(); 
      outStreamWriter = new OutputStreamWriter(outStream); 
      bufferedWriter = new BufferedWriter(outStreamWriter); 

      bufferedWriter.write(error + "\n"); 
      bufferedWriter.flush();   

       } //end try 
       catch (UnknownHostException e) {e.printStackTrace();} 
       catch (IOException e) {e.printStackTrace();} 

       finally{ 
        if (s != null){ 
        try {s.close();} 
        catch (IOException e) {e.printStackTrace();} 
        } 
        }//end finally 
} 

나는 신뢰를 지정하지만 어떻게 소켓의 신뢰를 초기화하지 않습니다.

도움을 주시면 감사하겠습니다.

+0

'passowrd'는 오타가 적습니까? – Nick

+1

내가 붙여 넣을 때 암호를 변경합니다 ... 오타가 – Alan

답변

0

나는 당신의 문제를 해결할 수있는 SSLSocketFactory(KeyStore truststore) constructor를 사용하는이 라인

sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 

을 변경하는 생각.

sslsocketfactory = new SSLSocketFactory(trustSt); 
+0

인 생성자가 org.apache.http.conn.ssl.SSLSocketFactory 용이고 구문에 잘못된 것이 있습니다. javax.을 사용하려고했기 때문일 수 있습니다. net.ssl ​​TCP 소켓 – Alan