Можно ли перезагрузить trustmanager после открытия serversocket в ssl-соединении

Допустим, я создал SSLContext, создал serverSocket из serverSocketFactory и начал принимать соединения.

что-то вроде:SSLContext.getDefault().getServerSocketFactory().createServerSocket(1234).accept();

Предположим, что он работает какое-то время, и теперь я решил изменить мой TrustManager(добавить / удалить новые сертификаты для доверия). Можно ли сделать это, не закрывая сокет и не создавая новый SSLContext?

1 ответ

Вы можете использовать следующий подход.

Во-первых, вы держите ссылку на ваш SSLContext объект, когда вы создаете его.

SSLContext sslContext=SSLContext.getDefault();
sslContext.getServerSocketFactory().createServerSocket(1234).accept();

Затем, когда вы хотите загрузить новый TrustManagerВы можете позвонить init() метод снова с соответствующим TrustManager следующим образом.

TrustManager trustManagers[] = // load trust managers here.
sslContext.init(null,trustManagers,null);

Здесь init() метод принимает 3 параметра, KeyManager[],TrustManager[] а также SecureRandom, Если вы пройдете null для любого из них SSLContext будет загружен с менеджерами ключей и доверительными управляющими по умолчанию. Поскольку вы хотите загрузить только доверенных менеджеров, вы должны передать новый TrustManager[] к этому.

Поскольку вы не меняете ссылку на ваш SSLContext объект, это не нарушит ваш поток или не повлияет на ваш существующий SSLIOSessions.

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