Заметка на память как заставить openfire работать с SSO
Качаем openfire и устанавливаем
wget http://download.igniterealtime.org/openfire/openfire-4.0.2-1.i386.rpm yum install ~/openfire-4.0.2-1.i386.rpm
Ставим mysql
yum install mariadb mariadb-server libldb.i686 krb5-workstation
Добавляем в автозагрузку и запускаем mysql и openfire
systemctl enable mariadb.service systemctl start mariadb.service systemctl enable openfire.service systemctl start openfire.service
Создаем базу данных
mysql > CREATE DАТАBASE openfire; > GRANT ALL on openfire.* to 'openfire'@localhost IDENTIFIED BY 'your password'; > FLUSH PRIVILEGES;
# полезная заметка с http://achlab.ru/ach/2011/08/24/openfire-знаки-вопроса-в-именах-контактов-и-г/
меняем кодировку на utf8
> use openfire; > alter database character set utf8; > alter database collate utf8_general_ci;
Во время установки, когда будете выбирать драйвер MySQL укажите URL к базе вида:
jdbc:mysql://localhost:3306/openfire?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Если openfire уже установлен, то переконвертируйте базу в utf8, затем файле конфигурации openfire.xml допишите после jdbc:mysql://localhost:3306/openfire
?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
Здесь нужно ОБЯЗАТЕЛЬНО! заменить & на & иначе вместо входа в админку увидите страницу установки openfire.
# конец заметки
Открываем в браузере http://my_ip:9090/
my_ip меняем на ip адрес сервера
В процессе указываем использовать mysql базу, LDAP и прочее.
DC="realm",DC="local"
С настройкой openfire почти закончено.
Настраиваем SSO
mv /etc/krb5.conf /etc/krb5.conf.bac vim /etc/krb5.conf
Приводим файл к виду
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = REALM.LOCAL kdc_timesync = 1 forwardable = true proxiable = true default_tkt_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5 default_tgs_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5 permitted_enctypes = rc4-hmac des3-cbc-sha1 des-cbc-crc des-cbc-md5 [realms] REALM.LOCAL = { kdc = realm.local admin_server = realm.local default_domain = REALM.LOCAL } [domain_realm] .realm.local = REALM.LOCAL realm.local = REALM.LOCAL
Создадим gss.conf файл
vim /opt/openfire/conf/gss.conf
com.sun.security.jgss.accept { com.sun.security.auth.module.Krb5LoginModule required storeKey=true keyTab="/opt/openfire/xmpp.keytab" doNotPrompt=true useKeyTab=true realm="REALM.LOCAL" principal="xmpp/openfireserver.realm.local@REALM.LOCAL" isInitiator=false debug=true; };
Создадим xmpp.keytab файл. Для этого заходим на контроллер домена.
Создаем учетку с любым именем, допустим xmpp-openfire, с вечным паролем и включенной опцией «Do not require Kerberos preauthentication» (Без предварительной проверки подлинности Kerberos)
Создаем SPN и связываем ее с учеткой xmpp-openfire
> setspn -A xmpp/openfireserver.realm.local@REALM.LOCAL xmpp-openfire > ktpass -princ xmpp/openfireserver.realm.local@REALM.LOCAL -mapuser xmpp-openfire@realm.local -pass your_password -ptype KRB5_NT_PRINCIPAL
меняем your_password на пароль ранее созданной учетки.
Пришло время создать keytab файл.
> ktpass -princ xmpp/openfireserver.realm.local@REALM.LOCAL -mapuser xmpp-openfire@realm.local -pass your_password -ptype KRB5_NT_PRINCIPAL -out xmpp.keytab
xmpp.keytab будет лежать в C:\Documents and Settings\Administrator
забираем его и переносим на настраиваемый openfire сервер в /opt/openfire/
Путь должен совпадать с тем, что мы указали в gss.conf файле
Выставляем права на ключ.
chown daemon:daemon /opt/openfire/conf/gss.conf chown daemon:daemon /opt/openfire/xmpp.keytab chmod 440 /opt/openfire/xmpp.keytab
Здесь следует обратить внимание, что у вас openfire может работать под пользователем openfire и группой openfire. Тогда выставляем соответствующие права
chown openfire:openfire /opt/openfire/conf/gss.conf chown openfire:openfire /opt/openfire/xmpp.keytab chmod 440 /opt/openfire/xmpp.keytab
Проверим ключ.
kinit -V -k -t /opt/openfire/xmpp.keytab xmpp/openfireserver.realm.local@REALM.LOCAL
ответ должен быть
Authenticated to Kerberos v5
Если все хорошо, то осталось совсем немного. Заходим браузером в консоль администратора Openfire и в разделе System properties и по одному добавляем параметры:
sasl.gssapi.config = /opt/openfire/conf/gss.conf sasl.gssapi.debug = false sasl.gssapi.useSubjectCredsOnly = false sasl.mechs = GSSAPI sasl.realm = REALM.LOCAL xmpp.fqdn = openfireserver.realm.local
Если вам так же нужна авторизация по логину и паролю, то вместо sasl.mechs = GSSAPI пишем sasl.mechs = GSSAPI, PLAIN
Перезапускаем openfire
systemctl restart openfire.service
На пользовательском компьютере правим реестр
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
(For XP: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos)
добавляем параметр типа DWORD
AllowTGTSessionKey со значением 1.
Пеперезапускаем рабочую станцию.
Я использовал Spark, в нем выбираем опцию «Use Single Sign-On (SSO) via GSSAPI»
Собственно все.
Ошибки с которыми мне пришлось столкнуться в основном связаны с ключом и дублированием записей на контроллере домена.
Первая ошибка.
При попытке проверить ключ получал ответ
kinit -V -k -t /opt/openfire/xmpp.keytab xmpp/openfireserver.realm.local@REALM.LOCAL Using default cache: /tmp/krb5cc_0 Using principal: xmpp/openfireserver.realm.local@REALM.LOCAL Using keytab: /opt/openfire/xmpp.keytab kinit: Client 'xmpp/openfireserver.realm.local@REALM.LOCAL' not found in Kerberos database while getting initial credentials
При этом с ключом все в порядке
klist -ek /opt/openfire/xmpp.keytab Keytab name: FILE:/opt/openfire/xmpp.keytab KVNO Principal ---- -------------------------------------------------------------------------- 4 xmpp/openfireserver.realm.local@REALM.LOCAL (arcfour-hmac)
В логах контроллера домена
Существует несколько учетных записей с именем xmpp/openfireserver.realm.local типа DS_SERVICE_PRINCIPAL_NAME.
Здесь следует проверить нет ли дублей. По всей видимости есть еще одна учетка привязанная к xmpp/openfireserver.realm.local
На win2008 можно выполнить
> setspn -x
На win2003 придется искать эту учетку вручную и проверять
> setspn -L xmpp-openfire Registered ServicePrincipalNames for CN=xmpp-openfire,CN=Users,DC=realm,DC=local: xmpp/openfireserver.realm.local xmpp/openfireserver.realm.local@REALM.LOCAL
> setspn -L xmpp-openfire2 Registered ServicePrincipalNames for CN=xmpp-openfire2,CN=Users,DC=realm,DC=local: xmpp/openfireserver.realm.local xmpp/openfireserver.realm.local@REALM.LOCAL
При совпадении достаточно удалить лишнюю привязку
>setspn -D xmpp/openfireserver.realm.local xmpp-openfire2 Unregistering ServicePrincipalNames for CN=xmpp-openfire2,CN=Users,DC=realm,DC=local xmpp/openfireserver.realm.local Updated object
>setspn -D xmpp/openfireserver.realm.local@REALM.LOCAL xmpp-openfire2 Unregistering ServicePrincipalNames for CN=xmpp-openfire2,CN=Users,DC=realm,DC=local xmpp/openfireserver.realm.local@REALM.LOCAL Updated object
Вторая ошибка исходила из первой, а именно из-за имени учетки xmpp-openfire2
kinit -V -k -t /opt/openfire/xmpp.keytab xmpp/openfireserver.realm.local@REALM.LOCAL Using default cache: /tmp/krb5cc_0 Using principal: xmpp/openfireserver.realm.local@REALM.LOCAL Using keytab: /opt/openfire/xmpp.keytab kinit: Unsupported key table format version number while getting initial credentials
В логах контроллера домена
Существует несколько учетных записей с именем xmpp/openfireserver.realm.local@REALM.LOCAL типа DS_USER_PRINCIPAL_NAME.
Дело в имени входа учетки xmpp-openfire2, оно выглядело как xmpp/openfireserver.realm.local, правим его на xmpp-openfire2.
Теперь при попытке проверить ключ я получал долгожданное
Authenticated to Kerberos v5
Спасибо, чувак, я уёся c этой хернёй, и только эта инфа помогла.
Добрый день, сделал все по инструкции, пишет Authenticated to Kerberos v5.
Но при выборе в Spark SSO пишет что Unable to connect using Single Sign-On. Please check your principal and server settings
Почему может быть такая ошибка?
Spark 2.8.3
Openfire 4.2.2
Centos 7
Привет.
Дальше после Authenticated to Kerberos v5 делал? там надо прописать параметры в сам Openfire
все сделал по твоей инструкции но все равно пишется Unable to connect using Single Sign-On. Please check your principal and server settings
поднял на Винде, тоже самое Unable to connect using Single Sign-On. Please check your principal and server settings
Аналогичная фигня с на связке Openfire 4.2.3 на Debian и AD на Windows Server 2008 R2.
Собственно, заметил, что к серверу в принципе не присоединиться при добавлении sasl.mechs = GSSAPI.
Такие дела.
Реализация на Ubuntu 16.04, Openfire 4.2.3. Все сделал по инструкции, клиент Spark 2.8.3 ошибка — Unable to connect using Single Sign-On. Перепробовал все варианты, прочитал множество разной информации. Включил в состав домена Windows. Уже начал отчаиваться и бросить идею с прозрачной аутентификацией. Проблема оказалась более простой. У меня Openfire был запущен от имени «openfire», а по инструкции права выставляются на «daemon». В общем, проблема была в доступах, процесс Openfire не мог получить доступ к файлам для аутентификации. Как выставил права, все сращу заработало — клиенты Spark и Miranda MG. Miranda NG — прописываешь домен и ставишь галочку – «Доменный логин», копируешь на машины клиентов. У данного клиента куча плагинов, в том числе и автоматическая загрузка и переподключение. Все запускается, все подключается, все работает. В моем случае:
Было
chown daemon:daemon /opt/openfire/conf/gss.conf
chown daemon:daemon /opt/openfire/xmpp.keytab
chmod 440 /opt/openfire/xmpp.keytab
Стало
chown openfire:openfire /opt/openfire/conf/gss.conf
chown openfire:openfire /opt/openfire/xmpp.keytab
chmod 440 /opt/openfire/xmpp.keytab
Cпасибо за статью, она реально рабочая.
ОМГ. Даже не подумал, что люди не обратят внимание на владельца и группу от которого работает openfire, а просто скопипастят. Блин. Добавлю в заметку. Спасибо.
Статья оличная. Все работает.
Спасибо.
Спасибо. Забавное было приключение 🙂 Изначально поднимал на centos7, но что то не заладилось, то openfire mysql терял и не давал больше логиниться то еще что то, вообщем в свободное время изучал материал пробовал и тестировал + руководство подкидовало новые вводные «хотелки». В итоге решил поднимать на windows, читал про патч «нормана» так как кто то на руборде (форум по этой теме на 100+ страниц) сказал что sso работает только там ;), потом были инструкции от Jonathan Murch несколько штук. да много чего было… в итоге совершенно отчаявшись и печально глядя на 28 закладок в папке openfire своего браузера я вновь открыл первую — твою, и был поражен на сколько все оказалось просто.
Спасибо тебе Большое! Удачи.
ps’:И первый комент как нельзя лучше отражает моё состояние к этому вот всему.
Ключик проверяет, в openfire все прописано, а Unable to connect using Single Sign-On. Please check your principal and все равно валит, есть у кого решение?
В комментах чуть выше была подобная ошибка. Просмотрите от кого запускается openfire и проверьте права на /opt/openfire/
Запускается от daemon, соответственно и права на него аналогичные.
Я так понимаю ты все настроил, но spark тем не менее не подключается? Если я правильно понял, то попробуй создать файл kbd5.ini и закинуть его в C:\Windows и перезагрузи комп.
содержимое файла
положили данный файл в C:\Windows на клиентской машине, не чего не изменилось.
Может проблема в том что в spark на вкладке SSO ошибка ?
spark is unable to find the principal to use for single sign-on. this will prevent sso from working
Такая же как на этом скрине:
https://discourse.igniterealtime.org/uploads/default/original/2X/3/315d6fb7365d6e8bf30e59e6e461e41625a4c244.PNG
ps/ верхний чек бокс установлен. Скин из сети
Глупый вопрос, а везде заменили realm.local на ваш домен?
https://drive.google.com/open?id=1Ih0cDbcsPDKVDPZ2x6HjT8Lxb9RfGnOu
Может где то мы и ошиблись в конфигах, можете посмотреть? там же положил файл с описанием что у нас домен, а что контроллер домена.
Так же нашел инструкцию
https://discourse.igniterealtime.org/uploads/default/original/2X/a/ace606558648fa4ca6406e6a7163b9bd2a809494.pdf
Там пишут про настройку DNS зоны и выставление параметра
Configure encryption
types allowed for Kerberos
Enable all encryption types including DES_CBC_CRC
Это нужно делать для вашего метода?
Насколько помню, я этого не делал, а все что делал пошагово расписал.
мне не понятно почему вы ключ создавали один, а в gss.conf прописано другое.
Имелось ввиду что там написано openfireserver
Исправил все как и там. В папку так же положил скрин. ДА ключ при проверке выдает Authenticated to Kerberos v5. Также скинул туда логи.
Странно, не вижу причин почему не работает. А попробуйте выключить selinux, если он включен. Возможно он мешает.
И там в файле описание в ключе перед собакой единица. я так понимаю это опечатка?
при проверке Authenticated to Kerberos v5 вы получаете?
выключил selinux. Ошибка осталась,
Может лог поможет? вот такая ошибка после попытки подключения.
2019.03.15 23:59:35 org.jivesoftware.openfire.nio.ConnectionHandler — Closing connection due to exception in session: (0x00000027: nio socket, server, null => 0.0.0.0/0.0.0.0:5222)
javax.net.ssl.SSLHandshakeException: SSL handshake failed.
at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:487)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.net.ssl.SSLException: Received fatal alert: certificate_unknown
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at org.apache.mina.filter.ssl.SslHandler.unwrap(SslHandler.java:728)
at org.apache.mina.filter.ssl.SslHandler.unwrapHandshake(SslHandler.java:666)
at org.apache.mina.filter.ssl.SslHandler.handshake(SslHandler.java:552)
at org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:351)
at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:468)
… 15 more
в последних версиях spark-а во вкладке General нужно выбрать галку принимать все сертификаты — Accept all certificates.
Этот чек у меня установлен. Добавил с диск скрин с настройками spark
Нашел статью https://discourse.igniterealtime.org/t/how-to-setup-sso-on-windows-server-2008r2-2012r2-with-a-domain-level-of-2008r2-2012r2/58502
тут говориться об особеностях настройки openfire для spark 2.8
НО пока что победить не удается
чет в логах у тебя «com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure»
и что из этого следует?) Что проблемы со связью с БД?
Забавная получается ситуация, работает на Spark 2.7,
Spark 2.8 и миранду например уже не вывозит, Accept all certificates — галочка стоит, с чем может быть проблема?
Сталкивался с чем-то похожим, в windows 10, работать начинало когда spark запускался от администратора. Если просто под юзером с админ правами, то подключения не было.
Большое спасибо!
Добрый день. Настроил связку Centos7 + OF4.6.4+Spark
На стороне клиента получаю ошибку
org.jivesoftware.smack.SmackException: javax.security.sasl.SaslException: Failure to initialize security context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException: Illegal config content:} [domain_realms])]
at org.jivesoftware.smack.sasl.javax.SASLJavaXMechanism.authenticateInternal(SASLJavaXMechanism.java:103)
at org.jivesoftware.smack.sasl.SASLMechanism.authenticate(SASLMechanism.java:156)
at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:202)
at org.jivesoftware.smack.tcp.XMPPTCPConnection.loginInternal(XMPPTCPConnection.java:403)
at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:546)
at org.jivesoftware.gui.LoginUIPanel.login(LoginUIPanel.java:1223)
at org.jivesoftware.gui.LoginUIPanel.access$1000(LoginUIPanel.java:134)
at org.jivesoftware.gui.LoginUIPanel$6.construct(LoginUIPanel.java:1023)
at org.jivesoftware.spark.util.SwingWorker.lambda$new$0(SwingWorker.java:139)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.security.sasl.SaslException: Failure to initialize security context [Caused by GSSException: Invalid name provided (Mechanism level: KrbException: Illegal config content:} [domain_realms])]
at com.sun.security.sasl.gsskerb.GssKrb5Client.(Unknown Source)
at com.sun.security.sasl.gsskerb.FactoryImpl.createSaslClient(Unknown Source)
at javax.security.sasl.Sasl.createSaslClient(Unknown Source)
at org.jivesoftware.smack.sasl.javax.SASLJavaXMechanism.authenticateInternal(SASLJavaXMechanism.java:61)
… 9 more
Caused by: GSSException: Invalid name provided (Mechanism level: KrbException: Illegal config content:} [domain_realms])
at sun.security.jgss.krb5.Krb5NameElement.getInstance(Unknown Source)
at sun.security.jgss.krb5.Krb5MechFactory.getNameElement(Unknown Source)
at sun.security.jgss.GSSManagerImpl.getNameElement(Unknown Source)
at sun.security.jgss.GSSNameImpl.getElement(Unknown Source)
at sun.security.jgss.GSSNameImpl.init(Unknown Source)
at sun.security.jgss.GSSNameImpl.(Unknown Source)
at sun.security.jgss.GSSManagerImpl.createName(Unknown Source)
… 13 more
Решить удалось?
NO