2016-09-01 10 views
1

У меня есть реализация шаблона реактора, в котором я загружаю SSLContext, когда TransportListener (в основном прослушиватель прослушивателя на данном порту для соединений HTTPS) запускается ,Эффект для SSLEngine при вызове init() общего объекта SSLContext снова

Тогда я называю тот же метод init() снова (через JMX вызова метода слушателя)

sslContext.init(keyManagers, trustManagers, null); 

один раз добавить или удалить сертификат в/из хранилища доверенных. Я должен перезагрузить SSLContext во избежание простоя в слушателе.

Так что это проблема, с которой я сейчас сталкиваюсь.

Предположим, что запрос пришел к слушателю и установлено соединение. Если я перезагрузите объект SSLContext до того, как ответ будет возвращен клиенту, это повлияет на процесс объекта соединения, который шифрует полезную нагрузку перед отправкой?

Примечание: Я подтверждено, что тот же SSLContext объект передается всему объекту SSLEngines.The SSLContext передается нескольким другим объектам, когда слушатель начинает. Например, у меня есть пул соединений, к которому я должен передать этот объект SSLContext. Поэтому создание нового объекта SSLContext полностью разрушит существующие соединения - это пул соединений. Вот почему я пытаюсь использовать один и тот же объект SSLContext.

+1

Не было ничего, что мешало бы вам испытать это для себя * перед тем, как решиться на то, что вам нужно делать. Ничто не мешает вам начать использовать * новый * 'SSLContext' всякий раз, когда вы загружаете новый сертификат: это также позволит избежать простоя в слушателе. Вы не можете передать один и тот же «SSLSession» любым «SSLEngines» вообще, не говоря уже о нескольких. Вы имеете в виду 'SSLContext'? – EJP

+0

... и вы можете изменить доверительное хранилище, не настраивая новый контекст. – eckes

+0

Я проверил это для всех других случаев использования. Но я не могу воспроизвести такой сценарий, как то, что я упомянул выше (измените sslcontext перед отправкой ответа, но после получения запроса). @eckes У меня нет проблемы с изменением хранилища доверия. Мне нужно перезагрузить хранилище доверия во время выполнения без перезапуска «Listener». –

ответ

0

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

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

+0

Извините за путаницу. Я обновил его. Я передаю объект SSLContext. Я хочу знать, зависит ли от существующих соединений сокетов, которые используют объекты SSLEngine для обертывания и разворота, путем изменения доверительных менеджеров объекта SSLContext. Это проблема только в сценарии, когда запрос получен, но ответ еще не отправлен. Есть ли возможность того, что входящее соединение разворачивается с помощью набора ключей, а ответ завершается с помощью отдельного набора ключей, которые нарушают связь, является ли описанный выше сценарий? –

+0

Ключи сеанса находятся в 'SSLSession', а не' SSLContext', но я до сих пор не понимаю, почему вы считаете, что вам нужно повторно инициализировать 'SSLContext существующего соединения. – EJP

+0

Это означает, что 'SSLEngine' использует только SSLContext' для рукопожатия. Поэтому впоследствии изменение «SSLContext» не влияет на существующую «SSLSession» или «SSLEngine» соединения/сокета, если это не рукопожатие. Я прав? –