Десятая статья серии посвященной технологии JavaEE. Продолжая работать над безопасностью нашего приложения, мы дошли до момента когда необходимо защитить некоторые данные циркулирующие между клиентом и сервером. Для этих целей широко применяются защищенные соединения. Для установления соединенного соединения используется два протокола: SSL или более новый TLS.
SSL и TLS это криптографические протоколы обеспечивающие установление безопасного/зашифрованного соединения между клиентом и сервером. Для передачи сообщений используется асимметричные алгоритмы с открытым ключом.
В этой статье мы максимально симулируем "боевую" ситуацию. Сгенерируем новую пару ключей, подпишем наш сертификат с использование специализированных сервисов (напр. COMODO), внедрим новые сертификаты в наш сервер и запустим его с использование защищенного соединения. Думаю читатель в курсе что при установке шифрованного соединения, в браузере используется протокол https, о чем сообщается в адресной строке браузера (в разных браузерах это выглядит по разному).
Глядя на наше приложение, явно бросается глаза необходимость защиты приватной зоны, именно к ней мы и настроем в конце статьи защищенное соединение.
1
Для реализации примера, Вам может понадобиться снимок прошлого урока, забрать можно отсюда.
Создание SSL сертификата. Использование приложения keytool.
Решение данной задачи имеет следующие этапы:
- Генерация приватных ключей.
- Создание файла запроса сертификации (.csr)
- Отсылка файла в сервис сертификации.
- Получение и импорт подписанного сертификата.
- Настройка сервера.
Первую, вторую и четвертую задачу мы будем решать с помощью утилиты от Oracle keytool. Если Вы работаете из под linux систем то она уже наверняка имеется на Вашем компе. Windows пользователи могут найти ее в папке bin по адресу вашего jre (напр. C:\Program Files\java\jre1.7\bin\keytool.exe).
В данной статье будет описываться использование утилиты под Ubuntu 12.04.
- Перейдите в папку конфигурации домена Glassfish (~/glassfish/domains/domain1/conf/).
- Здесь находится файл-хранилище ключей/сертификатов. По умолчанию его название keystore.jks. На данный момент в нем гарантированно имеется два сертификата. Что бы в этом убедиться выполним команду
sudo keytool -list -v -keystore keystore.jks
При выполнение команды у Вас попросят ввести keystore пароль. Если его нет то будет предложено его создать. Если пароль уже есть но Вы не знаете его, то вероятно это changeit.
- Результат выполнения будет примерно следующим:
...
Alias name: s1as
Creation date: 14.02.2012
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=localhost, OU=GlassFish, O=Oracle Corporation, L=Santa Clara, ST=California, C=US
Issuer: CN=localhost, OU=GlassFish, O=Oracle Corporation, L=Santa Clara, ST=California, C=US
Serial number: 4f23cc0b
Valid from: Tue Feb 14 05:50:51 MSK 2012 until: Fri Feb 11 05:50:51 MSK 2022
Certificate fingerprints:
MD5: 21:1F:9B:E2:15:E5:A7:7C:C7:E4:BF:53:D6:8A:62:37
SHA1: 68:31:1B:9D:1D:77:23:62:70:42:86:FB:F3:35:31:51:78:8C:D5:DF
Signature algorithm name: SHA1withRSA
Version: 3
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: E8 97 7D 87 BA 1F 58 0D 6D 3D 62 AD 12 77 78 B6 .....OX.m.b..Vx.
0010: 67 18 52 77 .".
]
]
*******************************************
*******************************************
- В данные момент защищенное соединение использует сертификат с алиасом s1as. Это стандартный сертификат поставляемый с сервером от Oracle.
Нам нужно сгенерировать свой, для этого выполним следующию команду:
keytool -keysize 2048 -genkey -alias 178.208.80.170 -keyalg RSA
-dname "CN=www.onedeveloper.ru,O=Egorov,L=Sankt-Petersburg,S=Sankt-Petersburg,C=Russia"
-keystore keystore.jks
в качестве параметров мы передаем:
- размер ключа;
- алиас нового сертификата (для подписи сертификата у COMODO важно что бы алиас равнялся ip адресу вашего сервера);
- наименование алгоритма - RSA;
- различные параметры идентификации, главным из которого является Ваше доменное имя CN.
Разумеется, для создания Ваших сертификатов, необходимо заменить доменное имя и ip адрес сервера. Так же важно что бы сервер был доступен по 80 порту, т.к. COMODO осуществляет пинг сайта на этот порт.
- Повторите команду просмотра содержимого хранилища и убедитесь что наши новые ключи были успешно сгенерированы.
Мы заверниши первый этап нашей задачи. Теперь необходимо создать файл запрос сертификации командой:
sudo keytool -certreq -alias 178.208.80.170 -keystore keystore.jks -file onedeveloper-2048.csr
Не забудьте поменять алиас. Загляните в вновь созданный файл onedeveloper-2048.csr, его содержание примерно следующее:
-----BEGIN NEW CERTIFICATE REQUEST-----
MIICuzCCAaMCAQAwdjEPMA0GA1UEBhMGUnVzc2lhMRkwFwYDVQQIExBTYW5rdC1QZXRlcnNidXJn
MRkwFwYDVQQHExBTYW5rdC1QZXRlcnNidXJnMQ8wDQYDVQQKEwVBAMTE3d3
dy5vbmVasdfasdfasdf ae ae AQUAA4IBDwAwggEKAoIBAQC+sxxomE5N8923bk234k2341klk5j1kl3
s+fGNUG4TPN0FsGHMR/y3lpoMMwRwT0LYaR2606WdLasiWRxrLfAZTx1Rf3JWDZcKqdr9DpXhWr7
UY0zDZoKCBckd1Ga sdfasd as edsf FDSAEaAEAAGgADANBgkqhkiG9w0BAQUFAAOCAQEAiIGA
KqWcyVxsLM7nsBcYXUB+QtrZkOoL8sjOxJDzfT2/gqnh7HpF5sg4/4QBvwP+91OoKaoh88rSiWUQ
9pkVP4sZmAwQRcjIg1552yRPy7gxalZvew8Ek3FOgwJL/PPUuhZs5uji/XvMittrhcF6kIW4KTKJ
bLiN/6OHdG1gjcA9CsMiX2xMG8mcRDKYODgiCGLYY4xm57P/Swm0JvYF5KvRZz7eJhzgv6V4cv56
60Bl0NTUvpKz3toASVkfTJJqH/G6GlWmTd/fq0XqYQicZAQpEf2vwlbJf+hSp5ON/SJHxT7asjBh
wGrv70wp/czfAhd4BCIhZohthQ==
-----END NEW CERTIFICATE REQUEST-----
Именно этот запрос нам нужно будет отправить в цент сертификации. А перейдем на сайт COMODO и попробуем подписать наш сертификат.
У COMODO Free SSL сертификат можно получить на 90 дней. Прямо так аттракцион невиданной щедрости. Триал сертификаты предоставляют почти все центры сертификации, у каждого свой срок (у thawte 20 дней). При желании с использованием только триал сертификатов от различных центров, можно продержаться целый год не раздаривая по 200-300 $ за подпись сертификата.
На первом шаге от Вас потребуется ввести ваш код запроса и выбрать сервер который Вы используете. Для нас это Java Web Server.
Так же можно убрать галочки со всевозможных подписок.
Перейдите на следующий шаг. На втором шаге необходимо выбрать метод проверки домена. Один из вариантов это письмо по адресу admin@вашдомен.ru, самый быстрый и удобный. Вы можете выбрать и другие.
На дальнейших шагах от Вас попросят некоторые личные данные и данные организации.
Далее, если вы указали в качестве проверки домена - письмо на одних из предоставленных ящиков, то Вам придет на почту код валидации. Его нужно будет ввести в предоставленной ссылке.
В случае успеха, на почтовый ящик который Вы указали в данных о Вас, придет письмо с архивом в котором будет аж 5 сертификатов.
Root CA Certificate - AddTrustExternalCARoot.crt
Intermediate CA Certificate - UTNAddTrustSGCCA.crt
Intermediate CA Certificate - ComodoUTNSGCCA.crt
Intermediate CA Certificate - EssentialSSLCA_2.crt
Your Free SSL Certificate - www_youdomain_ru.crt
Все 5 сертификатов нам нужно будет импортировать в наше хранилище.
Скопируйте все сертификаты в папку конфигурации нашего домена.
При импорте сертификатов важно соблюдать очередь. Для того что бы не ошибиться в ней, можно глянуть FAQ на странице COMODO.
Я его уже глянул и потому быстро проведу Вас по импорту. Последовательно выполните следующие команды:
keytool -import -alias root -keystore keystore.jks -trustcacerts -file AddTrustExternalCARoot.crt
//если будет сказано что уже имеется, то выберите no
keytool -import -alias comodo -keystore keystore.jks -trustcacerts -file ComodoUTNSGCCA.crt
keytool -import -alias essential -keystore keystore.jks -trustcacerts -file EssentialSSLCA_2.crt
keytool -import -alias utn -keystore keystore.jks -trustcacerts -file UTNAddTrustSGCCA.crt
keytool -import -alias 178.208.80.170 -keystore keystore.jks -trustcacerts -file www_youdomain_ru.crt
Готово! Наш новенький, заверенный нотариусом подписанный сертификат импортирован в хранилище и готов предлагать всем свой публичный ключ для установки защищенного соединения.
Настройка сервера Glassfish на использование нового сертификата
После того как наш новый сертификат был успешно импортирован, нам необходимо перейти в консоль администрирования сервера (localhost:4848).
В консоли администрирования пройдите по следующему пути дерева настроек: Configuration->Network Config->Network Listeners.
Здесь представлены имеющиеся слушатели сети. Слушатель admin-listener, как понятно из названия, отвечает за консоль администрирования. Слушатель http-listener-1 отвечает за простой, не шифрованный, поток сети, соответственно http-listener-2 это защищенные поток сети.
Безусловно, Вы можете сами создавать новые слушатели, назначать им порты, потоки и прочие настройки. В данном примере, мы воспользуемся имеющимся слушателем http-listener-2 для установления защищенного соединения на порту 8181. Выберите этот слушатель.
На основной вкладке содержится информация о том включен ли слушатель, осуществляется ли защита соединения, какой порт слушается а так же какой поток используется. Здесь нам лишь нужно убедиться что включена опция Security. Следуйте на вкладку SSL.
Здесь у нас тоже не много работы:
- Включаем SSL3 и TLS протоколы (если отключены).
- В поле Certificate NickName введите алиас созданного нами сертификата (ip адрес).
- В Key Store введите название файла - хранилища сертификатов.
- Нажмите кнопку Save.
В обязательном порядке необходимо перезапустить сервер.
Настройка private зоны сайта на защищенное соединение
Для этого нам нужно добавить все одну строчку!
Откройте наш private-controller сервлет. Замените аннотацию @ServletSecurity на следующею:
@ServletSecurity( @HttpConstraint(rolesAllowed = {"private"},
transportGuarantee = TransportGuarantee.CONFIDENTIAL) )
По сути мы добавили еще одну опцию, говорящию что необходимо использовать защищенный транспортный протокол.
Можете пройти в нашу private зону сайта и убедиться что теперь он использует протокол https.
Пример использования Free SSL протокола от COMODO вы можете просмотреть на этом сайте здесь.
Сегодня мы познакомились с еще одним методом для создания безопасного приложения JavaEE. Были пройдены все этапы, от генерации приватных ключей, до импорта подписанных сертификатов. Мы научились настраивать наш веб-сервер на работу с использованием новых сертификатов, а так же указали в нашем веб приложение область в которой должно использоваться защищенное соединение.
На этом серия статей JavaEE заканчивается. Но не заканчиваются статьи! Я решил вывести в отдельную серию статьи посвященные технологии Java Message Service (JMS). Именно ей и будет посвящена следующая статья.
И еще одна хорошая новость: сервис комментариев и гостевой книги по прежнему работает, можно пользоваться :)
Комментарии
use awesome tool for SSL/CSR/GENKEY/SIGN CERT/etc: portecle-1.9
Прекрасные уроки, спасибо!