我正在尝试将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);
Run Code Online (Sandbox Code Playgroud)
然后,接收器线程的运行循环使用socket.getInputStream()来访问输入流.只要我使用未加密的连接,这没有问题.但是安全连接不会从套接字中检索任何数据.我通过向接收循环添加日志消息来验证这一点,甚至使用OpenSSL的s_server进行检查.我从客户端检索数据,但客户端从未收到我发送给它的任何内容.
作为最后一次测试,我尝试打开与www.google.com:443的连接,如下所示:
javax.net.SocketFactory fact=SSLSocketFactory.getDefault();
Socket socket=fact.createSocket(_config.getUri().getHost(), _config.getUri().getPort());
Run Code Online (Sandbox Code Playgroud)
仍然是相同的结果,连接工作,但使用InputStream我没有从服务器收到任何东西.
有人有任何想法吗?
编辑:
我目前不允许回答我自己的问题,但是答案是:嗯,结果问题是接收循环.我依赖于InputStream.available()获取要读取的字节数,但没有意识到它是相当不可靠的(对于SSL套接字总是返回0).所以我改变了接收循环以使用阻塞read().
如上所述:结果问题是接收循环.我依赖于InputStream.available()获取要读取的字节数,但没有意识到它是相当不可靠的(对于SSL套接字总是返回0).所以我改变了接收循环以使用阻塞read().
| 归档时间: |
|
| 查看次数: |
6713 次 |
| 最近记录: |