我在运行Windows 2012时,尝试对Java Web容器进行身份验证(我尝试了Tomcat和Jetty),但遇到了困难。
每次尝试使用Negotiate身份验证方案时,都会出现错误:org.ietf.jgss.GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
复现步骤:
首先设置一个 Windows Server 2012 或 2016 实例,并安装活动目录域服务。
例如,在我的情况下,我创建了:
NETBIOS域: NICKIS
Dns域: nickis.life
在活动目录中创建Kerberos主题用户
重要提示:确保名字、姓氏和全名相同!
在我的例子中,新建的用户是:
DN = CN=kerberos500,CN=Users,DC=nickis,DC=life
登录+域 = kerberos500@nickis.life
NETBIOS\samAccountName = NICKIS\kerberos500
从Windows活动目录服务器运行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进行单点登录所需的两个输入。
因此,我将这些输入部署到我的Web容器的Hadoop安全模块中的Kerberos安全域中。
Curl测试 我尝试使用curl进行测试,但失败了:
curl --negotiate -u : http://nickis.life:8080/my/webapp
Internet Explorer测试 我也尝试使用Internet Explorer。我在Internet Explorer中的受信任角色中添加了nickis.life
域。然后在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服务器设置步骤,微软员工验证了这在这里不应该是个问题: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
有人能追踪我错在哪里吗?
更新:
我有一个AD服务器,域设置为fusionis.life
,AD服务器名为WIN-OVV6VHBGIB8.fusionis.life
DESKTOP-VTPBE99.fusionis.life
dnsmgmt.msc
并添加了一个“转发查找区”,其中“kerberos500.nickis.life”是一个A主机,其设置为DESKTOP-VTPBE99.fusionis.life
盒子的IP。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
针对域控制器: WIN-OVV6VHBGIB8.fusionis.life
使用传统的密码设置方法
成功将HTTP/kerberos500.nickis.life映射到kerberos500。
密钥已创建。
密钥已创建。
密钥已创建。
密钥已创建。
密钥已创建。
键输出到c:\Users\Administrator\kerberos500.keytab:
Keytab版本: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更新文件保存在服务器上,然后将服务主体更新为HTTP/kerberos500.nickis.life@NICKIS.LIFE
我以域用户身份登录到tomcat机器,将http://kerberos500.nickis.life添加到受信任站点,然后导航至http://kerberos500.nickis.life:8764
我检查了kerberos500 AD“账户”选项卡中加密复选框的所有组合。
现在我遇到一个新的错误...
GSSException:未提供有效凭证(机制级别:未能找到任何Kerberos凭证)
更新:
终于解决了。我之所以出现这个最终的错误,是因为我需要将fusionis.life
放在与nickis.life
相同的主机上。