Примите самоподписанный сертификат SSL сервера в клиенте Java

Я использовал штрих-сканер dm77 в предыдущих приложениях, это очень хорошая и всесторонняя библиотека, и она предоставляет полезные советы о том, как начать работу с простым сканированием штрих-кода. Еще одна приятная вещь - это то, что нет и интерфейса клавиатуры, о котором нужно беспокоиться.

Библиотека dm77: https://github.com/dm77/barcodescanner

.

198
задан jww 3 June 2017 в 22:12
поделиться

4 ответа

В основном у вас есть два варианта: добавить самозаверяющий сертификат в хранилище доверенных сертификатов JVM или настроить клиента на

Вариант 1

Экспортировать сертификат из браузера и импортировать его в ваше хранилище доверенных сертификатов JVM (для создания цепочки доверия):

<JAVA_HOME>\bin\keytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit 

Вариант 2

Отключить проверку сертификата:

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {     
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
}; 

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
} 
// Now you can access an https URL without having the certificate in the truststore
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) {
} 

Обратите внимание, что я вообще не рекомендую Вариант № 2 . Отключение диспетчера доверия приводит к поражению некоторых частей SSL и делает вас уязвимыми для атак посредника. Предпочитайте вариант №1 или, что еще лучше, пусть сервер использует «настоящий» сертификат, подписанный известным центром сертификации.

293
ответ дан 23 November 2019 в 05:12
поделиться

Существует лучшая альтернатива доверию всем сертификатам: создайте TrustStore, который конкретно доверяет данному сертификату, и используйте его для создания SSLContext, из которого можно получить SSLSocketFactory для установки на HttpsURLConnection. Вот полный код:

File crtFile = new File("server.crt");
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate(new FileInputStream(crtFile));

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("server", certificate);

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);

HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

В качестве альтернативы вы можете загрузить KeyStore непосредственно из файла или получить сертификат X.509 из любого надежного источника.

Обратите внимание, что с этим кодом сертификаты в cacerts не будут использоваться. Этот конкретный HttpsURLConnection будет доверять только этому конкретному сертификату.

0
ответ дан 23 November 2019 в 05:12
поделиться

Это не решение полной проблемы, но у оракула есть хорошая подробная документация относительно того, как использовать этот keytool. Это объясняет как

  1. использование keytool.
  2. генерируют подписанные сертификаты сертификатов/самих с помощью keytool.
  3. импорт генерировал сертификаты клиентам Java.

https://docs.oracle.com/cd/E54932_01/doc.705/e54936/cssg_create_ssl_cert.htm#CSVSG178

0
ответ дан 23 November 2019 в 05:12
поделиться

Если «они» используют самозаверяющий сертификат, они должны предпринять шаги, необходимые для того, чтобы их сервер можно было использовать. В частности, это означает предоставление вам сертификата надежным способом в автономном режиме. Так что заставьте их это сделать. Затем вы импортируете это в свое хранилище доверенных сертификатов с помощью инструментария ключей, как описано в Справочном руководстве JSSE. Даже не думайте о небезопасном TrustManager, размещенном здесь.

РЕДАКТИРОВАТЬ В интересах семнадцати (!) Противников и многочисленных комментаторов ниже, которые явно не читали то, что я здесь написал, это не Иеремия против самоподписанных сертификатов. Нет ничего плохого в самоподписанных сертификатах , если они реализованы правильно. Но правильный способ их реализации - это безопасная доставка сертификата через автономный процесс , а не через неаутентифицированный канал, который они собираются использовать для аутентификации. Неужто это очевидно? Это, безусловно, очевидно для каждой организации, заботящейся о безопасности, в которой я когда-либо работал, от банков с тысячами отделений до моих собственных компаний. Клиентское «решение» на основе кода доверять всем сертификатам, включая самозаверяющие сертификаты, подписанные абсолютно кем угодно или любым произвольным органом, устанавливающим себя в качестве CA, - это ipso facto ] не является безопасным. Это просто игра в безопасность. Бессмысленно. Вы ведете конфиденциальный, защищенный от взлома, защищенный от ответа, защищенный от инъекций разговор с ... кем-то. Кто угодно. Мужчина посередине. Подражатель. Кто угодно. Вы также можете просто использовать открытый текст.

0
ответ дан 23 November 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: