centos 7 + openfire 4.0.2 + SSO

Заметка на память как заставить 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

centos 7 + openfire 4.0.2 + SSO: 34 комментария

  1. Добрый день, сделал все по инструкции, пишет 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

      1. все сделал по твоей инструкции но все равно пишется 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

    1. Аналогичная фигня с на связке Openfire 4.2.3 на Debian и AD на Windows Server 2008 R2.
      Собственно, заметил, что к серверу в принципе не присоединиться при добавлении sasl.mechs = GSSAPI.
      Такие дела.

  2. Реализация на 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пасибо за статью, она реально рабочая.

    1. ОМГ. Даже не подумал, что люди не обратят внимание на владельца и группу от которого работает openfire, а просто скопипастят. Блин. Добавлю в заметку. Спасибо.

  3. Спасибо. Забавное было приключение 🙂 Изначально поднимал на centos7, но что то не заладилось, то openfire mysql терял и не давал больше логиниться то еще что то, вообщем в свободное время изучал материал пробовал и тестировал + руководство подкидовало новые вводные «хотелки». В итоге решил поднимать на windows, читал про патч «нормана» так как кто то на руборде (форум по этой теме на 100+ страниц) сказал что sso работает только там ;), потом были инструкции от Jonathan Murch несколько штук. да много чего было… в итоге совершенно отчаявшись и печально глядя на 28 закладок в папке openfire своего браузера я вновь открыл первую — твою, и был поражен на сколько все оказалось просто.
    Спасибо тебе Большое! Удачи.

    ps’:И первый комент как нельзя лучше отражает моё состояние к этому вот всему.

  4. Ключик проверяет, в openfire все прописано, а Unable to connect using Single Sign-On. Please check your principal and все равно валит, есть у кого решение?

    1. В комментах чуть выше была подобная ошибка. Просмотрите от кого запускается openfire и проверьте права на /opt/openfire/

        1. Я так понимаю ты все настроил, но spark тем не менее не подключается? Если я правильно понял, то попробуй создать файл kbd5.ini и закинуть его в C:\Windows и перезагрузи комп.

          содержимое файла

          [libdefaults]
              default_realm = REALM.LOCAL
              default_tkt_enctypes = rc4-hmac
              default_tgs_enctypes = rc4-hmac
          [realms]
              REALM.LOCAL = {
                  kdc = realm.local
                  admin_server = realm.local
                  default_domain = REALM.LOCAL
              }
          [domain_realm]
              .realm.local = REALM.LOCAL
              realm.local = REALM.LOCAL
          1. положили данный файл в 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/ верхний чек бокс установлен. Скин из сети

                  1. Имелось ввиду что там написано openfireserver
                    Исправил все как и там. В папку так же положил скрин. ДА ключ при проверке выдает Authenticated to Kerberos v5. Также скинул туда логи.

                    1. Странно, не вижу причин почему не работает. А попробуйте выключить selinux, если он включен. Возможно он мешает.

                1. И там в файле описание в ключе перед собакой единица. я так понимаю это опечатка?

                  при проверке Authenticated to Kerberos v5 вы получаете?

                  1. выключил 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

                    1. в последних версиях spark-а во вкладке General нужно выбрать галку принимать все сертификаты — Accept all certificates.

  5. Этот чек у меня установлен. Добавил с диск скрин с настройками spark

  6. Забавная получается ситуация, работает на Spark 2.7,
    Spark 2.8 и миранду например уже не вывозит, Accept all certificates — галочка стоит, с чем может быть проблема?

    1. Сталкивался с чем-то похожим, в windows 10, работать начинало когда spark запускался от администратора. Если просто под юзером с админ правами, то подключения не было.

  7. Добрый день. Настроил связку 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Материалы распространяются под лицензией Creative Commons: Атрибуция — Некоммерческое использование — С сохранением условий (Attribution-NonCommercial-ShareAlike) 3.0 Unported.
Рейтинг@Mail.ru