我是 Android 的相对新手,在获取与 Java 服务器工作的简单 SSL 连接时遇到了问题。
我知道 java 服务器工作正常,因为我使用与服务器相同的 keystore 和 java 客户端对其进行了测试。
当 java 服务器接受连接并显示 readline 变量的空值时,Android 客户端确实发送了一些内容,并且没有错误消息。
我有我的 keystore 和 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
}
我已经指定了一个信任库,但不知道如何在套接字上初始化信任库。
如有任何帮助,我们将不胜感激。
最佳答案
我想改变这条线
sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
使用SSLSocketFactory(KeyStore truststore)
constructor可能会解决您的问题。
sslsocketfactory = new SSLSocketFactory(trustSt);
关于java - Android 到 JAVA SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952814/