3

私は Android の比較的初心者であり、単純な SSL 接続を Java サーバーに接続する際に問題がありました。

サーバーと同じキーストアとJavaクライアントを使用してテストしたため、Javaサーバーが機能することはわかっています。

Java サーバーが接続を受け入れ、readline 変数に null 値を表示し、エラー メッセージを表示しないため、Android クライアントは何かを送信します。

キーストアとトラストストアを bks 形式で作成し、res/raw フォルダーに追加しました。

Android クライアント:

 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 
 }  

トラストストアを指定しましたが、ソケットでトラストストアを初期化する方法がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

0

この行を変更すると思います

sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

SSLSocketFactory(KeyStore truststore)コンストラクターを使用すると、問題が解決する場合があります。

sslsocketfactory = new SSLSocketFactory(trustSt);
于 2013-04-13T15:40:52.513 に答える