Java: как показать диалог, позволяющий пользователю принимать сертификаты SSL
-
10-07-2019 - |
Вопрос
В настоящее время у меня есть самозаверяющий сертификат для моего веб-сервера HTTPS.
В моей java-программе есть SSLSocketFactory, которая создаст сокет для веб-сервера. Реализация по умолчанию sun блокирует самоподписанный сертификат. С собственной реализацией X509TrustManager я могу только проверить, действительна ли дата сертификата.
Есть ли возможность позволить реализации по умолчанию проверять действительность (дата и имя хоста, ...), и если не удается отобразить диалоговое окно, позволяющее пользователю принять этот сертификат?
Каждый код, который я нашел до сих пор, только отключил проверку ssl и принял каждый недействительный сертификат.
Решение
Я на самом деле не пробовал этого, но почему вы не можете реализовать свой собственный менеджер доверия, который сначала делегирует диспетчеру доверия по умолчанию, чтобы проверить, действителен ли сертификат, и если нет, спрашивает пользователя, хочет ли он все еще принять сертификат?
<Ч> Вы можете инициализировать большинство классов безопасности с нулевыми аргументами, чтобы использовать значения по умолчанию. Чтобы получить диспетчер доверия по умолчанию, необходимо получить доступные диспетчеры доверия и выбрать первый в массивах 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-адресах с собственным диспетчером доверия.