Назад | Перейти на главную страницу

Tomcat NullPointerException, когда клиент не завершает квитирование SSL

У меня Tomcat 7.0.12 с использованием APR и OpenSSL. Кажется, все работает нормально, но я вижу некоторые NullPointerException следы стека появляются в журналах. Насколько я могу судить, это происходит всякий раз, когда клиент подключается, инициирует рукопожатие TLS, получает сертификат сервера и затем немедленно закрывает TCP-соединение, не продолжая обмен ключами.

Я использую самозаверяющий сертификат, поэтому это происходит (например), когда браузер не доверяет сертификату и должен попросить пользователя подтвердить его. Очевидно, что клиенту все равно, потому что он отключился.

DEBUG ["http-apr-443"-exec-3] org.apache.tomcat.util.net.AprEndpoint: Handshake failed: error:00000000:lib(0):func(0):reason(0)
ERROR ["http-apr-443"-exec-3] org.apache.coyote.http11.Http11AprProtocol: Error reading request, ignored
java.lang.NullPointerException
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:221)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:323)
    at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:1675)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Если клиент не отключается после получения сертификата от сервера, а вместо этого продолжает рукопожатие, все работает, как ожидалось, без ошибок в журналах. Возможно, это просто косметика, но, возможно, я сделал что-то не так.

Коннектор настроен таким образом (более-менее скопирован где-то из примера):

<Connector
  SSLCertificateFile="/etc/ssl/certs/server.crt"
  SSLCertificateKeyFile="/etc/ssl/private/server.key"
  SSLEnabled="true"
  acceptCount="100"
  clientAuth="optional"
  disableUploadTimeout="true"
  enableLookups="false"
  maxHttpHeaderSize="8192"
  maxThreads="150"
  port="443"
  scheme="https"
  secure="true"
  sslProtocol="TLSv1"
/>

Отредактируйте, чтобы добавить, FWIW, я только что заметил, что есть аналогичный трассировка стека заканчивается в catalina.out в то же время:

Exception in thread ""http-apr-443"-exec-3" java.lang.NullPointerException
    at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:1678)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Это отвлекающий маневр; он перехватывает исключение из обработчика соединения и сбрасывает трассировку. Его загадочные ошибки, подобные этой, заставляют меня предлагать использовать mod_jk для пересылки запросов к коннектору AJP на Tomcat.