Контекст принятия ошибки GSS-API: Сервисный ключ недоступен - код Solaris, Windows KDC - PullRequest
3 голосов
/ 25 июля 2011

Я пытаюсь получить тестовую пару клиент / сервер Kerberos, работающую с Active Directory.Я создал трех пользователей в свободном домене в нашей корпоративной сети: «RichardC», «Server1» и «Server2».Пользователям моего сервера назначены разные имена участников службы, одно с KRB5_NT_PRINCIPAL, другое с KRB5_NT_SRV_HOST.

ktpass -out server2.keytab 
          -princ server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
          -mapuser ServerUser2@BENCHMARKING.RDDEV.LOCAL
          -pass ThePassword
          -crypto All
          -pType KRB5_NT_SRV_HOST
          -kvno 2

В этот раз я не использовал опцию + DesOnly, надеясь, что в современных системах я не используюнужен DES.В этом вопросе я заменил реальное доменное имя mydomain, чтобы избежать проблем с управлением.

Это дает мне таблицу ключей.Я могу добавить его в список:

KVNO Principal
---- --------------------------------------------------------------------------
   2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (DES cbc mode with CRC-32)
   2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (DES cbc mode with RSA-MD5)
   2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (ArcFour with HMAC/md5)
   2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (AES-128 CTS mode with 96-bit SHA-1 HMAC)

Я даже могу использовать kinit -k для входа в систему с помощью ключа из таблицы ключей - так что, похоже, он работает.

У меня есть своя собственная программа тестированияи не удалось выполнить тестовую программу с http://download.oracle.com/docs/cd/E19683-01/816-1331/sampleprogs-1/index.html. В этой программе на сервере я изменил GSS_C_NT_HOSTBASED_SERVICE на GSS_C_NT_USER_NAME с обоими клавишами, чтобы она распознала имя.Я использую демонстрационный сервер Oracle под именем

./gss-server -mech 1.2.840.113554.1.2.2 server2/serbia.mydomain.com    

, а клиент

./gss-client -mech 1.2.840.113554.1.2.2 serbia.mydomain.com server2 "Hello"

Результат:

GSS-API error accepting context: Invalid credential was supplied
GSS-API error accepting context: Service key not available

И в этом, и в моем собственном тестеВ коде ошибка возникает после того, как клиент отправил свой первый токен, когда сервер пытается его декодировать.

klist показывает ключ, предоставленный для клиента.Он использует ArcFour, который находится в keytab

Default principal: RichardC@BENCHMARKING.RDDEV.LOCAL

Valid starting                Expires                Service principal
07/25/11 17:36:49  07/26/11 03:35:18  krbtgt/BENCHMARKING.RDDEV.LOCAL@BENCHMARKING.RDDEV.LOCAL
    renew until 08/01/11 17:36:49
07/25/11 17:36:03  07/26/11 03:35:18  server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
    renew until 08/01/11 17:36:03

Машина UNIX (Сербия) может принадлежать другой сфере (той, что я назвал mydomain.com здесь), хотя она, похоже, неесть настройка Kerberos.Я использую локальный файл krb5.conf, который я указал на область BENCHMARKING.RDDEV.LOCAL, хотя, если машина пытается использовать DNS со своим именем хоста, она может получить неправильный ответ.Мой krb5.conf имеет

[libdefaults]
    default_keytab_name = /users/dev/core/richardc/server1.keytab
    default_realm = BENCHMARKING.RDDEV.LOCAL
    dns_lookup_kdc = false
    default_tkt_types = DES-CBC-MD5

[realms]
BENCHMARKING.RDDEV.LOCAL = {
    kdc = gbha-dcbench01p.benchmarking.rddev.local
    admin_server = gbha-dcbench01p.benchmarking.rddev.local
}

[domain_realm]
benchmarking.rddev.local = BENCHMARKING.RDDEV.LOCAL
.benchmarking.rddev.local = BENCHMARKING.RDDEV.LOCAL
mydomain.com = BENCHMARKING.RDDEV.LOCAL
.mydomain.com = BENCHMARKING.RDDEV.LOCAL

Похоже, что параметры, такие как default_tkt_types, были неэффективными.

Вопрос - как мне исправить мою ошибку?

Спасибо - Ричард

1 Ответ

3 голосов
/ 26 июля 2011

Проблема была в

ktpass -out server2.keytab 
      -princ server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
      -mapuser ServerUser2@BENCHMARKING.RDDEV.LOCAL
      -pass ThePassword
      -crypto All
      -pType KRB5_NT_SRV_HOST
      -kvno 2

Это приводит к тому, что Windows увеличивает номер версии ключа. Результирующий ключ по какой-то причине не является проблемой для входа в систему «kinit -k», но приводит к сбою кода сервера GSS-API с бесполезным «Служебный ключ недоступен» в системах Solaris.

Система Windows была 2008R2. Я понимаю, что поведение этой команды варьировалось в разных версиях Windows.

Я успешно проверил с DesOnly. Мне нужно было бы вернуться в бедный осажденный отдел ИТ для любых других тестов :-)

Решение - пропустить аргумент -kvno.

 ktpass -out server4.keytab 
      -princ server4/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
      -mapuser ServerUser4@BENCHMARKING.RDDEV.LOCAL
      -pass ThePassword
      -crypto DES-CBC-MD5
      -pType KRB5_NT_USER_PRINCIPAL

Это дает вывод

Targeting domain controller: GBHA-DCBENCH01P.benchmarking.rddev.local
Using legacy password setting method
Successfully mapped server4/serbia.mydomain.com to Server4.
Key created.
Output keytab to server4.keytab:
Keytab version: 0x502
keysize 79 server4/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL ptype 1
     (KRB5_NT_PRINCIPAL) vno 5 etype 0x3 (DES-CBC-MD5) keylength 8 (0xd1532a6d0f2a8631)
Account Server4 has been set for DES-only encryption.

Обратите внимание на "vno 5" в выводе.

Я протестировал оба значения для -pType. Оба работают.

В моем коде GSS используется GSS_C_NT_HOSTBASED_SERVICE, но все это, похоже, меняет формат, необходимый для ввода имени.

(я сменил ключ выше)

Добавление

Мое окончательное решение использует -pType KRB5_NT_USER_PRINCIPAL

Мой код GSS использует GSS_C_NT_USER_NAME для поиска имени, и я указываю полное имя server4/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL. Я обнаружил, что не все платформы, на которых я работал, приняли GSS_C_NT_HOSTBASED_SERVICE, но все они принимают GSS_C_NT_USER_NAME.

Лицо, устанавливающее наше серверное приложение, устанавливает имя участника сервера в качестве параметра конфигурации. Это казалось самым надежным способом. Человек, который устанавливает ключ и знает, что это такое, напрямую сообщает приложению, какой ключ использовать.

...