Аутентификация Kerberos с использованием Java и ActiveDirectory: KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN

У меня есть Java-приложение с поддержкой единого входа с использованием Kerberos по URL-адресу http://alf-test.example.com/. К сожалению, кое-что не работает, AD говорит, что не знает принципала обслуживания. Это обмен TGS-REQ:

Запрос:

Kerberos TGS-REQ
Record Mark: 1499 bytes
    0... .... .... .... .... .... .... .... = Reserved: Not set
    .000 0000 0000 0000 0000 0101 1101 1011 = Record Length: 1499
Pvno: 5
MSG Type: TGS-REQ (12)
padata: PA-TGS-REQ
KDC_REQ_BODY
    Padding: 0
    KDCOptions: 40810000 (Forwardable, Renewable, Canonicalize)
    Realm: EESERV.LOCAL
    Server Name (Service and Instance): HTTP/alf-test.example.com
        Name-type: Service and Instance (2)
        Name: HTTP
        Name: alf-test.example.com
    till: 2037-09-13 02:48:05 (UTC)
    Nonce: 632225483
    Encryption Types: rc4-hmac rc4-hmac-old rc4-md4 des-cbc-md5 des-cbc-crc rc4-hmac-exp rc4-hmac-old-exp

Ответить:

Kerberos KRB-ERROR
Record Mark: 125 bytes
    0... .... .... .... .... .... .... .... = Reserved: Not set
    .000 0000 0000 0000 0000 0000 0111 1101 = Record Length: 125
Pvno: 5
MSG Type: KRB-ERROR (30)
stime: 2011-06-08 12:06:23 (UTC)
susec: 23385
error_code: KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN (7)
Realm: EESERV.LOCAL
Server Name (Service and Instance): HTTP/alf-test.example.com
    Name-type: Service and Instance (2)
    Name: HTTP
    Name: alf-test.example.com
e-data

Тем не менее, следующие работы:

kinit HTTP/alf-test.example.com

Кроме того, я получаю эти выходные данные, когда я хочу, чтобы setspn перечислил имена участников службы, что мне кажется хорошим:

setspn -l test-alfrescohttp
Registered ServicePrincipalNames for CN=Alfresco-Test HTTP,CN=Users,DC=example,DC=com:
    HTTP/alf-test
    HTTP/alf-test.example.com

Итак, субъект службы, похоже, существует, но я постоянно вижу ошибку KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN в Wireshark, когда браузер впервые обращается к хосту. Я запутался, что тут может быть не так?

С наилучшими пожеланиями, Майкл

2 ответа

KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN означает, что KDC не знает, кто владеет SPN, в вашем случае запрошенный SPN HTTP/self-test.example.com

Две распространенные причины этого:

  1. SPN не существует ни в одной учетной записи в лесу Active Directory (не похоже на ваш случай)
  2. существует более одного аккаунта с одинаковым SPN (дубликат SPN)

Возможно, у вас где-то есть дубликат имени участника-службы, следовательно, две или более учетных записи имеют одно и то же имя участника-службы.

Чтобы проверить лес AD, какие учетные записи содержат имя участника-службы, выполните следующую команду:

setspn -Q HTTP/self-test.example.com

Это должно показать вам все учетные записи (если таковые имеются), которые несут этот SPN.

* (подстановочный знак) также действителен, если вы хотите использовать для запроса

например setspn -Q HTTP/self-test*

Запросить билет на Realm: EESERV.LOCAL
Нужно запросить билет на Realm: EXAMPLE.COM

Причина же как источник Registered ServicePrincipalNames for CN=Alfresco-Test HTTP,CN=Users,DC=eeserv,DC=local:

Предполагая, что субъект службы существует в AD и правильно настроен, изменения этого может быть достаточно. Не знаю, как изменить.

Другие вопросы по тегам