С помощью этой ссылки пытались выполнить обновление до TLSv1.2. Единственная разница заключалась в том, что до сих пор поддерживались все TLS, поэтому использовали это:
sslSocket.setEnabledProtocols(new String[]{"TLSv1","TLSv1.1","TLSv1.2"});
Странно было получить эту ошибку:
java.lang.StackOverflowError
at com.myorg.my.utils.Myfile$CustomHttpsSocketFactory.createSocket(Myfile.java:101)
Где Myfile.java имеет такое содержимое, обратите внимание на строку 101, упомянутую ниже:
//...non useful code above
public Myfile(){
String scheme = "https";
Protocol baseHttps = Protocol.getProtocol(scheme);
int defaultPort = baseHttps.getDefaultPort();
ProtocolSocketFactory baseFactory = baseHttps.getSocketFactory();
ProtocolSocketFactory customFactory = new CustomHttpsSocketFactory(baseFactory);
Protocol customHttps = new Protocol(scheme, customFactory, defaultPort);
Protocol.registerProtocol(scheme, customHttps);
}
class CustomHttpsSocketFactory implements SecureProtocolSocketFactory
{
private final SecureProtocolSocketFactory base;
public CustomHttpsSocketFactory(ProtocolSocketFactory base)
{
if(base == null || !(base instanceof SecureProtocolSocketFactory)) throw new IllegalArgumentException();
this.base = (SecureProtocolSocketFactory) base;
}
private Socket acceptAllTLS(Socket socket)
{
if(!(socket instanceof SSLSocket)) return socket;
SSLSocket sslSocket = (SSLSocket) socket;
sslSocket.setEnabledProtocols(new String[]{"TLSv1","TLSv1.1","TLSv1.2"});
return sslSocket;
}
@Override
public Socket createSocket(String host, int port) throws IOException
{
return acceptAllTLS(base.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localAddress, int localPort) throws IOException
{
return acceptAllTLS(base.createSocket(host, port, localAddress, localPort));
}
@Override
public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException
{
// The following line is 101 where the error occurs
return acceptAllTLS(base.createSocket(host, port, localAddress, localPort, params));
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException
{
return acceptAllTLS(base.createSocket(socket, host, port, autoClose));
} // ...non useful code below}
МОИ ВОПРОСЫ
Кажется очевидным, что base.createSocket рекурсивно вызывает собственный метод. Не могу понять как?
Не удалось реплицировать на моем локальном компьютере, эти журналы существуют только в рабочей среде. Следовательно, как я мог воспроизвести это (использовал ту же версию Java, версию tomcat, версию lib, которая присутствует в производстве)
ИЗМЕНИТЬ
Согласно комментариям трассировка стека:
Вызвано: java.lang.StackOverflowError в com.myorg.my.utils.Myfile$CustomHttpsSocketFactory.createSocket(Myfile.ja> va:101)
Если вы используете JRE8 (если вы не заменили SunJSSE по умолчанию, поставляемый с JRE8), существует системное свойство "jdk.tls.client.protocols". По умолчанию все, что вы здесь укажете, будет использоваться для всех клиентских коммуникаций. Я только что добавил свои комментарии под другой пост, который вы упомянули.