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

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 секунд. После этого каждый запрос будет терпеть неудачу, пока я не перезапущу tomcat (или перезапущу Firefox, или просто сниму флажок «Активный вход» в Firefox и повторно не выберу сертификат для нового соединения). После перезапуска проблема всегда возвращается (и исчезает на 30 секунд, если я перезапускаю снова).

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

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

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

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

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

Пробные версии, у всех есть проблема:

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

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

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

Изменить: отчет об ошибке

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

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

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