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

Roc*_*ket 11 java sockets ssl android

我想在Android设备上安装一个SSL加密的TCP服务器,并在计算机上安装一个连接到该设备的客户端.

我在Android设备上创建了一个具有自己的密钥库的SSLServerSocket.

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);
Run Code Online (Sandbox Code Playgroud)

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

final DataInputStream input = new DataInputStream(this.clientSocket.getInputStream());
final DataOutputStream output = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
Run Code Online (Sandbox Code Playgroud)

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

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

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

在此输入图像描述

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

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

使用SSLSocket的TLS连接在Android OS中很慢

小智 0

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

如何禁用 Java 的 SSL 反向 DNS 查找