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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ssl tomcat 
V
    Опции темы
olegrolik
Дата 15.10.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexandr87 @ 14.10.2007,  07:46)
написал небольшой фак.
http://forum.vingrad.ru/faq/topic-177048/a...y1286681/0.html

будут вопросы - задавай

Отличный фак. Есть один вопрос по настройке клиента не через браузер. Т.е. я хочу программно устанавливать связь со своим сервлетом, используя апачевский HTTP-client. 
Например, используя клиентский сертификат, приконнектится к сервлету?
В какую сторону копать (т.е. какие api использовать) ?
PM MAIL   Вверх
Alexandr87
Дата 15.10.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата

Отличный фак. Есть один вопрос по настройке клиента не через браузер. Т.е. я хочу программно устанавливать связь со своим сервлетом, используя апачевский HTTP-client. 
Например, используя клиентский сертификат, приконнектится к сервлету?
В какую сторону копать (т.е. какие api использовать) ?



попробуй посмотреть здесь 
http://jakarta.apache.org/httpcomponents/h...x/sslguide.html
и здесь
http://svn.apache.org/viewvc/jakarta/httpc...ava?view=markup

Это сообщение отредактировал(а) Alexandr87 - 15.10.2007, 14:20
PM Jabber   Вверх
olegrolik
Дата 15.10.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

Protocol authhttps = new Protocol("https",  
           new AuthSSLProtocolSocketFactory(
               new URL("file:my.keystore"), "mypassword",
               new URL("file:my.truststore"), "mypassword"), 443); 
               Protocol.registerProtocol("https", authhttps);


С my.truststore всё понятно - работает.
А вот с my.keystore - проблема.
Я так понимаю, что в my.keystore должен храниться пользовательский сертификат + приватный ключ пользователя.
Создаю my.keystore вот так: 
Код

keytool -import -keystore my.keystore -file clientCert.pfx

Но при выполнении кода, вылетает ошибка:


Код

Exception in thread "main" java.security.KeyStoreException: No private keys found in keystore!
        at org.apache.commons.ssl.KeyStoreBuilder.validate(KeyStoreBuilder.java:245)
        at org.apache.commons.ssl.KeyStoreBuilder.build(KeyStoreBuilder.java:112)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:125)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:117)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:62)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:105)
        at org.apache.commons.httpclient.contrib.ssl.AuthSSLProtocolSocketFactory.<init>(AuthSSLProtocolSocketFactory.java:185)
        at PostXML.main(PostXML.java:64)
Java Result: 1



Есть предложения ?
PM MAIL   Вверх
Alexandr87
Дата 16.10.2007, 03:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Есть - набрать в гугле p12 to jks
PM Jabber   Вверх
olegrolik
Дата 16.10.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexandr87 @ 16.10.2007,  03:54)
Есть - набрать в гугле p12 to jks

А почему бы вместо my.keystore не использовать .truststore ? Это ведь одно и тоже.
Но при использовании выдаёт ту же ошибку : Exception in thread "main" java.security.KeyStoreException: No private keys found in keystore!
PM MAIL   Вверх
Alexandr87
Дата 16.10.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(olegrolik @  16.10.2007,  13:47 Найти цитируемый пост)
А почему бы вместо my.keystore не использовать .truststore ? Это ведь одно и тоже.

Truststore - это хранилище доверенных сертификатов - сертификатов различных центров эмисси сертификатов (т.е. только сертификаты - без ключей), которым вы доверяете Т.е. сертификаты подписанные соответствующим данному сертификату секретным ключом - будут считаться валидными.
В mykeystore - хранятся личный прайвит ключ и сертификат. Собственно поэтому.
Я бы, все-таки, реккомендовал ознакомиться с концепцией PKI.

А, что с гуглем?
PM Jabber   Вверх
olegrolik
Дата 16.10.2007, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я запутался.
Последовательность такая (если нет, то поправьте, пожалуйста): у меня есть сертификат clientCert.pfx. Мне надо его перевести из формата pkcs12 в формат jks, т.е. получить clientCert.crt
Затем, добавить этот сертификат в хранилище my.keystore. 

Теперь о самом переводе из одного формата в другой: нашёл вот что:

keytool -export -keystore test3_fromie.pfx -storetype PKCS12 -alias adcc1680792a -file exp2

Но какой alias у моего пользовательского сертификата?


 smile 
