Tomcat двумя путями SSL с APR теряет клиентский сертификат после нескольких запросов

Я нашел, что при доступе к веб-приложению, которое использует клиентскую аутентификацию сертификата, работает на Tomcat/APR (в Windows) с Firefox или Chrome, клиентский сертификат "потерян" после короткого времени. К приложению кажется, что клиентский сертификат не был отправлен.

Пример кода (фрагмент JSP):

User client cert data:
<%= ((java.security.cert.X509Certificate[])
request.getAttribute("javax.servlet.request.X509Certificate"))[0].
getSubjectX500Principal().toString()%>

После нескольких обновлений страницы (где это покажет клиентскому сертификату DN) страница перестанет работать с NullPointerException, поскольку request.getAttribute возвратит пустой указатель. Это обычно происходит меньше чем за минуту. Быть более точным: при перезагрузке о столь же в секунду, проблема происходит почти каждый раз после 30 секунд. После того, как тот каждый запрос приведет тот же путь к сбою, пока я не перезапущу кота (или перезапущу Firefox или просто очищу "Активные Логины" в Firefox и повторном выборе сертификат на новом соединении). После перезапуска проблема всегда возвращается (и уходит в течение 30 секунд, если я перезапускаю снова).

Это происходит с Firefox (v39 и v40) и Chrome (v44), но не с IE v11.

Это также происходит с различными версиями кота и Java (и разрядность ОС).

Тестовый сценарий с помощью последних версий:

  • загрузите и извлеките apache-tomcat-8.0.24-windows-x64.zip
  • в веб-приложениях папка создает папку, названную сертификатом, там создайте файл, названный ccertA.jsp, который содержит вышеупомянутый фрагмент кода
  • в server.xml добавляют строку:

    <Порт Connector = "8443" протокол = "org.apache.coyote.http11. Http11AprProtocol" защищают = "истинная" схема = "https" maxThreads = "150" URIEncoding = "UTF-8" SSLVerifyClient = "дополнительный" SSLProtocol = "TLSv1+TLSv1.1+TLSv1.2" SSLPassword = "тестирующий" SSLEnabled = "истинный" SSLCertificateKeyFile = "C:/your_server_key_private.pem" SSLCertificateFile = "C:/your_server_key _public.pem" SSLCACertificateFile = "C:/supported_client_CAs.pem"/>

  • запустите кота путем выполнения startup.bat

  • откройте страницу https://localhost:8443/cert/ccertA.jsp и продолжайте обновлять ее каждые несколько секунд

(см. ошибку, связанную ниже для полного тестового сценария со всеми необходимыми файлами, включая файлы сертификата),

Если я не использую APR (путем удаления файла tcnative-1.dll и адаптации синтаксиса коннектора к JSSE), проблемы не происходит.

Испытанные версии, все имеющие проблему:

  • apache-tomcat-8.0.24-windows-x64 (также версия на 32 бита)
  • apache-tomcat-6.0.44-windows-x64
  • Java 1.6.0 обновлений 12 и 45
  • Обновление Java 1.8 51
  • Windows 7 Pro SP1 64 бита
  • Windows 7 Pro SP1 32 бита
  • Windows 8.1 Pro 64 бита
  • Windows 10 Домашние 64 бита
  • Версии Firefox 39.0 39.0.3 и 44
  • Chrome v44
  • Ubuntu 14.04 LTS 64 бита / кот, 7.0.52-1ubuntu0.3 / libapr1:amd64 1.5.0-1 / libtcnative-1:amd64 1.1.29-1

Подобный вопрос обсуждался в списке рассылки пользователей кота в 2010: Клиентский сертификат, за которым следуют тайм-аут 1 минуты (SSL, APR), но без решения. Я недавно отправил там меня (Firefox SSL с APR - проигрывающий клиентский сертификат имеет немного больше деталей), но это - в основном просто мой монолог.

Править: Информация о сертификате

Первоначально я протестировал с сертификатом сервера, выпущенным моим частным тестированием Приблизительно Теперь, я также попробовал "реальным" сертификатом, выпущенным доверяемым Приблизительно (я использовал свой персональный сертификат. Браузер жаловался на имя хоста mitmatch, который я нажал далеко).

Править: отчет об ошибках

Сообщаемый как Ошибка 58244 - два пути SSL теряет клиентский сертификат после нескольких запросов

Предложения о том, как отладить проблему, приветствуются.

2
задан 17 September 2015 в 22:02
1 ответ

У меня было слишком много проблем с использованием клиентских сертификатов с java-приложениями (как на клиентской стороне, так и на сервере). APR помогает, но у него есть свои проблемы. В конце концов, я решил перестать пытаться и теперь я выгружаю обработку SSL на прокси перед приложением. И Apache, и Nginx хорошо работают в этой роли

.
1
ответ дан 3 December 2019 в 12:45

Теги

Похожие вопросы