【发布时间】:2018-04-23 22:45:15
【问题描述】:
在 Windows 2012 上运行时,我正在努力验证 Java Web 容器(我已尝试过 Tomcat 和 Jetty)。
每次我尝试协商身份验证方案时都会收到错误消息:org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
重现步骤
首先设置 Windows Server 2012 或 2016 实例并安装 Active Directory 域服务。
在我的示例中,我创建了:
NETBIOS 域: NICKIS
DNS 域: nickis.life
在 Active Directory 上创建 kerberos 主题用户
重要提示:确保名字、姓氏和全名相同!
我的新用户是:
DN = CN=kerberos500,CN=Users,DC=nickis,DC=life
登录名+域 = kerberos500@nickis.life
NETBIOS\samAccountName = NICKIS\kerberos500
从 Windows Active Directory 服务器运行 setspn 命令
setspn -A HTTP/nickis.life@NICKIS.LIFE kerberos500
示例输出:
C:\Users\Administrator>setspn -A HTTP/nickis.life kerberos500
Checking domain DC=nickis,DC=life
Registering ServicePrincipalNames for CN=kerberos500,CN=Users,DC=nickis,DC=life
HTTP/kerberos500.nickis.life
Updated object
从 Windows Active Directory 服务器运行 ktpass 命令
ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/nickis.life@NICKIS.LIFE -mapUser kerberos500 -mapOp set -pass XXXXpasswordforkerberos500userXXXX -crypto DES-CBC-MD5 -pType KRB5_NT_PRINCIPAL +DesOnly
示例输出:
C:\Users\Administrator>ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/nickis.life@NICKIS.LIFE -mapUser kerberos500 -mapOp set -pass xxxxxxxx -crypto DES-CBC-MD5 -pType KRB5_NT_PRINCIPAL +DesOnly
Targeting domain controller: WIN-OVV6VHBGIB8.nickis.life
Using legacy password setting method
Successfully mapped HTTP/kerberos500.nickis.life to kerberos500.
Key created.
Output keytab to c:\Users\Administrator\kerberos500.keytab:
Keytab version: 0x502
keysize 71 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x3 (DES-CBC-MD5) keylength 8 (0xcd07200bea625d20)
Account kerberos500 has been set for DES-only encryption.
此时,您将拥有一个 keytab 文件:
c:\Users\Administrator\kerberos500.keytab
还有一个用户主体:
HTTP/kerberos500.nickis.life@NICKIS.LIFE
这些是提供给 GSSApi 以使用 Kerberos 进行单点登录所需的 2 个输入。
因此,我将这些输入部署到了 Hadoop 安全模块中的 Web 容器的 kerberos 安全领域。
Curl测试我尝试使用curl测试失败:
curl --negotiate -u : http://nickis.life:8080/my/webapp
Internet Explorer 测试 我也尝试使用 Internet Explorer。我将 nickis.life 域添加到 Internet Explorer 中的受信任角色中。然后我在 Internet Explorer 中启动该网站:http://nickis.life:8080
无论哪种方式,我都会收到以下错误:
org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.java:398) ~[hadoop-auth-2.7.1.jar:?]
...
Caused by: org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at sun.security.jgss.GSSHeader.<init>(Unknown Source) ~[?:1.8.0_131]
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) ~[?:1.8.0_131]
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source) ~[?:1.8.0_131]
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.java:365) ~[hadoop-auth-2.7.1.jar:?]
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler$2.run(KerberosAuthenticationHandler.java:347) ~[hadoop-auth-2.7.1.jar:?]
at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_131]
at javax.security.auth.Subject.doAs(Unknown Source) ~[?:1.8.0_131]
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.authenticate(KerberosAuthenticationHandler.java:347) ~[hadoop-auth-2.7.1.jar:?]
我被难住了。注意:我在这里和那里找到了几个链接,但是它们都没有像我在这里总结的那样包含所遵循的步骤,并且其中提供的解决方案都没有为我工作。
- 我正在尝试从域上的另一台计算机而不是运行服务器的计算机上进行 kerberos 登录
- 我尝试了各种 keytab 生成变体的组合,但都没有奏效。
- 没有重复的 SPN。
- 我尝试将域服务器中的 DNS 设置为
A记录。 - 我想知道是否有一些 kerberos Windows 服务器设置步骤,并且 Microsoft 员工已验证这里不应该是这种情况:https://social.msdn.microsoft.com/Forums/sharepoint/en-US/db15ad96-e269-436e-952f-fe9dfb39da8a/setting-up-a-test-windows-server-active-directory-for-kerberos-testing?forum=winserverDS
谁能追踪我在这里搞砸了什么?
更新:
- 我有域设置为
fusionis.life的AD服务器,AD服务器是WIN-OVV6VHBGIB8.fusionis.life - 我将 tomcat 服务器移动到域中的另一台 Windows 机器上。
DESKTOP-VTPBE99.fusionis.life - 我打开了
dnsmgmt.msc并添加了一个带有“kerberos500.nickis.life”的“Forward Lookup Zone”,并将A HOST 设置为DESKTOP-VTPBE99.fusionis.life框的IP。 - 我删除了 AD 帐户,重新创建了它,然后按照票证上的一个答案中的建议再次重新生成了 keytab。
C:\Users\Administrator>ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/kerberos500.nickis.life@NICKIS.LIFE -mapUser kerberos500 -mapOp set -pass xxxxxxxxx -crypto ALL -pType KRB5_NT_PRINCIPAL
Targeting domain controller: WIN-OVV6VHBGIB8.fusionis.life
Using legacy password setting method
Successfully mapped HTTP/kerberos500.nickis.life to kerberos500.
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to c:\Users\Administrator\kerberos500.keytab:
Keytab version: 0x502
keysize 67 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x04e30b9183ba8389)
keysize 67 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x3 (DES-CBC-MD5) keylength 8 (0x04e30b9183ba8389)
keysize 75 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x17 (RC4-HMAC) keylength 16 (0xe39a141de38abd8750bf9c0bf49fd1c5)
keysize 91 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x12 (AES256-SHA1) keylength 32 (0xe368a1b060cfe4816f522c1c5f62ca07fe201ed96c6d018054dfbd5b86251892)
keysize 75 HTTP/kerberos500.nickis.life@NICKIS.LIFE ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x11 (AES128-SHA1) keylength 16 (0x1b1a548fa2893a78c6f4c7f9c482b614)
我将 keytab 更新文件保存在服务器上,然后将 Service Principal 更新为
HTTP/kerberos500.nickis.life@NICKIS.LIFE我以域用户身份登录 tomcat 机器,将 http://kerberos500.nickis.life 添加到受信任站点,然后导航到 http://kerberos500.nickis.life:8764
我检查了 kerberos500 AD“帐户”选项卡中加密复选框的所有组合。
现在我遇到了一个新错误...
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
更新:
终于解决了。我得到了最后一个错误,因为我需要 fusionis.life 与 nickis.life 位于同一主机上
【问题讨论】:
-
这是一个非常广泛的问题。为了更好地回答它,我建议向它添加 kerberos 和 spnego 标签。也许也可以提供赏金。只是我的 .02。
-
@JohnRSmith 好的。
-
有人提到可能是区分大小写导致我的问题
-
我怀疑它是否区分大小写。其中很多内容不区分大小写,例如 Web 浏览器 URL。此处可能存在一些影响该方案的 Active Directory 含义。
-
抱歉,我遇到了 Windows + VirtualBox 的问题,它杀死了 VM,我不得不对此进行测试。我正在尝试解决。
标签: java windows active-directory kerberos gssapi