当android设备在wifi时,SSLSocket在getInputStream处挂起

时间:2016-06-09 05:33:53

标签: java android sockets ssl

我希望Android设备上有一个SSL加密的TCP服务器,并且计算机上的客户端将连接到该设备。

我在Android设备上使用自己的密钥库创建SSLServerSocket。

for x in name:
    print x

然后我等待客户端连接。当客户端想要连接时,启动新线程并要求流:

final KeyStore localTrustStore = KeyStore.getInstance("BKS"); //NON-NLS
final InputStream in = context.getResources().openRawResource(R.raw.syncapp);
localTrustStore.load(in, "secret".toCharArray()); //Keystore pw
in.close();

final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //NON-NLS

final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(localTrustStore);

final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(localTrustStore, "secret".toCharArray()); //privat key pw

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

serverSocket = sslContext.getServerSocketFactory().createServerSocket(SERVER_PORT);
((SSLServerSocket) serverSocket).setNeedClientAuth(true);

首先,我使用此代码与USB-Tethering获得计算机和Android设备之间的连接。所以没有启用Wifi /网络。一切都很完美。

然后我在Android设备上激活了wifi并连接到没有互联网的wlan。 但现在调用getInputStream()似乎需要5到10秒。 如果我停用SSL,它可以很好地工作。 如果wlan确实连接到互联网,也没有延迟。 我用Android 4.2和5.1进行了测试。 更新:现在我可以用Android 6测试这个问题。问题似乎在那里得到解决......

握手已正确完成,但之后似乎在Android设备上有某种延迟。 (对getInputStream的调用会消耗该时间) 一些开发人员说它将进行DNS反向查找,这将进入超时。

enter image description here

看看捕获,第一次连接是在禁用wifi时进行的。进行数据传输需要0.3秒。然后我只是激活了wifi,我没有通过wifi连接,它仍然通过usb进行通信。它花了5秒钟。

我也在这里找到了问题,但是他们正在使用客户端套接字。我需要一个服务器套接字。有谁知道如何解决这个问题?

TLS connection using SSLSocket is slow in Android OS

1 个答案:

答案 0 :(得分:0)

你是对的,有一个反向DNS查找超时。在某些Java运行时环境中,在与原始IP地址握手期间,SSLContext不必要地执行服务器IP地址的查找。这是为了确定服务器证书的公用名是否匹配。尝试使用此处提到的解决方案之一:

How to disable Java's SSL Reverse DNS Lookup