Может у кого-то есть готовый скрипт? Поделитесь, пожалуйста.  smile 
PM MAIL   Вверх
Alexandr87
Дата 16.10.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(olegrolik @  16.10.2007,  14:53 Найти цитируемый пост)
Может у кого-то есть готовый скрипт? 

тут вроде одной командой можно
keytool -importkeystore -srcstoretype pkcs12 -srckeystore client.p12 -destkeystore .mystore


Цитата(olegrolik @  16.10.2007,  14:53 Найти цитируемый пост)
Последовательность такая (если нет, то поправьте, пожалуйста): у меня есть сертификат clientCert.pfx. Мне надо его перевести из формата pkcs12 в формат jks, т.е. получить clientCert.crt
Затем, добавить этот сертификат в хранилище my.keystore. 

Собственно да, у вас есть сертификат и ключ в формате pkcs#12, вам нужно перевести их в JKS - формат хранилища сертификатов и ключей, ипользуемый в большинстве Java приложений. crt - тут вообще не при чем. Ну и добавлять соотвественно никуда ничего не нужно, вы просто конвертируете из одного формата в другой.

PM Jabber   Вверх
olegrolik
Дата 16.10.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Alexandr87, я делал вот так:

keytool -importkeystore -srcstoretype pkcs12 -srckeystore clientCert.pfx -destkeystore .mystore

Получил .mystore

Код

Protocol authhttps = new Protocol("https",  
           new AuthSSLProtocolSocketFactory(
               new URL("file:.mystore"), "mypassword",
               new URL("file:my.truststore"), "mypassword"), 443); 

Та же ошибка: No private keys found in keystore!
 smile 
