нулевой указатель в процессоре SSO java NIO

попытка запустить gitblit на tomcat 9 с использованием JDK 11 иногда приводит к этой трассировке стека:

gitblit    | 07-May-2020 04:30:39.247 SEVERE [https-jsse-nio-8443-exec-10] org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun Error running socket processor
gitblit    |    java.lang.NullPointerException
gitblit    |            at java.base/sun.security.ssl.HKDF.extract(HKDF.java:93)
gitblit    |            at java.base/sun.security.ssl.HKDF.extract(HKDF.java:119)
gitblit    |            at java.base/sun.security.ssl.ServerHello.setUpPskKD(ServerHello.java:1167)
gitblit    |            at java.base/sun.security.ssl.ServerHello$T13ServerHelloProducer.produce(ServerHello.java:545)
gitblit    |            at java.base/sun.security.ssl.SSLHandshake.produce(SSLHandshake.java:436)
gitblit    |            at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.goServerHello(ClientHello.java:1234)
gitblit    |            at java.base/sun.security.ssl.ClientHello$T13ClientHelloConsumer.consume(ClientHello.java:1170)
gitblit    |            at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.onClientHello(ClientHello.java:852)
gitblit    |            at java.base/sun.security.ssl.ClientHello$ClientHelloConsumer.consume(ClientHello.java:813)
gitblit    |            at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
gitblit    |            at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
gitblit    |            at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1061)
gitblit    |            at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1048)
gitblit    |            at java.base/java.security.AccessController.doPrivileged(Native Method)
gitblit    |            at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:995)
gitblit    |            at org.apache.tomcat.util.net.SecureNioChannel.tasks(SecureNioChannel.java:443)
gitblit    |            at org.apache.tomcat.util.net.SecureNioChannel.handshakeUnwrap(SecureNioChannel.java:507)
gitblit    |            at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:238)
gitblit    |            at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1616)
gitblit    |            at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
gitblit    |            at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
gitblit    |            at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
gitblit    |            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
gitblit    |            at java.base/java.lang.Thread.run(Thread.java:834)

Когда клиенты пытаются извлечь файлы из графического интерфейса gitblit.

Возможно, интересно, пока я не обновился до версии JDF 11.0.7, я видел эту ошибку: Open JDK 11 HTTP/2 Handshake ServerHello java.util.NoSuchElementException

Где исправлено неправильное использование необязательного здесь: https://bugs.openjdk.java.net/browse/JDK-8218889, но, возможно, на самом деле не решил корневую проблему?

Или какие-либо другие мысли о том, что вызывает эту ошибку? Я использую самозаверяющий сертификат здесь, FYI. Клиент — Firefox, а версия Java —

openjdk версия «11.0.7» 14.04.2020 OpenJDK Runtime Environment AdoptOpenJDK (сборка 11.0.7+10) OpenJDK 64-разрядная виртуальная машина сервера AdoptOpenJDK (сборка 11.0.7+10, смешанный режим)

Запуск внутри док-системы Alpine Linux.

Поиск проблемы, из-за которой gitblit время от времени прерывается на 1 минуту, и обнаружение этого в журнале. Не знаю, связано это или нет....

Похоже, он также был найден в tomcat https://bz.apache.org/bugzilla/show_bug.cgi?id=64105 и сообщается здесь.

https://bugs.openjdk.java.net/browse/JDK-8241248

Поскольку я не могу предоставить информацию об отслеживании ошибок openjdk, я могу сказать вам, что клиент, который обычно вызывает это у меня, — это Firefox 75 в Linux.


person user2163960    schedule 07.05.2020    source источник
comment
Я согласен с вами, что средство отслеживания ошибок OpenJDK является постоянным источником раздражения. Можно прийти к выводу, что участие в OpenJDK нежелательно. Или это просто поведение Oracle по умолчанию?   -  person Robert    schedule 07.05.2020


Ответы (1)


Как указано в ссылках на багтрекер, которые вы предоставили, это ошибка, связанная с возобновлением сеанса.

Хотя этот ответ не устраняет саму ошибку, есть возможность попросить SSLEngine запретить возобновление для определенного соединения. Это приводит к снижению производительности для будущих подключений, поскольку клиенту необходимо повторно выполнить рукопожатие для новых подключений вместо использования механизма возобновления сеанса.

В любой момент после установления рукопожатия вы можете вызвать invalidate() в SSLSession. Как указано в документе:

Будущие соединения не смогут возобновить или присоединиться к этому сеансу. Однако любое существующее соединение, использующее этот сеанс, может продолжать использовать сеанс, пока соединение не будет закрыто.

Это означает, что это не повлияет на текущее соединение, но предотвратит возобновление сеанса и, таким образом, позволит избежать ошибки JDK.

Мой фрагмент для цикла рукопожатия:

case NOT_HANDSHAKING:
case FINISHED:
{
    if( !sslEngine.getSession().isValid() || sslEngine.getSession().getId().length == 0 )
        throw new SSLHandshakeException("Handshake failed");

    // prevent bug with rejoin session
    sslEngine.getSession().invalidate();

    return;
}
person Simon    schedule 13.06.2020