Mark,
> 
> Am 23.06.2017 um 15:17 schrieb Mark Thomas <ma...@apache.org>:
> 
> On 13/06/17 11:57, Mark Thomas wrote:
>> On 13/06/17 10:13, Kreuser, Peter wrote:
>>> Mark,
>>> 
>>>> On 09/06/17 16:02, Kreuser, Peter wrote:
>>>>> Hi all,
>>>>> 
>>>>> Sorry for the long text. I hope somebody can help me track down the 
>>>>> problem I'm facing with Tomcat (8.5.15), tcnative (1.2.12), openssl 
>>>>> (1.1.0e) and HTTP/2. JVM is zulu-8.21.0.1 (1.8.0_131-b11)
>>>> 
>>>> No need to apologise. There was enough information in this report for me
>>>> to be 95% sure of what was going on before I tested things locally.
>>>> 
>>>> <snip/>
>>>> 
>>>>> Would be nice if somebody here could tell me if that is a bug or if I 
>>>>> have some misconfiguration.
>>>> 
>>>> It is a bug.
>>>> 
>>>> The short explanation is that with NIO2, the style of the API (async
>>>> read/write with CompletionHandlers) means that a TLS connection can get
>>>> closed down (by a CompletionHandler) before the access log entry is
>>>> written. This leads to passing a NULL reference to some native code
>>>> which - unsurprisingly - falls over (Tomcat is meant to make sure it
>>>> doesn't pass NULL references).
>>>> 
>>>> There is an easy fix but the side-effect is that sometimes the cipher
>>>> suite name won't appear in the access log. Depending on timing on your
>>>> system that could be very frequent to almost never. I'd roughly expect
>>>> it to happen as frequently as the crashes.
>>>> 
>>>> The harder fix is to note that we want the info and to ensure we cache
>>>> it before the TLS connection is closed down. In theory, we could do this
>>>> in the access log but it means parsing the request attribute config.
>>>> Performance wise, there will be an impact on users since the lookup to
>>>> populate the cache will occur during request processing rather than
>>>> afterwards. However, overall throughput should be unaffected.
>>>> 
>>>> An alternative fix is for the application to trigger the caching of the
>>>> TLS info by requesting one of the TLD attributes.
>>>> 
>>>> Switching to NIO should also fix this. Note, I would not expect NIO and
>>>> NIO2 to be much different performance wise.
>>>> 
>>>> Would the easy fix be sufficient?
>>>> 
>>>> Mark
>>> 
>>> For a start the easy fix would be sufficient. Apparently this is only a 
>>> real problem when I call the site via curl, as it does not happen in the 
>>> various browsers (at least not on every call).
>>> 
>>> We should at least make users aware that certain information can be missing 
>>> in the accesslog and the cause of it (in the AccessLogValve 
>>> documentation?). And are there any other implications of the 
>>> asynchronicity? I guess the behavior of NIO2 and HTTP/2 processing is not 
>>> obvious?
>>> 
>>> Your alternative fix would be to copy the attributes during request 
>>> processing (in a filter) and then log them from the filter request 
>>> attributes instead of the predefined ssl attributes? Correct?
>>> 
>>> Thank you for your support and the bug fix ;-)! Have you filed the bug 
>>> internally or should I?
>> 
>> I need to look into this some more first. Remy's comments suggest that
>> my first analysis might have been wrong.
> 
> I've been looking into this this afternoon. Rémy has made some changes
> to trunk and 8.5.x that prevent the crash.
> 
> It does appear that a timing issue is involved. I'm still looking into
> the details.
> 
> At the moment, the SSL_NULL_WITH_NULL_NULL cipher suite is recorded
> rather than the crash when the TLS information is not available when the
> access log needs it.
> 
> Rémy's changes are in the 9.0.x and 8.5.x releases being voted on at the
> moment.
> 
> Mark
> 
> ---------------------------------------------------------------------

That seems to help. I get 

192.168.1.10 - - [23/Jun/2017:16:53:22 +0200] 'GET / HTTP/2.0' 200 16 5 8843 
'-' 'curl/7.54.0' - SSL_NULL_WITH_NULL_NULL

plus on the console:

23-Jun-2017 16:53:22.045 WARNING [https-openssl-nio2-8843-exec-3] 
org.apache.coyote.AbstractProcessor.populateSslRequestAttributes Exception 
getting SSL attributes
 java.lang.IllegalStateException: SSL session ID not available
        at 
org.apache.tomcat.util.net.openssl.OpenSSLEngine$OpenSSLSession.getId(OpenSSLEngine.java:1047)
        at 
org.apache.tomcat.util.net.jsse.JSSESupport.getSessionId(JSSESupport.java:156)
        at 
org.apache.coyote.AbstractProcessor.populateSslRequestAttributes(AbstractProcessor.java:608)
        at 
org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:361)
        at org.apache.coyote.Request.action(Request.java:426)
        at org.apache.catalina.connector.Request.getAttribute(Request.java:903)
        at 
org.apache.catalina.valves.AbstractAccessLogValve$RequestAttributeElement.addElement(AbstractAccessLogValve.java:1439)
        at 
org.apache.catalina.valves.AbstractAccessLogValve.log(AbstractAccessLogValve.java:653)
        at 
org.apache.catalina.core.AccessLogAdapter.log(AccessLogAdapter.java:48)
        at 
org.apache.catalina.core.ContainerBase.logAccess(ContainerBase.java:1065)
        at 
org.apache.catalina.core.ContainerBase.logAccess(ContainerBase.java:1072)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:401)
        at 
org.apache.coyote.http2.StreamProcessor.service(StreamProcessor.java:245)
        at 
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at 
org.apache.coyote.http2.StreamProcessor.process(StreamProcessor.java:65)
        at org.apache.coyote.http2.StreamRunnable.run(StreamRunnable.java:35)
        at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at 
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

However I still see a timing problem, as it is not always happening. Maybe 5 
out of 7 are NULL. If I send more requests immediately after each other NULL is 
more frequent. 

Best regards

Peter

Reply via email to