Ответ 1
JVM требует перезагрузки после импорта сертификатов в хранилище ключей.
Я пытаюсь получить приложение, работающее поверх Tomcat 6, для подключения к LDAP-серверу через SSL.
Я импортировал сертификат сервера в хранилище ключей, используя:
C:\Program Files\Java\jdk1.6.0_32\jre\lib\security>keytool -importcert -trustcacerts -file mycert -alias ca_alias -keystore "c:\Program Files\Java\jdk1.6.0_32\jre\lib\security\cacerts"
Когда я запускаю Tomcat с включением SSL-отладки, в соответствии с журналами Tomcat использует правильный файл сертификата:
trustStore is: C:\Program Files\Java\jdk1.6.0_32\jre\lib\security\cacerts
Тем не менее, Tomcat не добавляет сертификат, который я только что импортировал, - все остальные сертификаты в файле cacerts печатаются в журнале - и сбой подключения:
handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Перезапуск Tomcat не помогает. Я проверил с командой keytool -list, что новый сертификат действительно существует в файле.
Почему Tomcat продолжает игнорировать мой новый сертификат?
EDIT:
Похоже, проблема была вызвана Windows 7 VirtualStore. Keytool создал новую копию файла cacert, а Tomcat использовал исходный файл.
JVM требует перезагрузки после импорта сертификатов в хранилище ключей.
Проверьте, есть ли ключ с той же информацией CN, но с другим псевдонимом.
У меня были подобные проблемы раньше, когда я пытался импортировать новую версию сертификата, но оставил более старую версию в хранилище ключей. Мои Java-программы просто найдут первый соответствующий CN-ключ в хранилище ключей (который был старым истекшим) и попытаются использовать его, даже если он был более новым, который также соответствовал CN.
Также убедитесь, что аутентификационный корневой сертификат (и промежуточный сертификат, если применимо) существует в хранилище ключей. Если вы проверяете подлинность одного из основных поставщиков безопасности, таких как Verisign или Globalsign, они обычно предоставляют вам корневой и промежуточный сертификаты. Если эти сертификаты уже существуют в хранилище ключей, убедитесь, что они все еще действительны. Вам нужно, чтобы все сертификаты из вашего личного сертификата были полностью удалены по цепочке аутентификации в корневой каталог, существующий в хранилище ключей, чтобы он понимал, как проверить ваши учетные данные.
То, что вы описали, именно то, что я получал при использовании cmd.exe
, и обычного пользователя, хотя и члена административной группы на Windows Server. Вы должны запустить cmd.exe
в режиме администрирования, чтобы применить изменения в файлах cacerts. По крайней мере, на ОС Win2k8.
Если вы не сделаете этого, мы покажем вам в представлении keytool.exe -list
вновь добавленные сертификаты, но Tomcat их не увидит. Не знаю, почему так. Но когда вы добавляете его, когда cmd.exe запускается с правами администратора Tomcat с новыми сертификатами.
Вы также можете использовать Djavax.net.debug="ssl,handshake"
, чтобы узнать, что Tomcat читает из файла cacerts.