Open
Description
No TLS Session re-use when using Netty4ClientEngineFactory
(default)
Expected behavior
When establishing a second connection between the same client and server instance the TLS sessions should be re-used.
Actual behavior
Each connection gets its own TLS session when configuring the client with SslClientConfiguration
.
Using the default SslClientEngineFactory
leads to using the Netty4ClientEngineFactory
which has this behaviour. Configuring the sslcontext directly with .withTransport.tls(SSLContext)
leads to using the SslContextClientEngineFactory
which does work.
Steps to reproduce the behavior
See testcases: https://github.com/spockz/finagle-tls-session-reuse/blob/master/src/test/scala/com/github/spockz/finagle/it/tls/TlsTest.scala, output:
[info] TlsTest:
[info] Tls on server and client
[info] - should support session resumption with ssl context
[info] + ###
[info] + ### First call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] + ###
[info] + ###Second call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] - should support session resumption with SslClientConfiguration *** FAILED ***
[info] Set("95-106-2055-9833-123101-3168-65-93-93-24-491537-3922-7-81906-11856-24-46789086113-50", "95-106-2055-11-1116-99-80-323326-2274-11950127-12765-29289-128-28-32-4825-73-101-33-8343") had size 2 instead of expected size 1 (TlsTest.scala:95)
[info] + ###
[info] + ### First call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] + ###
[info] + ###Second call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] - should support session resumption with SslClientConfiguration read from PEMS *** FAILED ***
[info] Set("95-106-205563-679748-3372574941-19-1081-10398-709-417954-39-123-11647-4-10-5120", "95-106-2055-110-85446125371-8667-1041063569-5110-124119-184487-54-1118641-43-2792104") had size 2 instead of expected size 1 (TlsTest.scala:95)
[info] + ###
[info] + ### First call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] + ###
[info] + ###Second call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] - should support session resumption with SslClientConfiguration and a cached Netty4ClientEngineFactory *** FAILED ***
[info] Throw(Failure(renegotiation unsupported at remote address: localhost/127.0.0.1:62739. Remote Info: Not Available, flags=0x08) with RemoteInfo -> Upstream Address: Not Available, Upstream id: Not Available, Downstream Address: localhost/127.0.0.1:62739, Downstream label: somelabel, Trace Id: e188359a301a902a.6fad2b7b5ed57202<:9511f135ae05febd with Service -> somelabel) was not an instance of com.twitter.util.Return, but an instance of com.twitter.util.Throw (TlsTest.scala:91)
[info] + ###
[info] + ### First call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] + ###
[info] + ###Second call
[info] + Throw(Failure(renegotiation unsupported at remote address: localhost/127.0.0.1:62739. Remote Info: Not Available, flags=0x08) with RemoteInfo -> Upstream Address: Not Available, Upstream id: Not Available, Downstream Address: localhost/127.0.0.1:62739, Downstream label: somelabel, Trace Id: e188359a301a902a.6fad2b7b5ed57202<:9511f135ae05febd with Service -> somelabel)
[info] - should support session resumption with SslClientConfiguration and a SslContextEngineFactory
[info] + ###
[info] + ### First call
[info] + Return(Response("HTTP/1.1 Status(201)"))
[info] + ###
[info] + ###Second call
[info] + Return(Response("HTTP/1.1 Status(201)"))
Possible fixes
- I tried to cache the created Engine in https://github.com/spockz/finagle-tls-session-reuse/blob/master/src/test/scala/com/github/spockz/finagle/it/tls/TlsTest.scala#L147 which leads to the error
Failure(renegotiation unsupported..
. This appears to be because the engine is already destroyed. - Using the
SslContextClientEngineFactory
mitigates the session issue, but this drops back to using JSSE for TLS which drops performance on JDK8 and loses H2.
Metadata
Metadata
Assignees
Labels
No labels