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

Поиск:

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


Штурман
****


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

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



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

    Вот захотелось написать Как сделать 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 MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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