Java 使用自签名证书在Android上创建SSL套接字

Java 使用自签名证书在Android上创建SSL套接字,java,android,ssl,Java,Android,Ssl,我正在尝试将Android应用程序连接到启用SSL的服务器,该服务器使用自签名证书。我已经阅读了几十篇教程,该应用程序现在正在接受证书&连接到服务器,但我从未得到任何数据 我用来初始化套接字的原始代码如下: //passphrase for keystore char[] keystorePass="password".toCharArray(); //load own keystore (MyApp just holds reference to application context) K

我正在尝试将Android应用程序连接到启用SSL的服务器,该服务器使用自签名证书。我已经阅读了几十篇教程,该应用程序现在正在接受证书&连接到服务器,但我从未得到任何数据

我用来初始化套接字的原始代码如下:

//passphrase for keystore
char[] keystorePass="password".toCharArray();

//load own keystore (MyApp just holds reference to application context)
KeyStore keyStore=KeyStore.getInstance("BKS");
keyStore.load(MyApp.getStaticApplicationContext().getResources().openRawResource(R.raw.keystore),keystorePass);

//create a factory
TrustManagerFactory     trustManagerFactory=TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

//get context
SSLContext sslContext=SSLContext.getInstance("TLS");

//init context
sslContext.init(
    null,
    trustManagerFactory.getTrustManagers(), 
    new SecureRandom()
);

//create the socket
Socket socket=sslContext.getSocketFactory().createSocket("hostname",443);
socket.setKeepAlive(true);
之后,接收方线程的运行循环使用socket.getInputStream()访问输入流。 只要我使用一个未加密的连接,它就可以正常工作。但是安全连接不会从套接字中检索任何数据。我通过向接收循环添加日志消息来验证这一点,甚至使用OpenSSL的_服务器进行检查。我从客户端检索数据,但客户端从未收到我发送给它的任何内容

作为最后一次测试,我尝试打开与www.google.com:443的连接,如下所示:

javax.net.SocketFactory fact=SSLSocketFactory.getDefault();
Socket socket=fact.createSocket(_config.getUri().getHost(), _config.getUri().getPort());
仍然是相同的结果,连接工作,但是使用InputStream我从服务器上没有收到任何东西

有人有什么想法吗

编辑:

我目前不允许回答自己的问题,但以下是答案:
原来问题出在接收环路上。我依靠
InputStream.available()
获取要读取的字节数,但没有意识到这相当不可靠(SSL套接字总是返回0)。因此,我将接收循环切换为使用阻塞
read()

如上所述:原来问题出在接收循环上。我依靠
InputStream.available()
获取要读取的字节数,但没有意识到这相当不可靠(SSL套接字总是返回0)。因此,我将接收循环切换为使用阻塞
read()

使用两个线程是否合适,一个用于发送数据,另一个用于接收?是的,我认为您应该使用两个线程,尤其是在使用全双工通信的情况下。我也读过几篇文章,这应该是线程安全的,因为您使用不同的流进行读写。