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


Автор: AntonSaburov 3.3.2005, 12:39
Здравствуйте.

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

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