在Android上使用自签名证书创建SSL-Socket

我正在尝试将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的s_server进行了检查。我从客户端检索数据,但客户端从未收到发送给它的任何内容。

作为最后的测试,我尝试像这样打开与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()

以上是 在Android上使用自签名证书创建SSL-Socket 的全部内容, 来源链接: utcz.com/qa/422506.html

回到顶部