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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tomcat и SSL client authentification 
:(
    Опции темы
Alexandr87
Дата 14.10.2007, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Для работы с SSL нам потребуется центр выдачи сертификатов. В тестовых целях можно воспользоваться openssl.
Итак, подготавливаем необходимые сертификаты.

Небольшой скриптик (в PATH должны быть openssl и keytool)

Цитата

#Генерируем rsa ключики для центра эмиссии сертификатов (ca), для сервера-tomcat (tomcat), для определенного клиента(client)
openssl genrsa -out caPrivKey.pem 1024
openssl genrsa -out tomcatPrivKey.pem 1024
openssl genrsa -out clientPrivKey.pem 1024

#Создаем self-signed сертификат для центра эмиссии
openssl req -new -x509 -key caPrivKey.pem -out caCert.crt

#Создаем запросы на сертификат для сервера и клиента
openssl req -new -key tomcatPrivKey.pem -out tomcatReq.req
openssl req -new -key clientPrivKey.pem -out clientReq.req

#Издаем сертификаты
openssl x509 -req -in tomcatReq.req -CA caCert.crt -CAkey caPrivKey.pem -CAcreateserial -out tomcatCert.pem
openssl x509 -req -in clientReq.req -CA caCert.crt -CAkey caPrivKey.pem -CAcreateserial -out clientCert.pem

#Конвертируем сертификат с ключом в pkcs12 формат
openssl pkcs12 -export -in tomcatCert.pem -inkey tomcatPrivKey.pem -out tomcatCert.pfx
openssl pkcs12 -export -in clientCert.pem -inkey clientPrivKey.pem -out clientCert.pfx

#Сконвертируем также сертификат центра эмиссии в JKS 
keytool -import -keystore .truststore -file caCert.crt



Примерный вывод:
Цитата

Generating RSA private key, 1024 bit long modulus
...............................................++++++
...................++++++
e is 65537 (0x10001)
Generating RSA private key, 1024 bit long modulus
...................++++++
................................++++++
e is 65537 (0x10001)
Generating RSA private key, 1024 bit long modulus
..........................++++++
..........++++++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KZ]:
State or Province Name (full name) [Kazakhstan]:
Locality Name (eg, city) []:
Organization Name (eg, company) [avHome]:
Organizational Unit Name (eg, section) [tech]:
Common Name (eg, YOUR name) []:ca
Email Address []:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KZ]:
State or Province Name (full name) [Kazakhstan]:
Locality Name (eg, city) []:
Organization Name (eg, company) [avHome]:
Organizational Unit Name (eg, section) [tech]:
Common Name (eg, YOUR name) []:Tomcat Serv
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
[Здесь просто жмем enter]
A challenge password []:
An optional company name []:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KZ]:
State or Province Name (full name) [Kazakhstan]:
Locality Name (eg, city) []:
Organization Name (eg, company) [avHome]:
Organizational Unit Name (eg, section) [tech]:
Common Name (eg, YOUR name) []:Vasiylo Pupkin
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
[Здесь просто жмем enter]
A challenge password []:
An optional company name []:
Signature ok
subject=/C=KZ/ST=Kazakhstan/O=avHome/OU=tech/CN=Tomcat Serv
Getting CA Private Key
Signature ok
subject=/C=KZ/ST=Kazakhstan/O=avHome/OU=tech/CN=Vasiylo Pupkin
Getting CA Private Key
[пароль для ключика tomcat]
Enter Export Password:
Verifying - Enter Export Password:
[пароль для ключика клиента]
Enter Export Password:
Verifying - Enter Export Password:
[пароль для хранилища доверенных сертификатов]
Enter keystore password:  123456
Owner: CN=ca, OU=tech, O=avHome, ST=Kazakhstan, C=KZ
Issuer: CN=ca, OU=tech, O=avHome, ST=Kazakhstan, C=KZ
Serial number: e7300e152194dc61
Valid from: Sun Oct 14 00:50:07 ALMT 2007 until: Tue Nov 13 00:50:07 ALMT 2007
Certificate fingerprints:
         MD5:  E9:0E:2C:66:7E:48:44:4D:D9:23:1F:14:5A:0F:5A:6D
         SHA1: 03:63:DD:E0:3C:87:9B:63:54:76:52:E4:46:7D:4C:AF:AC:36:3F:05
Trust this certificate? [no]:  yes
Certificate was added to keystore


Все необходимые сертификаты и ключи подготовлены, приступаем к настройке клиента и сервера.

