Как получить всплывающее меню для выбора сертификата пользователя на сервере Tomcat 10?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как получить всплывающее меню для выбора сертификата пользователя на сервере Tomcat 10?

Сообщение Anonymous »

Я работаю над веб-приложением Java, которое я разверну на сервере Tomcat 10, которое запрашивает у пользователя сертификат (смарт-карты) для его аутентификации (после ввода его обычных учетных данных пользователя). (См. также этот вопрос, в котором описывается больше об этом.) Настроив правильную конфигурацию сервера Tomcat, я подключил свое веб-приложение через https (через порт 8443). Затем, при необходимости, он выполнит запрос https на другом порту (8444) для запроса сертификата пользователя.
Однако проблема, с которой я сталкиваюсь, заключается в том, что браузер никогда не предлагает мне выбрать один из доступных сертификатов, как будто я видел, как он работает у других, которые делают то же самое (см. этот вопрос и этот сайт). Я протестировал свой браузер на таких сайтах, как Login.gov и других правительственных сайтах: у меня появляется всплывающее меню, в котором я могу выбрать сертификат, поэтому я знаю, что проблема не в настройках моего браузера. Я даже могу открыть настройки браузера и просмотреть сертификаты на подключенной мной смарт-карте, чтобы знать, что она их видит.
В настоящее время мой файл server.xml имеет соединители https. вот так: Разъем на порту 8443 практически идентичен, но с сертификатом certificateVerification="false". (Обновление от 17.06.24: я попробовал certificateVerification="required" вместо "true" и "необязательно" или "none"< /code> вместо «false», но никаких успешных результатов.)
В моем Java-сервлете у меня есть:

Код: Выделить всё

// there are various types and providers, but these were the ones that worked
KeyStore keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
// load local certificates (the certificates visible in your browser)
keyStore.load(null);
// get all the names of the available certificates
Enumeration aliases = keyStore.aliases();
что позволяет мне видеть те же сертификаты, которые я вижу в настройках браузера. (Обновление от 17.06.24: после прошедших выходных я больше не вижу список сертификатов... и понятия не имею, почему.) Затем я отправляю запрос соответствующему URL-адрес порта 8444:

Код: Выделить всё

URL url = new URL(certificateRequestUrl);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("GET");
Integer responseCode = connection.getResponseCode(); // error thrown here
Я получаю сообщение об ошибке javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: bad_certificate. Согласно этому обсуждению, я думаю, что ошибка означает, что сервер не доверяет сертификату, представленному во время установления связи SSL, - но он даже не спросил меня, какой сертификат использовать! Я знаю, что URL-адрес структурирован правильно, потому что я получаю ожидаемый ответ, когда для параметра certificateVerification установлено значение «false» на порту, на который отправляется запрос.
< strong>Обновление от 18 июня 2024 г.: Я добавил параметр Java (в Tomcat) -Djavax.net.debug=ssl и увидел некоторые дополнительные сведения:

Код: Выделить всё

javax.net.ssl|ERROR|F3|https-jsse-nio-8444-exec-6|2024-06-18 13:29:13.491 MDT|TransportContext.java:363|Fatal (BAD_CERTIFICATE): Empty client certificate chain (
"throwable" : { javax.net.ssl.SSLHandshakeException: Empty client certificate chain at ...  }
)
javax.net.ssl|WARNING|F3|https-jsse-nio-8444-exec-6|2024-06-18 13:29:13.494 MDT|SSLEngineOutputRecord.java:173|outbound has closed, ignore outbound application data
javax.net.ssl|DEBUG|E2|https-jsse-nio-8443-exec-1|2024-06-18 13:29:13.497 MDT|Alert.java:238|Received alert message (
"Alert": {
"level"      : "fatal",
"description": "bad_certificate"
}
)
javax.net.ssl|ERROR|E2|https-jsse-nio-8443-exec-1|2024-06-18 13:29:13.500 MDT|TransportContext.java:363|Fatal (BAD_CERTIFICATE): Received fatal alert: bad_certificate (
"throwable" : {
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate at ... }
)
Я не понимаю, почему сертификаты не отображаются, поскольку я могу просматривать и загружать их из браузера.
Примечание. Хотя у меня есть смарт-карта временная — без цепочки сертификатов, — у некоторых пользователей этого приложения цепочка сертификатов будет связана с доверенным центром сертификации. Нужно ли мне добавлять сертификат пользователя в хранилище доверенных сертификатов сервера во время настройки карты с его учетной записью, чтобы приниматься будущие подтверждения SSL?
Я думаю, что мой вопрос очень похоже на этот, но у меня будет несколько пользователей, которым необходимо добавить свои сертификаты в хранилище доверенных сертификатов сервера во время настройки учетной записи, поэтому его нужно добавить программно в java. Если это так, как мне предложить пользователю выбрать, какой сертификат (если доступно несколько) добавить в хранилище доверенных сертификатов? В некоторых случаях сертификат пользователя не будет иметь цепочки, тогда как для других пользователей он может иметь цепочку сертификатов, и может потребоваться добавить корень.
Я знаю, что и Java, и мой браузер может видеть мои сертификаты, так почему мой браузер не предоставляет всплывающее меню для выбора сертификата и ввода PIN-кода (при необходимости)? Как заставить браузер отображать эти всплывающие окна?

Подробнее здесь: https://stackoverflow.com/questions/786 ... -10-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»