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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание двунаправленного https 
:(
    Опции темы
regen
Дата 16.5.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 5.7.2006

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



Добрый день.

Есть Apache веб-сервер с настроенным openssl. Для доступа к определённой странице необходимо предоставить пользовательский сертификат (т.е. авторизуется как сервер так и клиент). 

Теперь проблема: как программно из Java-приложения обратиться к данной странице (при этом корректно предоставив свой сертификат)? Добавлю, что сертификат уже находится в хранилище сертификатов (в хранилище, который используется IE) в машине клиента. 

Если есть пример, то хотелось бы увидеть...


Заранее благодарю за ответы.
PM MAIL   Вверх
ekr
Дата 17.5.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



посмотри сюда, особенно 8 и 9 пункты.
Не получится - пиши, разберемся )

PS ты знаком с терминами keyStore, trustStore, jks ?


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
regen
Дата 17.5.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 5.7.2006

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



ekr, большое спасибо за ответ. 
Но мне надо не совсем то. 
В мануале используется keytool. В моём случае не совсем понимаю как keytool может быть использован. Потому что:
1) клиент имеет файл в формате pkcs#12. Т.е. у него нет отдельно сертификата и ключа. Он с помощью виндовой утилиты экспортирует его в виндовое хранилище сертификатов (то, которое используется IE)
2) Клиент не будет из консоли экспортировать всё в java-хранилище. Для этого у него не хватит мозгов... (Увы...)
3) Мне надо используя https-соединение отправлять запрос на уже готовые php-скрипты. Т.е. сервлеты похоже не помогут.

Теперь попытаю поподробнее объяснить саму задачу:

Мне надо из под клиентской java-программы установить https-соединение (в котором бы авторизовался как клиент, так и сервер. Т.е. необходимо предоставить серверу свой сертификат (который уже находится в виндовом хранилище сертификатов), так и сервер нам должен предоставить свой (что делается в обычном https-соединении в котором клиент не авторизуется). Затем после установлении соединения нам надо на php-скрипт отправить запрос (по протоколу https) и получить ответ от него.

Теперь сформулирую то что мне непонятно:
1) Как заставить java использовать хранилище сертификатов которое использует IE?
2) Как подпихнуть сертификат из этого хранилища для установления https-соединения?
3) Как установить само двунаправленное https-соединение к php-скрипту на сервере?

//--------------------------------
Цитата

PS ты знаком с терминами keyStore, trustStore, jks ?

Вроде что-то знаю....

Keystore — представляет собой базу данных, в которой хранятся пары ключей и сертификаты которые используются при выполнении аутентификации клиента и сервера при SSL соединении. Когда клиент начинает соединение SSL, то он берет ключи и сертификаты из “keystore” для того чтобы предоставить информацию о себе.

Truststore — используется для того чтобы проверить ту информацию которую предлагает другой участник коммуникации, например он предлагает собственный сертификат который подписан некоторым институтом CA, в данном случае из truststore извлекается список доверенных CA и идет поиска того кто подписал данный сертификат, если такового издателя не будет найдено, то тому кто предоставил данный сертификат не будет доверия и соединение не состоится.

jks = "java key storage". Это формат даных хранилища. 


PM MAIL   Вверх
ekr
Дата 17.5.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



Цитата

Вроде что-то знаю...

это гораздо больше, чем многие )

Цитата

1. Как заставить java использовать хранилище сертификатов которое использует IE?

Не знаю...( Это надо к MS-админам обратиться. Я поискал у себя на машине с установленными сертификатами в IE, но поиск не дал результатов... Видно, IE не хранит сертификаты как файлы, а использует что-то вроде jks, какое-нить свое хранилище. Надо у них уточнить.

Цитата

2. Как подпихнуть сертификат из этого хранилища для установления https-соединения?

Это как раз в мануале должно быть (как для jks, так и для pem/der). В свое время пробовал (давно, правда).

Цитата

3. Как установить само двунаправленное https-соединение к php-скрипту на сервере?

Имеешь в виду клиентский код? В мануале есть пример.
Или как настроить Apache? В его файле конфигурации httpd.conf прописываешь настройки ssl-соединений - ssl-порт, сертификаты, etc. 


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
regen
Дата 18.5.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 5.7.2006

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



Просмотрел ещё раз страницу ссылку на которую ты мне скинул...

Цитата

Цитата

2. Как подпихнуть сертификат из этого хранилища для установления https-соединения?

Это как раз в мануале должно быть (как для jks, так и для pem/der). В свое время пробовал (давно, правда).

Ну так вот... Пересмотрел я... Не нашёл... Можешь пример скинуть? Только вот не используя сокеты. Просто HTTP-запросы...

Цитата

Цитата

Как установить само двунаправленное https-соединение к php-скрипту на сервере?

Имеешь в виду клиентский код? В мануале есть пример.

Да. Именно клиентский. Апач уже настроен соответствующим образом.
Пример не нашёл.. Может я не тот мануал смотрю )))? Хотя мне кажется что если решится проблема с "подпихиванием" решится и эта...
PM MAIL   Вверх
ekr
Дата 18.5.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



