Java: как показать диалог, позволяющий пользователю принимать сертификаты SSL

StackOverflow https://stackoverflow.com/questions/1644059

Вопрос

В настоящее время у меня есть самозаверяющий сертификат для моего веб-сервера 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-адресах с собственным диспетчером доверия.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top