Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (28)


Как сделать SSL-соединение использую сокеты

Поиск:
Здравствуйте.

Вот захотелось написать Как сделать SSL соединение на Java с использованием сокетов.

Процесс создания соединения через SSL включает несколько этапов:
  • создание объекта для хранилища ключей;
  • создание менежеров ключей и доверий;
  • создание контекста SSL;
  • создание сокетов (серверного и клиентского).
В приложении описано как создать ключи и хранилище ключей.

1. Создание объекта для хранилища ключей.
Код
   //параметры для загрузки хранилища ключей
   String KSType="JKS", KSProvider="SUN", KSFileName="keystore.ks", KSPassword="keystorepassword";

   KeyStore ks=KeyStore.getInstance(KSType,KSProvider);
   ks.load(new BufferedInputStream(new FileInputStream(KSFileName)), KSPassword.toCharArray());

Итак, для привязки к какому-либо хранилищу ключей используются объекты класса KeyStore. Получить объект этого класса можно с помощью одного из трех статических методов getInstance(...). Первый параметр - строка - тип хранилища ключей. Второй параметр - либо объект класса Provider, либо строка - провайдер для указанного типа хранилища данных. После этого требуется загрузить хранилище данных, для этого используется метод load(...). Первый параметр - входной поток типа InputStream откуда производится загрузка (в нашем случае хранилище ключей - это файл), второй - пароль хранилища ключей.

2. Создание менежеров ключей и доверий.
Код
   //параметры для создания менеджеров
   String KeyPassword="keypassword", KMFAlgorithm="SunX509", KMFProvider="SunJSSE", TMFAlgorithm="SunX509", TMFProvider="SunJSSE";

   KeyManagerFactory kmf=KeyManagerFactory.getInstance(KMFAlgorithm,KMFProvider);
   kmf.init(ks,KeyPassword.toCharArray());
   TrustManagerFactory tmf=TrustManagerFactory.getInstance(TMFAlgorithm,TMFProvider);
   tmf.init(ks);

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

3. Создание контекста SSL.
Код
   //параметры для создания контекста
   String SSLCProtocol="TLSv1", String SSLCProvider="SunJSSE";

   SSLContext sslc=SSLContext.getInstance(SSLCProtocol,SSLCProvider);
   sslc.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null);

Как и менеджеры объект контекста SSL требует создания и последующей инициализации. При создании указываются протокол передачи данных и провайдер для указанного протокола. При инициализации указываются два массива: один для ключей, второй для доверий.

4. Создание сокетов (серверного и клиентского).
Теперь мы можем создать серверный и клиентский сокеты, которые можно будет использовать как обычные серверный и клиентский сокеты.
Создание серверного сокета:
Код
   //параметры для создания серверного сокета (всего один - порт, который будем слушать)
   int port=4911;
   try {
       SSLServerSocketFactory ssf=sslc.getServerSocketFactory();
       SSLServerSocket ss=(SSLServerSocket)ssf.createServerSocket(serverport);
       ss.setNeedClientAuth(true);//требуем аутентификацию подключающихся клиентов
   }catch(Exception e){
       e.printStackTrace();
   }

Создание клиентского соката:
Код
   //параметры для создания клиентского сокета
   String host="localhost";
   int port=4911;
   try {
       SSLSocketFactory sf=sslc.getSocketFactory();
       SSLSocket s=(SSLSocket)sf.createSocket(host,port);
       s.setWantClientAuth(true);//клиент хочет пройти процедуру аутентификации
   }catch(Exception e){
       e.printStackTrace();
   }


Все. Теперь приложение:
Работа с ключами производится с помощью утилиты keytool, входящей в состав SDK.
Обычно выполняется три шага:
  • генерирование ключа;
  • экспорт ключа в сертификат;
  • импорт ключа из сертификата в хранилище ключей для клиента.
Генерирование ключа.
Код
keytool -genkey -alias [1] -keyalg [2] -keysize [3] -validity [4] -keypass [5] -keystore [6] -storepass [7]

1 - алиас для ключа,
2 - алгоритм шифрования (типа rsa),
3 - размер ключа (от 512 до 2048),
4 - количество дней, пока ключ действителен,
5 - пароль ключа,
6 - имя файла - хранилища ключей,
7 - пароль хранилища.

Экспорт ключа в сертификат.
Код
keytool -export -alias [1] -file [2] -keystore [3] -storepass [4]

1 - алиас экспортируемого ключа,
2 - файл сертификата (*.cer),
3 - файл хранилища ключей,
4 - пароль хранилища ключей.

Импорт ключа из сертификата в хранилище ключей для клиента.
Код
keytool -import -alias [1] -file [2] -keypass [3] -keystore [4] -storepass [5]

1 - алиас под которым будет храниться импортируемый ключ,
2 - файл сертификата (*.cer),
3 - пароль ключа,
4 - файл хранилища ключей,
5 - пароль хранилища ключей.

//----------------------------------------------------------------------
P.S.: Ногами больно не пинайте. Писать я толком не умею. Может что-то объяснить сильнее надо было, напишите, подправлю.
Всем спасибо за внимание.
Автор: Slavca
Сайт: http://






Просмотров: 3293

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную