Можно ли перезагрузить 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
объект, это не нарушит ваш поток или не повлияет на ваш существующий SSLIOSession
s.