Я нашел, что при доступе к веб-приложению, которое использует клиентскую аутентификацию сертификата, работает на 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 (и разрядность ОС).
Тестовый сценарий с помощью последних версий:
в 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
(см. ошибку, связанную ниже для полного тестового сценария со всеми необходимыми файлами, включая файлы сертификата),
Если я не использую APR (путем удаления файла tcnative-1.dll и адаптации синтаксиса коннектора к JSSE), проблемы не происходит.
Испытанные версии, все имеющие проблему:
Подобный вопрос обсуждался в списке рассылки пользователей кота в 2010: Клиентский сертификат, за которым следуют тайм-аут 1 минуты (SSL, APR), но без решения. Я недавно отправил там меня (Firefox SSL с APR - проигрывающий клиентский сертификат имеет немного больше деталей), но это - в основном просто мой монолог.
Править: Информация о сертификате
Первоначально я протестировал с сертификатом сервера, выпущенным моим частным тестированием Приблизительно Теперь, я также попробовал "реальным" сертификатом, выпущенным доверяемым Приблизительно (я использовал свой персональный сертификат. Браузер жаловался на имя хоста mitmatch, который я нажал далеко).
Править: отчет об ошибках
Сообщаемый как Ошибка 58244 - два пути SSL теряет клиентский сертификат после нескольких запросов
Предложения о том, как отладить проблему, приветствуются.
У меня было слишком много проблем с использованием клиентских сертификатов с java-приложениями (как на клиентской стороне, так и на сервере). APR помогает, но у него есть свои проблемы. В конце концов, я решил перестать пытаться и теперь я выгружаю обработку SSL на прокси перед приложением. И Apache, и Nginx хорошо работают в этой роли
.