我会尝试尽可能多地提供详细信息:
我在Windows m1.small AWS实例上运行Java 8u45程序。我正在尝试做类似的事情:
SSLSocket sslSocket = (SSLSocket)sslSocketFactory.createSocket(socket, hostname, port, true);
sslSocket.setEnabledProtocols(new String[] {"TLSv1", "TLSv1.1", "TLSv1.2"});
sslSocket.startHandshake();
这个位代码代码一般都有效。但对于特定站点,如果设置了主机名,则startHandshake()会在大约一分钟后抛出异常,说明套接字超时。如果我没有指定主机名(即它为空),则握手通过并且不会发生超时。
奇怪的是,在Java 8u45之前,实例使用的是Java 7u79,并且从未遇到过这个问题。此外,如果我在本地运行相同的代码,握手也会毫无问题地通过。
我认为这是一个SNI问题,但抛出的异常是套接字超时而不是无法识别的名称,所以我不确定为什么在升级到Java 8之后发生/开始发生这种情况。
有没有人知道为什么会发生这种情况?