Я обнаружил, что полезным средством отладки является написание оболочки вокруг X509KeyManager и X509TrustManager, которая делегирует вызовы исходной реализации во время регистрации результатов, например ::
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, null);
TrustManager[] tms = WrapTrustManager.WrapArray(tmf.getTrustManagers());
KeyManager[] kms = WrapKeyManager.WrapArray(kmf.getKeyManagers());
SSLContext context = SSLContext.getInstance("TLS");
context.init(kms, tms, null);
....setSocketFactory(context.getSocketFactory());
Реализация WrapTrustManager и WrapKeyManager довольно проста, но предупреждает, что они используют исключения для обозначения сбоя, поэтому важно не глотать исключения во время регистрации результата.
Обратите внимание, что интерфейс использует пустые интерфейсы KeyManager и TrustManager, и вам необходимо динамически преобразовать их в X509KeyManager и X509TrustManager.