Можно конечно забить на создание клиента и использовать браузер, но этот вариант меня не устраивает :(

Это сообщение отредактировал(а) olegrolik - 16.10.2007, 15:17
PM MAIL   Вверх
Alexandr87
Дата 16.10.2007, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Тока что попробовал, у мну все заработало smile

Вот шаги, которые я сделал после того, как заканчивается фак.
1. Конвертируем p12 криптоконтейнер в формат JKS
Цитата

keytool -importkeystore -srcstoretype pkcs12 -srckeystore clientCert.pfx -destkeystore .mystore
Enter destination keystore password:  
Keystore password is too short - must be at least 6 characters
Enter destination keystore password:  
Re-enter new password: 
Enter source keystore password:  
Entry for alias 1 successfully imported.
Import command completed:  1 entries successfully imported, 0 entries failed or cancelled

При этом, очень важно, чтобы для доступа к JKS контейнеру исполозовался точно такой же пароль, который использовался для p12 контейнера.(Потому, как в комментариях к конструктору класса org.apache.commons.httpclient.contrib.ssl.AuthSSLProtocolSocketFactory явно указывается, что пароль на private ключ и на весь контейнер должен быть одним и тем же. Если мы укажем другой пароль для JKS контейнера, то на сам контейнер пароль сменится, а доступ к Private ключу должен будет осуществлятся по старому паролю). Это мне кажется наиболее веротяной причиной, почему у вас на данный момент выдает ошибку No private keys found in keystore!

2. Подготовил непосредственно код, который будет использовать http-client (при этом добавил следующие классы из  org.apache.commons.httpclient.contrib.ssl :AuthSSLInitializationError, AuthSSLProtocolSocketFactory, AuthSSLX509TrustManager. Может еще какие нужны, но у меня заработало и на этом).
Код

    public static void main(String[] args)
    throws Exception {
        
        
        
        String trustoreUrl = "file:///home/alexandr/art/.truststore";
        String privstoreUrl = "file:///home/alexandr/art/.mystore";
        
        ProtocolSocketFactory socketFactory = new AuthSSLProtocolSocketFactory(
                new URL(privstoreUrl), "123456", new URL(trustoreUrl), "123456");
        
        Protocol.registerProtocol("https",
                new Protocol("https", socketFactory, 443));
        

        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod("https://localhost:8443/");
        try {
            
            httpclient.executeMethod(httpget);
            System.out.println(httpget.getStatusLine());
        } finally {
            httpget.releaseConnection();
        }
    }


Получил :
Цитата


16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:  Server certificate 1:
16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:   Subject DN: CN=Tomcat Serv, OU=tech, O=avHome, ST=Kazakhstan, C=KZ
16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:   Signature Algorithm: SHA1withRSA
16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:   Valid from: Sun Oct 14 00:50:43 ALMT 2007
16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:   Valid until: Tue Nov 13 00:50:43 ALMT 2007
16.10.2007 21:33:26 org.apache.commons.httpclient.contrib.ssl.AuthSSLX509TrustManager checkServerTrusted
INFO:   Issuer: CN=ca, OU=tech, O=avHome, ST=Kazakhstan, C=KZ
HTTP/1.1 200 OK


Это сообщение отредактировал(а) Alexandr87 - 16.10.2007, 18:15
PM Jabber   Вверх
olegrolik
Дата 17.10.2007, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сделал всё заново. Ошибка таже
Цитата(Alexandr87 @  16.10.2007,  18:14)

добавил следующие классы из  org.apache.commons.httpclient.contrib.ssl :AuthSSLInitializationError, AuthSSLProtocolSocketFactory, AuthSSLX509TrustManager.

Не мог бы ты выложить jar с этими классами? Может в них дело.

А вообще почему .keystore должен быть именно в формате jks?

Вот ещё:

java -cp not-yet-commons-ssl-0.3.8.jar org.apache.commons.ssl.KeyStoreBuilder mypass c:/clientCert.pfx

получил файл client.jks

Использую его вместо .mystore
Эффект тот же.


Это сообщение отредактировал(а) olegrolik - 17.10.2007, 11:02
PM MAIL   Вверх
Alexandr87
Дата 17.10.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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




Вот тут сертификаты, с которыми у меня все работает. Пароли от всех контейнеров 123456
http://avarlamov.net/files/art.tar.gz
для сервера .truststore, tomcatCert.pfx
для клиента .trussttore, .mystore
Не забудьте заменить соответствующие файлы на сервере.

Здесь три апачевских класса, но уверен, что проблемма не в них.
http://avarlamov.net/files/apache-contrib.tar.gz

Если ничего не поможет, выложите не просто наименование ошибки, а полный стэк-трейс.
PM Jabber   Вверх
olegrolik
Дата 17.10.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всё это очень странно. Я делаю следующее: Взял файлы .trustore и .mystore из архива твоего. Сервер даже не настраивал.
Код программы: 
Код

package client;

import java.net.URL;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.contrib.ssl.AuthSSLProtocolSocketFactory;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;

public class Client {
    
  
    public Client() {
    }    

    public static void main(String[] args)
    throws Exception {
        
        
        
        String trustoreUrl = "file:///c:/.truststore";
        String privstoreUrl = "file:///c:/.mystore";
        
        ProtocolSocketFactory socketFactory = new AuthSSLProtocolSocketFactory(
                new URL(privstoreUrl), "123456", new URL(trustoreUrl), "123456");
        
        Protocol.registerProtocol("https",
                new Protocol("https", socketFactory, 443));
        

        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod("https://localhost:8443/");
        try {
            
            httpclient.executeMethod(httpget);
            System.out.println(httpget.getStatusLine());
        } finally {
            httpget.releaseConnection();
        }
    }
    
}



Т.е. код вообще такой-же, как у тебя. Используемая библиотека для ssl - not-yet-commons-ssl-0.3.8.jar

Ошибка:
Код

Exception in thread "main" java.security.KeyStoreException: No private keys found in keystore!
        at org.apache.commons.ssl.KeyStoreBuilder.validate(KeyStoreBuilder.java:245)
        at org.apache.commons.ssl.KeyStoreBuilder.build(KeyStoreBuilder.java:112)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:125)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:117)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:62)
        at org.apache.commons.ssl.KeyMaterial.<init>(KeyMaterial.java:105)
        at org.apache.commons.httpclient.contrib.ssl.AuthSSLProtocolSocketFactory.<init>(AuthSSLProtocolSocketFactory.java:197)
        at client.Client.main(Client.java:24)
Java Result: 1


Спасибо за помощь! smile 
PM MAIL   Вверх
Alexandr87
Дата 18.10.2007, 05:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

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



Цитата(olegrolik @  17.10.2007,  23:10 Найти цитируемый пост)
Используемая библиотека для ssl - not-yet-commons-ssl-0.3.8.jar

хм, а я вообще никакую отдельную библиотеку не использую.
У меня в CLASSPATH только commons-codec-1.3.jar, commons-httpclient-3.1.jar, commons-logging-1.1.jar + jar с тремя файлами из org.apache.commons.httpclient.contrib.ssl и все работает.

Т.е. org.apache.commons.ssl.KeyMaterial у меня вообще нет. Попробуйте убрать эту библиотеку.
PM Jabber   Вверх
olegrolik
Дата 18.10.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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

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


 




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


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

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