Настройка клиента заключается в добавлении сертификата центра эмиссии, как доверенного сертификата. И непосредственно пользовательского сертификата с ключом.
Добавление сертификатов рассмотрю на примере Mozilla FireFox, работа с сертификатами в других браузерах не должна сильно отличаться. Итак, Main menu\Edit\Preferences\Advanced\Encryption\View Certificates. Нас интересуют вкладки Authorities (для доверенных сертификатов) и Your Certificates (для вашего сертификата с ключом). 
Собственно переходим на вкладки Authorities, жмем кнопку Import, выбираем наш файл caCert.crt. Появится окно, в котором необходимо указать, что сертификат будет использоваться для идентификации web серверов. Все OK, сертификат должен появиться, среди других доверенных сертификатов.
Теперь добавим пользовательский сертификат. Переходим на вкладку Your Certificates, import. Если это первый сертификат в вашем хранилище, вас попросят ввести пароль для доступа к хранилищу личных сертификатов, если не первый, то, соответственно спросят этот пароль. Далее попросят ввести пароль, на котором зашифрован ключик, который мы импортируем, вводим. Далее должно последовать появление сообщения об успешном добавлении сертификата, и сертификат должен появиться в списке.

Настройка сервера tomcat заключается в добавлении SSL коннектора, его настройки, добавление хранилища доверенных сертификатов, и добавления хранилища сертификата с ключом сервера.
Создаем папку $CATALINA_HOME/ssl, в которую копируем наши файлы tomcatCert.pfx и .truststore. 
Правим конфигурационный файл conf/server.xml:
Раскоменчиваем SSL коннектор добавляем туда параметры для указания хранилищ сертификатов, должно получиться что-то вроде этого.

Код

    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS" 
               keystoreFile="ssl/tomcatCert.pfx" keystorePass="123456" keystoreType="pkcs12"
               truststoreFile="ssl/.truststore" truststorePass="123456" truststoreType="JKS"  />

Следуем обратить внимание на последние две строки и на clientAuth="true".

Запускаем сервер. Пробуем подключиться на 8443 порт. https://servername:8443. Если спросит сертификат, значит, все идет нормально, выбираем наш сертификат и мы на нужной странице.


Теперь займемся серверными приложениями.
Создаем простой сервлет, в обработчик добавляем следующий код
Код

        out.println("<b> Attribute names</b><br>");
        Enumeration attrs = request.getAttributeNames();
        while (attrs.hasMoreElements()) {
            out.println((String)attrs.nextElement() + "<br>");
        }
        
        out.println("<b>Certificate:</b>");
        X509Certificate cert[];
        cert = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
        out.println(cert);
        out.println(cert[0]);


В итоге, у нас есть объект типа java.security.cert.X509Certificate, представляющий пользовательский сертификат. Кроме атрибута javax.servlet.request.X509Certificate, сервер добавляет еще несколько, можно глянуть их, может пригодятся.
Собственно все.

Это сообщение отредактировал(а) Alexandr87 - 14.10.2007, 07:45
PM Jabber   Вверх
Stampede
Дата 16.10.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

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



Товарищи модеры, а ведь отличная статья. Прямо так и просится в ФАК. Или уже там?

ЗЫ. Увы, ФАК на Вмнграде не так чтобы очень внятный в смысле навигации, но я надеюсь, это вопрос решаемый.

Просто не совсем понятно, вроде товарищ отметился, а оргвыводов не видно. А ведь тема действительно животрепещущая.

Alexandr87, от меня - большое человеческое спасибо за раскрытие темы, ну а насчет наград - это пусть модераторы решают.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Alexandr87
Дата 16.10.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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


Опытный
**


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

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



Есть одно добавление: при создании сертификатов надо вводить разные имена (как указано в этом факе). Иначе, будет вылетать эксепшн: что-то вроде "recv failed".
PM MAIL   Вверх
olegrolik
Дата 1.7.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexandr87 @ 14.10.2007,  07:42)

Код

    <Connector port="8443" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS" 
               keystoreFile="ssl/tomcatCert.pfx" keystorePass="123456" keystoreType="pkcs12"
               truststoreFile="ssl/.truststore" truststorePass="123456" truststoreType="JKS"  />

В томкате 6.0 это не работает. Надо попробовать вот так: 
Код

<Connector port="8443" 
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="true" disableUploadTimeout="true"
               acceptCount="100" scheme="https" secure="true"
        SSLEnabled="true"    
               clientAuth="true" sslProtocol="SSL" 
               keystoreFile="ssl/tomcatCert.pfx" keystorePass="123456" keystoreType="PKCS12"
               truststoreFile="ssl/.truststore" truststorePass="123456" truststoreType="JKS" />

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.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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