Я прочитал несколько связанных вопросов, но ни один из них не помогает мне. Итак, позвольте мне рассказать вам немного истории: Я пишу систему голосования, в которой у вас есть несколько серверов, которые управляют регистрацией, обменом карточками и голосованием. Во время пользователь регистрации подают его персональные данные, сервер проверяет, если данные совпадают в базе данных, а затем принимает сертификат пользователя и добавляет его доверенные сертификаты, как это:Управление несколькими записями в java (custom) truststore
KeyStore.Entry entry = new KeyStore.TrustedCertificateEntry(cert);
trustKeyStore.setEntry(alias, entry, null);
и затем сохраняет доверенное хранилище в файле , Во время регистрации многие пользователи регистрируют свои сертификаты, а затем подключаются к другому серверу, который запрашивает аутентификацию клиентов и серверов, и здесь возникает проблема. Я подумал, что этот «другой сервер» может использовать вышеупомянутый trustStore для выполнения SSLHandshake с пользователями, но похоже, что trustStore «запоминает» только последнего зарегистрированного пользователя. Я создаю SSLServerSocket так:
tmf.init(trustKeyStore);
kmf.init(keyStore, password);
// create, init SSLContext
SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// create SSLSocketFactory and SSLSocket
SSLServerSocketFactory sslSocketFactory = (SSLServerSocketFactory)sslCtx.getServerSocketFactory();
sslSocket = (SSLServerSocket)sslSocketFactory.createServerSocket(1234);
Как я уже упоминал ранее, как на сторону аутентификация работает нормально, но только для последней записи в доверенном хранилище. Итак, теперь, наконец, мой вопрос: мне нужно создать отдельный trustStore для каждого пользователя? Должен ли я перегружать TrustManager? В принципе, можно ли каким-либо образом заставить SSLContext/SSLEngine перебирать все мои доверенные сертификаты и выполнить рукопожатие, если оно найдет совпадение?
UPDATE
Я думаю, что нужно прояснить несколько вещей. Прежде всего, это не веб-приложение, а просто обычное приложение java swing для клиент-сервер. Каждый отдельный сертификат (сервер или клиент) самоподписан, но сертификат сервера встроен в клиентское приложение, поэтому, когда клиент подключается к серверу, он может сравнивать сертификаты (работы). Я также попытался решить его точно так же, как предложил Бруно - после регистрации пользователей сервер проверяет, действительно ли его данные действительны, если он выдает новый сертификат для клиента, добавляет его в свою доверенность и отправляет его клиенту. Но это не сработало даже для последнего зарегистрированного клиента.
Используете ли вы * разные * псевдонимы для каждого пользователя, или вы каждый раз переписываете запись доверия? – Borealid
Просто интересно, являются ли эти пользовательские сертификаты самозаверяющими? Как они получают свои сертификаты? – Bruno
, конечно, я использую разные псевдонимы :) Я проверил, и trsutStore.aliases() действительно дает весь список. Все пользовательские сертификаты самоподписаны. – michauwilliam