SSL: как работать с несколькими клиентами с отдельными ключами, подключенными к одному и тому же порту?

Еще одна проблема поддержки старых версий здесь!
У нас есть сеть с несколькими клиентами, где каждый компонент имеет самозаверяющий сертификат и добавляется в доверенное хранилище сервера / клиента. Мы не используем центр сертификации здесь.
Теперь наша проблема в том, что нам нужно обновить все сертификаты для большей безопасности. Новые клиенты будут приходить с новыми сертификатами, и даже у сервера будут новые сертификаты.
Наша проблема в том, как обращаться со старыми клиентами. Модернизация хранилищ ключей наших старых клиентов - последнее средство.

Вещи, которые не будут работать:

  1. Добавление новых и старых сертификатов в хранилище доверенных сертификатов сервера: даже клиенты проверяют подлинность серверов, и сертификат сервера не будет присутствовать в хранилище доверенных сертификатов клиента.

  2. Использование нового порта для новых клиентов: мы рассмотрели возможность использования новых портов для новых клиентов и продолжения старых портов для старых клиентов, но проблема заключается в том, что существует несколько приложений, которые сталкиваются с этой проблемой, поэтому нам придется искать несколько новых портов, которые не используется другими продуктами.

FWIW: серверы на Java, а клиенты на C++

РЕДАКТИРОВАТЬ после ответа EJP
Я, наверное, задаю очень тупой вопрос здесь, но просто хотел быть уверен. Нет абсолютно никакого способа отредактировать контекст SSL сокета, как только он связан. Правильный?
Кроме того, можем ли мы выбрать сертификат сервера, который будет использоваться во время рукопожатия? я знаю chooseClientAlias() а также chooseServerAlias() методы, но здесь мы не знаем, какой сертификат использовать, пока не будет отправлено клиентское сообщение Hello.

1 ответ

Решение

Оставляя в стороне использование разных портов:

  1. (1) будет работать, если сервер связан с клиентскими сертификатами.
  2. Ничто не сработает с точки зрения того, чтобы заставить старых клиентов распознавать новый сертификат сервера, кроме обновления клиентских доверенных складов.

Вот почему вы должны были использовать CA, даже внутренний, и почему вы не должны повторять ту же ошибку снова. Если бы клиенты доверяли ЦС вместо самозаверяющего сертификата сервера напрямую, у вас сейчас не было бы этой проблемы, и у вас ее не будет в будущем, сколько бы раз вы ни обновляли сертификаты, пока не истечет срок действия сертификата ЦС, что должно занять 20 лет.

И пока вы работаете над этим, убедитесь, что вы создали способ обновления клиентских доверенных складов.

Нет абсолютно никакого способа отредактировать контекст SSL сокета, как только он связан. Правильный?

Нет возможности редактировать SSLContext как только он инициализируется, что предшествует созданию сокетов, не говоря уже о связывании их. Хм, может быть, вы могли бы перезагрузить KeyManager а также TrustManager и просто не рассказывать SSLContext, но я не говорю, что это будет (или не будет) работать.

Кроме того, можем ли мы выбрать сертификат сервера, который будет использоваться во время рукопожатия?

Да вот что KeyManager интерфейс специально для chooseServerAlias(),

я знаю chooseClientAlias() а также chooseServerAlias() методы, но здесь мы не знаем, какой сертификат использовать, пока не будет отправлено клиентское сообщение Hello.

chooseServerAlias не вызывается, пока ClientHello был получен.

Другие вопросы по тегам