- PVSM.RU - https://www.pvsm.ru -
Эта статья задумывалась как практическое руководство по установке и настройке сервера JASIG CAS. Я не ставил себе целью объяснить, что такое Single Sign On (SSO), поэтому если вы еще не знакомы с этим понятием, то сначала загляните на википедию [1] и портал Techtarget [2]. Желательно, также иметь опыт работы со Spring и Maven.
Статья будет состоять из 3-х частей. В начале я коротко расскажу, почему мы остановили свой выбор на CAS и об особенностях его протокола. Остальная статья будет посвящена настройке сервиса авторизации, начиная с конфигурации контейнера сервлетов и заканчивая решением некоторых нетривиальных вопросов, таких как авторизация с внешней формы и хэширование учетных данных.
Существует много реализаций [3] идеи единой авторизации, и я не могу сказать, что JASIG CAS во всем лучше своих аналогов, тем не менее, по ряду причин, мы остановились на нем.
Если вы выбираете платформу для SSO по тем же критериям, то CAS, именно то, что вы ищете.
Мы взяли за основу нашего SSO сервиса, CAS, работающий по протоколу второй версии. Подробно об этом протоколе можно прочитать на портале JASIG [6]. Чуть ниже приведена схема процесса, удачной авторизации в CAS. Подобной схемы на портале JASIG я не нашел, хотя, мне кажется, она должна оказаться полезной для понимания процесса.
Обратите внимание, что все запросы к SSO серверу должны быть по HTTPS. Это не требование протокола, однако, без этого невозможно обеспечить безопасность учетных данных пользователя.
Еще одной важной особенностью протокола является то, что во время проверки значений ST + TGT, CAS клиент, установленный в авторизуемом сервисе, останавливает исходный запрос и создает новый. Т.е. в этот момент клиентом для CAS сервера является не браузер пользователя, а авторизуемый сервис. Это значит, что для создания HTTPS соединения сервис должен быть правильно настроен. Как это сделать я напишу чуть позже. Обработка исходного запроса возобновиться только после завершения проверочного.
В качестве контейнера сервлетов мы выбрали Tomcat. Информация о пользователях храниться в openLDAP, а в качестве CAS клиента для приложений чаще всего используем официальный java клиент. На момент написания статьи последняя версия была 3.1 [8].
Настройка SSO начинается с конфигурации контейнеров сервлетов. В тестовой и боевой средах, мы делаем это немного по-разному.
В тестовом окружении с помощью утилиты keytool [9] нужно создать самоподписанный сертификат. Keytool — это стандартная утилита, которая входит в состав любого JDK.
keytool -genkey -alias cas -keypass 12345678 -keystore ssoServer.jks -storepass 12345678 -dname «cn=localhost, ou=webdev, o=ourOrganisation, c=RU» -validity=365
В результате у нас будет создан keystore ssoServer.jks и пара ключей, приватный и публичный. Теперь из keystore можно экспортировать публичный ключ
keytool -export -alias cas -file casServerPublic.cer -keystore ssoServer.jks -storepass 12345678
и, импортировать его в хранилища доверенных сертификатов, для всех сервисов, которые будут участвовать в единой авторизации. На PC команда выглядит вот так:
keytool -import -alias cas -file %PATH_TO%casServerPublic.cer -keypass 12345678 -keystore JAVA_HOME/jre/lib/security/cacerts cacerts -storepass changeit
На Маке так:
# /Library/Java/Home/bin/keytool -import -alias cas -file %PATH_TO_CERTIFICATE%/casServerPublic.cer -keypass 12345678 -keystore /Library/Java/Home/lib/security/cacerts -storepass changeit
Импорт ключей нужен для того, что бы авторизуемый сервис мог установить HTTPS соединение с CAS. Перед тем как импортировать ключи убедитесь, что
В результате вы должны увидеть сообщение:
Certificate was added to keystore.
Если сообщение выглядит не так или за ним следует какой-либо текст, это значит, что вы сделали что-то не так, и ключ, скорее всего, не был импортирован.
В боевой среде вы, скорее всего, будете использовать ключи, предоставленные одним, из широко известных CA, таким как Thawte [10] или Verisign [11]. В этом случае ключи будут в формате pkcs#7 или x.509 и вам нужно будет предварительно конвертировать их в формат pkcs#12.
Например, для сертификатов в формате X.509 (Base64) нужно выполнить следующую последовательность шагов:
openssl pkcs12 -export —in your.crt —inkey your.key —out your.p12 -name «cas»
keytool —keystore your.p12 -storetype pkcs12 —list
keytool -importkeystore -deststorepass 12345678 -destkeypass 12345678 -destkeystore ssoServer.jks -srckeystore your.p12 -srcstoretype PKCS12 -srcstorepass 12345678 -alias cas
Хранилище публичных сертификатов по умолчанию имеет пароль changeit. В боевой среде его нужно поменять.
Осталось настроить коннектор на tomcat, на котором будет расположен CAS. Для этого в файл %TOMCAT-HOME%/conf/server.xml добавляем описание коннектора, например так:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keyAlias="cas" keystoreFile="%PATH_TO%.ssoServer.jks" keystorePass="12345678" />
Подробнее о настройке коннекторов можно прочитать на странице документации [12].
В боевой среде HTTP коннектор из server.xml лучше удалить о греха по дальше).
На этот раз все. В следующей части я расскажу как настроить и собрать CAS сервер.
Автор: SergeyPopov
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/avtorizatsiya/5904
Ссылки в тексте:
[1] википедию: http://en.wikipedia.org/wiki/Single_sign-on
[2] Techtarget: http://searchsecurity.techtarget.com/definition/single-sign-on
[3] много реализаций: http://en.wikipedia.org/wiki/List_of_single_sign-on_implementations
[4] портал JASIG: http://www.jasig.org/cas/public-api
[5] вики: https://wiki.jasig.org/
[6] на портале JASIG: http://www.jasig.org/cas/protocol
[7] сайте сообщества : http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=security
[8] последняя версия была 3.1: https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1
[9] keytool: http://docs.oracle.com/javase/1.3/docs/tooldocs/win32/keytool.html
[10] Thawte: http://www.thawte.com/
[11] Verisign: http://www.verisign.com/
[12] на странице документации: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html
Нажмите здесь для печати.