Отказаться от SSLS-сессий в Android / OkHttp - PullRequest
0 голосов
/ 16 ноября 2018

Мне необходимо поддерживать возможность использования нескольких разных клиентских сертификатов на одном и том же хосте в моем приложении, поэтому для этого я предположил, что лучшим подходом было сделать недействительными любые существующие сеансы 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);

Есть ли лучший способ сделать эти сессии недействительными или, возможно, другой подход к этой проблеме?

...