Я обнаружил, что при доступе к веб-приложению, которое использует проверку подлинности сертификата клиента, запущенную на 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 (и разрядностью ОС).
Тестовый пример с использованием последних версий:
в server.xml добавьте строку:
<Connector port = "8443" protocol = "org.apache.coyote.http11.Http11AprProtocol" secure = "true" scheme = "https" maxThreads = "150" URIEncoding = "UTF-8" SSLVerifyClient = "optional" SSLProtocol = " TLSv1 + TLSv1.1 + TLSv1.2 "SSLPassword =" testing "SSLEnabled =" true "SSLCertificateKeyFile =" C: /your_server_key_private.pem "SSLCertificateFile =" C: / your_server_key _public.pem "SSLCACertificate_support. "/>
запустить Tomcat, выполнив startup.bat
(см. ссылку на ошибку ниже, чтобы получить полный тестовый пример со всеми необходимыми файлами, включая файлы сертификатов)
Если я не использую APR (удалив tcnative-1.dll файла и адаптации синтаксиса коннектора для JSSE) проблемы не возникает.
Пробные версии, у всех есть проблема:
Похожая проблема обсуждалась в списке рассылки tomcat-users в 2010 году: Сертификат клиента пропал после 1 минуты ожидания (SSL, APR) но без решения. Я сам недавно туда разместил ( Firefox SSL с APR - потеря клиентского сертификата немного подробнее), но в основном это просто мой монолог.
Изменить: информация о сертификате
Первоначально я тестировал сертификат сервера, выданный моим частным центром тестирования. Теперь я тоже попробовал с «настоящим» сертификатом, выданным доверенным центром сертификации. (Я использовал свой личный сертификат. Браузер пожаловался на имя хоста mitmatch, которое я отключил).
Изменить: отчет об ошибке
Сообщается как Ошибка 58244 - двусторонний SSL теряет сертификат клиента после нескольких запросов.
Предложения по устранению проблемы приветствуются.
У меня было слишком много проблем с использованием клиентских сертификатов в java-приложениях (как на стороне клиента, так и на сервере). APR помогает, но у него есть свои проблемы. В конце концов, я решил прекратить попытки и теперь выгружаю обработку SSL на прокси перед приложением. И Apache, и Nginx хорошо работают в этой роли.