Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать SSL-соединение использую сокеты, маленький howto 
:(
    Опции темы
Slavca
  Дата 2.3.2005, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.2.2005
Где: Новосибирск

Репутация: 3
Всего: 5



Здравствуйте.

Вот захотелось написать Как сделать 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.: Ногами больно не пинайте. Писать я толком не умею. Может что-то объяснить сильнее надо было, напишите, подправлю.
Всем спасибо за внимание.
PM ICQ   Вверх
AntonSaburov
Дата 3.3.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Статья понравилась. Было бы просто супер, если бы был пример реально работающего приложения. Чтобы можно было у себя на машинке запустить и передать строку от клиента к серверу. Но все равно СПАСИБО smile
PM MAIL WWW ICQ   Вверх
Slavca
Дата 3.3.2005, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 17.2.2005
Где: Новосибирск

Репутация: 3
Всего: 5



Пример сделаю. Но как его разместить? У меня сваво сайта нету.
PM ICQ   Вверх
AntonSaburov
Дата 3.3.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Прямо здесь размещай текст. Я не думаю, что он просто огромен. Или высылай мне.
PM MAIL WWW ICQ   Вверх
Guest
Дата 28.3.2005, 16:16 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А как быть с Proxy и авторизации в нём?
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0416 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.