3

我是 Android 的相对新手,并且在将简单的 SSL 连接连接到 java 服务器时遇到了问题。

我知道 java 服务器可以正常工作,因为我使用与服务器和 java 客户端相同的密钥库对其进行了测试。

Android 客户端确实发送了一些东西,因为 java 服务器接受了一个连接,并为 readline 变量显示了一个空值,并且没有错误消息。

我有我的密钥库和 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 
 }  

我已经指定了一个信任库,但没有指定如何在套接字上初始化信任库。

任何帮助,将不胜感激。

4

1 回答 1

0

我想改变这条线

sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

使用SSLSocketFactory(KeyStore truststore)构造函数可能会解决您的问题。

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