Я на самом деле не пробовал это, но почему вы не можете реализовать свой собственный менеджер доверия, который сначала делегирует диспетчеру доверия по умолчанию, чтобы проверить, действителен ли сертификат, и если нет, спрашивает пользователя, хочет ли он все еще принять сертификат?
Вы можете инициализировать большинство классов безопасности с нулевыми аргументами, чтобы использовать значения по умолчанию. Чтобы получить диспетчер доверия по умолчанию, вы должны получить доступные диспетчеры доверия и выбрать первый в массивах mgrs для реализации интерфейса X509TrustManager
. Обычно в любом случае массив будет содержать только один элемент.
TrustManagerFactory trustmanagerfactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustmanagerfactory.init((KeyStore)null);
TrustManager[] mgrs = trustmanagerfactory.getTrustManagers();
После того, как вы обернули менеджер доверия по умолчанию своим собственным расширением, вы должны инициализировать контекст SSL и получить из него фабрику сокетов:
SSLContext sslContext=SSLContext.getInstance("SSL","SunJSSE");
sslContext.init(null, new TrustManager[] {myTm}, null);
SSLSocketFactory sf = sslContext.getSocketFactory();
Затем используйте эту фабрику сокетов для создания новых клиентских сокетов или передайте ее HttpsURLConnection.setDefaultSSLSocketFactory
для использования протокола https в URL-адресах с вашим собственным диспетчером доверия.