Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Как сделать SSL-соединение использую сокеты


Автор: Slavca 2.3.2005, 22:31
Здравствуйте.

Вот захотелось написать Как сделать 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.: Ногами больно не пинайте. Писать я толком не умею. Может что-то объяснить сильнее надо было, напишите, подправлю.
Всем спасибо за внимание.

Автор: AntonSaburov 3.3.2005, 12:43
Статья понравилась. Было бы просто супер, если бы был пример реально работающего приложения. Чтобы можно было у себя на машинке запустить и передать строку от клиента к серверу. Но все равно СПАСИБО smile

Автор: Slavca 3.3.2005, 16:39
Пример сделаю. Но как его разместить? У меня сваво сайта нету.

Автор: AntonSaburov 3.3.2005, 17:19
Прямо здесь размещай текст. Я не думаю, что он просто огромен. Или высылай мне.

Автор: Guest 28.3.2005, 16:16
А как быть с Proxy и авторизации в нём?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)