Аутентификация 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
Две распространенные причины этого:
- SPN не существует ни в одной учетной записи в лесу Active Directory (не похоже на ваш случай)
- существует более одного аккаунта с одинаковым 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 и правильно настроен, изменения этого может быть достаточно. Не знаю, как изменить.