2010-05-19 3 views
1

Я создал автономную исполняемую JAR-программу, которая должна отправлять личную информацию по SSL-соединению.
Мне не удалось установить SSL-соединение с использованием сертификатов. Был получаю это:Подключение SSL с использованием автономного приложения Java

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path `building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target` 

Так что я нашел некоторый код где-то, что создает доверие менеджера, который не проверяет цепочки сертификатов:

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

Это сделал трюк, и я был в состоянии установить SSL соединение без какого-либо сертификаты.

Я обеспокоен тем, что данные будут по-прежнему зашифрованы при обмене личной информацией. Это исполняемый файл JAR, который клиенты будут загружать на свои компьютеры.

Значит, действительно ли необходим этот сертификат?

ответ

4

Он по-прежнему зашифрован, но не заслуживает доверия. Лучше всего исправить проблемы проверки сертификатов.

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

Вы должны посмотреть на загрузку сертификата сервера и размещение его в доверительном магазине, который может быть загружен во время выполнения.

См. keytool. Исполняемый файл keytool поставляется вместе с JDK, и вы можете использовать этот инструмент командной строки для создания «хранилища ключей» (в данном случае, известного как «truststore») и импортировать в него сертификат.

Существует множество способов сказать Java использовать хранилище ключей, и ваш выбор зависит от того, какие библиотеки и т. Д. Вы используете для создания SSL-соединения. Один из способов заключается в использовании опции запуска, например:

-Djavax.net.ssl.trustStore = mySrvKeystore -Djavax.net.ssl.trustStorePassword = 123456

Лучше Google для "хранилища ключей Java" плюс медиатеке имя (если вы используете один)

НТН

+0

Спасибо за ваш отзыв, очень полезно. Так как этот JAR будет загружен/установлен на клиентские компьютеры, я предполагаю, что есть способ загрузить сертификат и получить его в хранилище ключей. , поэтому сертификат необходимо загрузить и сохранить на компьютере клиента? Для этого мне нужно использовать собственный код для выполнения этой команды keytool на компьютере клиентов? – Marquinio

+0

Нет, вам просто нужно выполнить keytool один раз на своем собственном компьютере, а затем доставить хранилище ключей (обычно файл ..jks) вместе с вашим приложением. Я уверен, что вы можете привязать хранилище ключей к файлу jar и ссылаться на него через путь к классам ... Извините, что реализация клиента ssl Java не так-то просто понять и требует некоторого чтения и выполнения с ним нормально ... – laher

+0

Большое вам спасибо. Теперь у меня есть четкое представление о том, что я должен делать. – Marquinio

2

с таким доверительным управляющим (или с анонимными шифрами), соединение по-прежнему будет зашифровано (при условии, что вы не позволяя шифры, которые используют нулевой шифр, который никогда не должен быть включен по умолчанию).

Однако клиент не будет знать, с какой организацией он обменивается секретной информацией: это может быть злоумышленник Man-In-The-Middle.

Шифрование недостаточно: вам нужно знать, с кем вы разговариваете.Клиент должен убедиться, что:

  • он доверяет сертификату сервера, чтобы быть подлинными (это назначение доверительного управляющего, но это не конкретная реализация, так как он никогда ничего не отвергает),
  • этот сертификат действителен для имя хоста, с которым клиент должен связаться.
Смежные вопросы