о как... я-то как раз в свое время сокетного клиента писал.
Цитата

Только вот не используя сокеты. Просто HTTP-запросы...

а как? класс ULR?

в твоем случае надо еще найти, где IE сертификаты хранит.
слушай, в этом случае мало чем смогу помочь ( у меня немного другой опыт был (


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
regen
Дата 18.5.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 5.7.2006

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



Тогда подойду к проблеме с другого бока... Можно ли заставить апач понимать сервлеты? Т.е. написать https-сеанс на сокетах, сделать сервлет, клиента, сервлет закинуть на сервер и работать таким образом?

Или Apache не поддерживает сервлеты? 


Может вопрос глуп... Я просто не совсем разбираюсь в этом. Точнее никак не разбираюсь.. =)
PM MAIL   Вверх
ekr
Дата 19.5.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 12
Всего: 19



Понимаешь, неважно, что у тебя на серверной стороне - servlets или php. 
Загвоздка как раз в клиенте. Если ты напишешь нужный тебе клиент (который подтягивает сертификаты из хранилища IE), то с помощью него ты сможешь работать с любым http-сервером.



--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
regen
Дата 19.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 5.7.2006

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



Во как... Интересно...

Т.е. схема примерно такова:
1) клиент конектится сокетом к 443 порту веб-сервера
2) составляется запрос, который через OutputStream отсылается на 443 порт веб-серверу (на адрес скрипта)
3) клиент слушает InputStream и ловит ответ....

Клиент как я понимаю можно взять такой:
Код

package ssltest;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
/**
 *
 * @author MoonCat
 */
public class SSLClient {
    
    /** Creates a new instance of SSLClient */
    public SSLClient() {
    }
    public static void main(String[] args) {
        try {
            // Получить экземпляр хранилища ключей.
            KeyStore keyStore = KeyStore.getInstance("JKS");
            FileInputStream fis = new FileInputStream("ClientKeyStore");
            keyStore.load(fis, "clientpassword".toCharArray());
            
            // Получить диспетчеры ключей базовой реализации для заданного хранилища ключей.
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
            keyManagerFactory.init(keyStore, "clientkeypassword".toCharArray());
            KeyManager [] keyManagers = keyManagerFactory.getKeyManagers();
            
            // Получить доверенные диспетчеры базовой реализации.
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
            trustManagerFactory.init(keyStore);
            TrustManager [] trustManagers = trustManagerFactory.getTrustManagers();
            
            // Получить защищенное случайное число.
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", "SUN");
            
            // Создание SSL контекста
            SSLContext sslContext = SSLContext.getInstance("SSLv3");
            sslContext.init(keyManagers, trustManagers, secureRandom);
            
            // Создание фабрики SSL сокетов.
            javax.net.ssl.SSLSocketFactory sslSocketFactory =
                    sslContext.getSocketFactory();
            
            // Создаем сокет.
            SSLSocket sslClientSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 443);
       
            /*
              тут происходит посылка/чтение запроса/ответа            
            */

        } catch (KeyManagementException ex) {
            ex.printStackTrace();
        } catch (UnrecoverableKeyException ex) {
            ex.printStackTrace();
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        } catch (NoSuchProviderException ex) {
            ex.printStackTrace();
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (KeyStoreException ex) {
            ex.printStackTrace();
        } catch (CertificateException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


/*********Добавил**********/
PS: Нашёл где Windows хранит сертификаты. 
C:\Documents and Settings\Администратор\Application Data\Microsoft\SystemCertificates\My

Имя файла - отпечаток сертификата. Но открыть их не удаётся.. ВИдимо зашифрованны.. Жаль...

Это сообщение отредактировал(а) regen - 19.5.2007, 15:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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