[
https://issues.apache.org/jira/browse/IGNITE-14789?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mikhail Petrov updated IGNITE-14789:
------------------------------------
Description:
Thin client startup hangs if an error occur during SSL handshake.
The main reason -
Exception can be thrown during initial part of handshake from
javax.net.ssl.SSLEngine#beginHandshake that is called from GridNioSslHandler
constructor.
In this case SSL handler is not added to SSL meta.
And during GridNioSslFilter#onSessionClose the GridNioSslFilter#sslHandler
method will
throw IgniteException that remains unhandled.
That leads to AbstractNioClientWorker terminates abruptly and user thread hangs
with the following thread dump
{code:java}
"test-runner-#1%ignite.InvalidSslProtocolTest%" #12 prio=5 os_prio=0
tid=0x00007f4be0a0c800 nid=0xc5b3 waiting on condition [0x00007f4b779eb000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
at
org.apache.ignite.internal.client.thin.io.gridnioserver.GridNioClientConnectionMultiplexer.open(GridNioClientConnectionMultiplexer.java:136)
at
org.apache.ignite.internal.client.thin.TcpClientChannel.<init>(TcpClientChannel.java:166)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient$$Lambda$582/1885200808.apply(Unknown
Source)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:877)
- locked <0x000000076e493918> (a
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:858)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.access$400(ReliableChannel.java:807)
at
org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:739)
at
org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:712)
at
org.apache.ignite.internal.client.thin.ReliableChannel.channelsInit(ReliableChannel.java:683)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:124)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:101)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.start(TcpIgniteClient.java:327)
at org.apache.ignite.Ignition.startClient(Ignition.java:612)
at
org.apache.ignite.InvalidSslProtocolTest.test(InvalidSslProtocolTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.apache.ignite.testframework.junits.GridAbstractTest$7.run(GridAbstractTest.java:2432)
at java.lang.Thread.run(Thread.java:748)
{code}
Reproducer:
{code:java}
public class InvalidSslProtocolTest extends GridCommonAbstractTest {
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
cfg.setClientConnectorConfiguration(new ClientConnectorConfiguration()
.setSslEnabled(true)
.setSslClientAuth(true)
.setUseIgniteSslContextFactory(false)
.setSslContextFactory(sslContextFactory("thinServer", "trusttwo",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.2")));
return cfg;
}
/** */
@Test
public void test() throws Exception {
startGrid();
Ignition.startClient(new ClientConfiguration()
.setAddresses("127.0.0.1:10800")
.setSslMode(SslMode.REQUIRED)
.setSslContextFactory(sslContextFactory("thinClient", "trusttwo",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.1")));
}
/** */
private SslContextFactory sslContextFactory(String keyStore, String
trustStore, String cipherSuite, String protocol) {
SslContextFactory res = (SslContextFactory)sslTrustedFactory(keyStore,
trustStore);
res.setCipherSuites(cipherSuite);
res.setProtocols(protocol);
return res;
}
}
{code}
The mentioned issue also affects GridClient.
was:
Thin client startup hangs if SSL cipher suite version does not match the SSL
protocol version.
The main reason -
Exception that throws during thin client connection process (see
IgniteException in
org.apache.ignite.internal.util.nio.ssl.GridNioSslFilter#sslHandler) remains
unhandled
That leads to AbstractNioClientWorker terminates abruptly and user thread hangs
with the following thread dump
{code:java}
"test-runner-#1%ignite.InvalidSslProtocolTest%" #12 prio=5 os_prio=0
tid=0x00007f4be0a0c800 nid=0xc5b3 waiting on condition [0x00007f4b779eb000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
at
org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
at
org.apache.ignite.internal.client.thin.io.gridnioserver.GridNioClientConnectionMultiplexer.open(GridNioClientConnectionMultiplexer.java:136)
at
org.apache.ignite.internal.client.thin.TcpClientChannel.<init>(TcpClientChannel.java:166)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient$$Lambda$582/1885200808.apply(Unknown
Source)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:877)
- locked <0x000000076e493918> (a
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:858)
at
org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.access$400(ReliableChannel.java:807)
at
org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:739)
at
org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:712)
at
org.apache.ignite.internal.client.thin.ReliableChannel.channelsInit(ReliableChannel.java:683)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:124)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:101)
at
org.apache.ignite.internal.client.thin.TcpIgniteClient.start(TcpIgniteClient.java:327)
at org.apache.ignite.Ignition.startClient(Ignition.java:612)
at
org.apache.ignite.InvalidSslProtocolTest.test(InvalidSslProtocolTest.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at
org.apache.ignite.testframework.junits.GridAbstractTest$7.run(GridAbstractTest.java:2432)
at java.lang.Thread.run(Thread.java:748)
{code}
Reproducer (note that TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 is not used by TLS
1.1)
{code:java}
public class InvalidSslProtocolTest extends GridCommonAbstractTest {
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
cfg.setClientConnectorConfiguration(new ClientConnectorConfiguration()
.setSslEnabled(true)
.setSslClientAuth(true)
.setUseIgniteSslContextFactory(false)
.setSslContextFactory(sslContextFactory("thinServer", "trusttwo",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.2")));
return cfg;
}
/** */
@Test
public void test() throws Exception {
startGrid();
Ignition.startClient(new ClientConfiguration()
.setAddresses("127.0.0.1:10800")
.setSslMode(SslMode.REQUIRED)
.setSslContextFactory(sslContextFactory("thinClient", "trusttwo",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.1")));
}
/** */
private SslContextFactory sslContextFactory(String keyStore, String
trustStore, String cipherSuite, String protocol) {
SslContextFactory res = (SslContextFactory)sslTrustedFactory(keyStore,
trustStore);
res.setCipherSuites(cipherSuite);
res.setProtocol(protocol);
return res;
}
}
{code}
Summary: Thin client startup hangs if an error occur during SSL
handshake (was: Thin client startup hangs if SSL cipher suite version does not
match the SSL protocol version.)
> Thin client startup hangs if an error occur during SSL handshake
> ----------------------------------------------------------------
>
> Key: IGNITE-14789
> URL: https://issues.apache.org/jira/browse/IGNITE-14789
> Project: Ignite
> Issue Type: Bug
> Reporter: Mikhail Petrov
> Priority: Major
>
> Thin client startup hangs if an error occur during SSL handshake.
> The main reason -
> Exception can be thrown during initial part of handshake from
> javax.net.ssl.SSLEngine#beginHandshake that is called from GridNioSslHandler
> constructor.
> In this case SSL handler is not added to SSL meta.
> And during GridNioSslFilter#onSessionClose the GridNioSslFilter#sslHandler
> method will
> throw IgniteException that remains unhandled.
> That leads to AbstractNioClientWorker terminates abruptly and user thread
> hangs with the following thread dump
> {code:java}
> "test-runner-#1%ignite.InvalidSslProtocolTest%" #12 prio=5 os_prio=0
> tid=0x00007f4be0a0c800 nid=0xc5b3 waiting on condition [0x00007f4b779eb000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.get0(GridFutureAdapter.java:178)
> at
> org.apache.ignite.internal.util.future.GridFutureAdapter.get(GridFutureAdapter.java:141)
> at
> org.apache.ignite.internal.client.thin.io.gridnioserver.GridNioClientConnectionMultiplexer.open(GridNioClientConnectionMultiplexer.java:136)
> at
> org.apache.ignite.internal.client.thin.TcpClientChannel.<init>(TcpClientChannel.java:166)
> at
> org.apache.ignite.internal.client.thin.TcpIgniteClient$$Lambda$582/1885200808.apply(Unknown
> Source)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:877)
> - locked <0x000000076e493918> (a
> org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.getOrCreateChannel(ReliableChannel.java:858)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel$ClientChannelHolder.access$400(ReliableChannel.java:807)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:739)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel.applyOnDefaultChannel(ReliableChannel.java:712)
> at
> org.apache.ignite.internal.client.thin.ReliableChannel.channelsInit(ReliableChannel.java:683)
> at
> org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:124)
> at
> org.apache.ignite.internal.client.thin.TcpIgniteClient.<init>(TcpIgniteClient.java:101)
> at
> org.apache.ignite.internal.client.thin.TcpIgniteClient.start(TcpIgniteClient.java:327)
> at org.apache.ignite.Ignition.startClient(Ignition.java:612)
> at
> org.apache.ignite.InvalidSslProtocolTest.test(InvalidSslProtocolTest.java:33)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> at
> org.apache.ignite.testframework.junits.GridAbstractTest$7.run(GridAbstractTest.java:2432)
> at java.lang.Thread.run(Thread.java:748)
> {code}
> Reproducer:
> {code:java}
> public class InvalidSslProtocolTest extends GridCommonAbstractTest {
> /** {@inheritDoc} */
> @Override protected IgniteConfiguration getConfiguration(String
> igniteInstanceName) throws Exception {
> IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
> cfg.setClientConnectorConfiguration(new ClientConnectorConfiguration()
> .setSslEnabled(true)
> .setSslClientAuth(true)
> .setUseIgniteSslContextFactory(false)
> .setSslContextFactory(sslContextFactory("thinServer", "trusttwo",
> "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.2")));
> return cfg;
> }
> /** */
> @Test
> public void test() throws Exception {
> startGrid();
> Ignition.startClient(new ClientConfiguration()
> .setAddresses("127.0.0.1:10800")
> .setSslMode(SslMode.REQUIRED)
> .setSslContextFactory(sslContextFactory("thinClient", "trusttwo",
> "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLSv1.1")));
> }
> /** */
> private SslContextFactory sslContextFactory(String keyStore, String
> trustStore, String cipherSuite, String protocol) {
> SslContextFactory res =
> (SslContextFactory)sslTrustedFactory(keyStore, trustStore);
> res.setCipherSuites(cipherSuite);
> res.setProtocols(protocol);
> return res;
> }
> }
> {code}
> The mentioned issue also affects GridClient.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)