Мне необходимо поддерживать возможность использования нескольких разных клиентских сертификатов на одном и том же хосте в моем приложении, поэтому для этого я предположил, что лучшим подходом было сделать недействительными любые существующие сеансы SSLS перед использованием другого клиентского сертификата.
Однако самый простой подход: получение сессий из sslContext и их аннулирование, создает исключение UnsupportedOperationException (похоже, это NativeSSLSession )
Enumeration<byte[]> ids = sslContext.getClientSessionContext().getIds();
while(ids.hasMoreElements()) {
sslContext.getClientSessionContext().getSession(ids.nextElement()).invalidate();
}
По какой-то причине это работает, если я получаю сеанс из сокета в перехватчике, но очевидно, что аннулирование сеанса в этой точке слишком поздно (здесь это Java8ExtendedSSLSession )
builder.addNetworkInterceptor(chain -> {
((SSLSocket)chain.connection().socket()).getSession().invalidate();
return chain.proceed(chain.request());
});
Мой последний подход, который, похоже, работает, заключается в том, чтобы установить время сеанса на минимально возможную продолжительность в 1 секунду (0 - бесконечно), а затем подождать 1 секунду, но, очевидно, это действительно уродливый и, надеюсь, ненужный хак:
int prevTimeout = sslContext.getClientSessionContext().getSessionTimeout();
sslContext.getClientSessionContext().setSessionTimeout(1);
Thread.sleep(1000);
//Do something while the sessions are expired
sslContext.getClientSessionContext().setSessionTimeout(prevTimeout);
Есть ли лучший способ сделать эти сессии недействительными или, возможно, другой подход к этой проблеме?