"GSSException Defective token detected" - 在 Windows 上尝试使用 Kerberos 对 Tomcat 运行 进行身份验证时
"GSSException Defective token detected" - when trying to Authenticate to Tomcat running on Windows using Kerberos
当 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 实例并安装活动目录域服务。
在我的示例中,我创建了:
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.
此时,您将拥有一个密钥表文件:
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.run(KerberosAuthenticationHandler.java:365) ~[hadoop-auth-2.7.1.jar:?]
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.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:?]
我很难过。注意:我在这里和那里找到了几个链接,但其中 none 都包含在所遵循的步骤中,就像我在此处总结的那样,并且 none 中提供的解决方案对我有用。
- 我正在尝试从域中的另一台机器进行 kerberos 登录,而不是 运行 在
上的服务器
- 我尝试了密钥表生成变体的各种组合 none 都有效。
- 没有重复的 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
并添加了一个 "Forward Lookup Zone" 和 "kerberos500.nickis.life" 并且 A HOST 设置为 DESKTOP-VTPBE99.fusionis.life
框的 IP。
- 我删除了 AD 帐户,重新创建了它,然后按照票证上的一个答案中的建议重新生成了密钥表。
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)
我将密钥表更新文件保存在服务器上,然后将服务主体更新为HTTP/kerberos500.nickis.life@NICKIS.LIFE
我以域用户身份登录 tomcat 机器,添加了 http://kerberos500.nickis.life to the trusted sites, then navigated to http://kerberos500.nickis.life:8764
我选中了 kerberos500 AD "account" 选项卡中加密复选框的所有组合。
现在我收到一个新错误...
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
更新:
终于解决了。我收到最后一个错误是因为我需要 fusionis.life
与 nickis.life
在同一主机上
试试这个:
解决方案 1
运行 这个在 windows cmd:
ksetup /addkdc
ksetup /addhosttorealmmap
并在浏览器上设置 SPNEGO 设置
解决方案 2
尝试使用 Firefox,之前执行此操作:
1) 在 Firefox
中打开这个 URL
关于:配置
2) 设置:network.negotiate-auth.trusted-uris
为任何需要协商身份验证的集群 DNS 域设置(例如启用了 kerberos 的集群 HTTP 身份验证)。
示例:
network.negotiate-auth.trusted-uris=.lily.cloudera.com,.solr.cloudera.com
2) 设置:network.auth.use-sspi=false
3) 重启火狐
4) 你必须从这里下载 Windows isnaller:
http://web.mit.edu/kerberos/dist/#kfw-4.0
5) 将 Kerberos 客户端配置复制到此处
C:\ProgramData\MIT\Kerberos5\krb5.ini
6) 使用 MIT kerberos GUI 客户端创建票证
7) 使用 Firefox 再试一次
希望对您有所帮助。
错误“检测到缺陷令牌”可能意味着 ntlm token was detected. That’s what the Negotiate mechanism uses inside popular web browsers if kerberos fails - when not instructed by the web server otherwise. On windows 操作系统,其上的 IE 网络浏览器(以及 Firefox,如果配置正确)基本上说,如果您不执行 Kerberos,我将向您发送一个 NTLM 令牌。服务器回复“不可能”,我什至不知道 NTLM,所以我说你发给我的东西有缺陷。由于您似乎是第一次设置它,您可能没有为 Kerberos 失败时的任何回退机制(例如 NTLM)配置,因此,该错误消息。我们通过了解 Kerberos 失败的原因来解决这个问题。我想我在两个与 SPN 和可信站点相关的地方看到了您问题失败的原因。即使您解决了这两项,还有可能继续失败的第三个原因和第四个原因,与加密有关。
- spn for the HTTP service does not match the URL entered by the browser. These need to match, otherwise Kerberos will fail. To work, the browser should be using: http://kerberos500.nickis.life:8080, not http://nickis.life:8080. I say that based on what I saw in your keytab creation syntax. In that you’ve coded the SPN as such: HTTP/kerberos500.nickis.life@NICKIS.LIFE. That’s why you need to use http://kerberos500.nickis.life:8080. The browser won’t know how to get to your web service when you tell it to go to http://nickis.life:8080. With that top URL, the browser assumes it needs to find a web service running on your Active Directorydomaincontroller(任何只有 nickis.life 的东西在域控制器上都假定为 运行)。出于安全原因,DC 永远不应 运行 Web 服务器。
- 您需要在 IE 设置下将 http://kerberos500.nickis.life 添加为可信站点。或者,*.nickis.life 也可以。 (您称其为受信任的角色,而实际上它被称为受信任的站点)。
- 您正在将 Kerberos 加密类型限制为 DES-CBC-MD5。从 Windows Server 2008 Active Directory R2 开始,默认情况下禁用 DES。如今,DES 是一种过时且通常不安全的加密类型。使用 AES128 或 AES256 更好。您可以通过根据下面的示例重新生成密钥表来解决此问题。
- 在 AD 用户帐户 kerberos500 中,转到“帐户”选项卡,滚动到底部,然后选中 DES、AES 128 和 AES 256 的所有框,然后就可以退出对话框了。您必须选中这些框,即使您按照上面的方式进行了所有操作,否则 Kerberos 身份验证仍然会失败。
如何正确地重新生成密钥表:每当您计划创建与该用户帐户关联的密钥表时,您不应该运行 setspn -a 命令将 SPN 添加到 AD 用户。原因是因为 keytab 创建命令将 SPN 作为命令的一部分添加到用户帐户。如果按照我上面的建议后您的方案不起作用,那么您需要通过 setspn -D 删除 SPN,如下所示:
setspn -D HTTP/nickis.life@NICKIS.LIFE kerberos500
然后重新生成密钥表,我唯一的变化是我告诉它使用所有加密类型。客户端和服务器将在身份验证过程中就最强的共同点达成一致。
ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/nickis.life@NICKIS.LIFE -mapUser kerberos500 -mapOp set -pass XXXXpasswordforkerberos500userXXXX -crypto ALL -pType KRB5_NT_PRINCIPAL
然后用新的替换旧的keytab。有关密钥表的其他深入信息,您可以在此处阅读我关于如何创建 Kerberos 密钥表的技术文章:Kerberos Keytabs – Explained。我经常根据我在这个论坛上看到的问题返回并编辑它。
顺便说一句,HTTP/kerberos500.nickis.life 是服务主体,而不是您在问题中所写的用户主体。我只使用网络浏览器在这种 HTTP 场景中测试 Kerberos,我不使用 cURL.
我敢肯定,如果您认真完成我上面强调的所有四点,您将解决这个问题。
EDIT1: 此答案假设您在具有 kerberos500.nickis.life 完全限定域名的主机上有一个 HTTP 服务 运行ning。如果你没有这样一个名字的主机,我的答案会略有改变。如果有的话请告诉我。
EDIT2: 要使用 http://nickis.life:8080 的 URL 实现 objective 身份验证,那么您可以继续使用相同的密钥表你已经创建了。
在 AD 帐户 NICKIS\kerberos500 上,转到“帐户”选项卡,滚动到底部,然后选中 "Use Kerberos DES encryption types for this account" 的框。
然后通过组策略在 AD 域级别启用 DES 加密本身。为此,请执行以下操作:
- 打开组策略管理控制台 (GPMC)。
- 编辑默认域策略 GPO。 (创建一个新的域级 GPO 并对其进行编辑更安全,但这取决于您)。
- 导航到计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 安全选项 > “网络安全:配置 Kerberos 允许的加密类型”并选中 DES_CBC_MD5 的两个复选框和 DES_CBC_MD5。重要提示:在同一个组策略中,还要确保还选中了 RC4、AES128 和 AES256 的复选框。这些加密类型不会用于您网站的票证,但它们将用于域中的所有其他内容。确定,您已退出对话框并关闭 GPMC。
- 运行 DC 服务器和客户端上的 'gpupdate /force' 命令。
- 运行 'klist purge' 在客户端清除所有 Kerberos 票证。
- 在网络浏览器中,清除缓存并删除所有 cookie。
- 确保 DC 服务器允许端口 8080 TCP 入站。
- 再试一次。
参考:Windows Configurations for Kerberos Supported Encryption Type
编辑 3:避免在 same 机器上 运行ning Kerberos KDC(DC)、客户端和服务器。这是获得 "Defective token error" 的经典方法,即使您已正确完成所有其他操作。
编辑 4:(由 OP 验证的最终更新):查看新的 ktpass keytab 创建输出,我看到了这个:目标域控制器:WIN-OVV6VHBGIB8.fusionis.life。现在,密钥表中定义的 SPN 是 HTTP/kerberos500.nickis.life。 AD 域名与您定义的 SPN 不同,因此除非您在这些域之间建立某种信任设置,否则这不会起作用。如果您没有信任,则需要使用 HTTP/kerberos500.fusionis.life 的 SPN。
当 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 实例并安装活动目录域服务。
在我的示例中,我创建了:
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.
此时,您将拥有一个密钥表文件:
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.run(KerberosAuthenticationHandler.java:365) ~[hadoop-auth-2.7.1.jar:?]
at org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler.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:?]
我很难过。注意:我在这里和那里找到了几个链接,但其中 none 都包含在所遵循的步骤中,就像我在此处总结的那样,并且 none 中提供的解决方案对我有用。
- 我正在尝试从域中的另一台机器进行 kerberos 登录,而不是 运行 在 上的服务器
- 我尝试了密钥表生成变体的各种组合 none 都有效。
- 没有重复的 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
并添加了一个 "Forward Lookup Zone" 和 "kerberos500.nickis.life" 并且 A HOST 设置为DESKTOP-VTPBE99.fusionis.life
框的 IP。 - 我删除了 AD 帐户,重新创建了它,然后按照票证上的一个答案中的建议重新生成了密钥表。
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)
我将密钥表更新文件保存在服务器上,然后将服务主体更新为
HTTP/kerberos500.nickis.life@NICKIS.LIFE
我以域用户身份登录 tomcat 机器,添加了 http://kerberos500.nickis.life to the trusted sites, then navigated to http://kerberos500.nickis.life:8764
我选中了 kerberos500 AD "account" 选项卡中加密复选框的所有组合。
现在我收到一个新错误...
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
更新:
终于解决了。我收到最后一个错误是因为我需要 fusionis.life
与 nickis.life
试试这个:
解决方案 1
运行 这个在 windows cmd:
ksetup /addkdc ksetup /addhosttorealmmap
并在浏览器上设置 SPNEGO 设置
解决方案 2
尝试使用 Firefox,之前执行此操作:
1) 在 Firefox
中打开这个 URL关于:配置
2) 设置:network.negotiate-auth.trusted-uris
为任何需要协商身份验证的集群 DNS 域设置(例如启用了 kerberos 的集群 HTTP 身份验证)。
示例:
network.negotiate-auth.trusted-uris=.lily.cloudera.com,.solr.cloudera.com
2) 设置:network.auth.use-sspi=false 3) 重启火狐 4) 你必须从这里下载 Windows isnaller:
http://web.mit.edu/kerberos/dist/#kfw-4.0
5) 将 Kerberos 客户端配置复制到此处
C:\ProgramData\MIT\Kerberos5\krb5.ini
6) 使用 MIT kerberos GUI 客户端创建票证
7) 使用 Firefox 再试一次
希望对您有所帮助。
错误“检测到缺陷令牌”可能意味着 ntlm token was detected. That’s what the Negotiate mechanism uses inside popular web browsers if kerberos fails - when not instructed by the web server otherwise. On windows 操作系统,其上的 IE 网络浏览器(以及 Firefox,如果配置正确)基本上说,如果您不执行 Kerberos,我将向您发送一个 NTLM 令牌。服务器回复“不可能”,我什至不知道 NTLM,所以我说你发给我的东西有缺陷。由于您似乎是第一次设置它,您可能没有为 Kerberos 失败时的任何回退机制(例如 NTLM)配置,因此,该错误消息。我们通过了解 Kerberos 失败的原因来解决这个问题。我想我在两个与 SPN 和可信站点相关的地方看到了您问题失败的原因。即使您解决了这两项,还有可能继续失败的第三个原因和第四个原因,与加密有关。
- spn for the HTTP service does not match the URL entered by the browser. These need to match, otherwise Kerberos will fail. To work, the browser should be using: http://kerberos500.nickis.life:8080, not http://nickis.life:8080. I say that based on what I saw in your keytab creation syntax. In that you’ve coded the SPN as such: HTTP/kerberos500.nickis.life@NICKIS.LIFE. That’s why you need to use http://kerberos500.nickis.life:8080. The browser won’t know how to get to your web service when you tell it to go to http://nickis.life:8080. With that top URL, the browser assumes it needs to find a web service running on your Active Directorydomaincontroller(任何只有 nickis.life 的东西在域控制器上都假定为 运行)。出于安全原因,DC 永远不应 运行 Web 服务器。
- 您需要在 IE 设置下将 http://kerberos500.nickis.life 添加为可信站点。或者,*.nickis.life 也可以。 (您称其为受信任的角色,而实际上它被称为受信任的站点)。
- 您正在将 Kerberos 加密类型限制为 DES-CBC-MD5。从 Windows Server 2008 Active Directory R2 开始,默认情况下禁用 DES。如今,DES 是一种过时且通常不安全的加密类型。使用 AES128 或 AES256 更好。您可以通过根据下面的示例重新生成密钥表来解决此问题。
- 在 AD 用户帐户 kerberos500 中,转到“帐户”选项卡,滚动到底部,然后选中 DES、AES 128 和 AES 256 的所有框,然后就可以退出对话框了。您必须选中这些框,即使您按照上面的方式进行了所有操作,否则 Kerberos 身份验证仍然会失败。
如何正确地重新生成密钥表:每当您计划创建与该用户帐户关联的密钥表时,您不应该运行 setspn -a 命令将 SPN 添加到 AD 用户。原因是因为 keytab 创建命令将 SPN 作为命令的一部分添加到用户帐户。如果按照我上面的建议后您的方案不起作用,那么您需要通过 setspn -D 删除 SPN,如下所示:
setspn -D HTTP/nickis.life@NICKIS.LIFE kerberos500
然后重新生成密钥表,我唯一的变化是我告诉它使用所有加密类型。客户端和服务器将在身份验证过程中就最强的共同点达成一致。
ktpass -out c:\Users\Administrator\kerberos500.keytab -princ HTTP/nickis.life@NICKIS.LIFE -mapUser kerberos500 -mapOp set -pass XXXXpasswordforkerberos500userXXXX -crypto ALL -pType KRB5_NT_PRINCIPAL
然后用新的替换旧的keytab。有关密钥表的其他深入信息,您可以在此处阅读我关于如何创建 Kerberos 密钥表的技术文章:Kerberos Keytabs – Explained。我经常根据我在这个论坛上看到的问题返回并编辑它。
顺便说一句,HTTP/kerberos500.nickis.life 是服务主体,而不是您在问题中所写的用户主体。我只使用网络浏览器在这种 HTTP 场景中测试 Kerberos,我不使用 cURL.
我敢肯定,如果您认真完成我上面强调的所有四点,您将解决这个问题。
EDIT1: 此答案假设您在具有 kerberos500.nickis.life 完全限定域名的主机上有一个 HTTP 服务 运行ning。如果你没有这样一个名字的主机,我的答案会略有改变。如果有的话请告诉我。
EDIT2: 要使用 http://nickis.life:8080 的 URL 实现 objective 身份验证,那么您可以继续使用相同的密钥表你已经创建了。
在 AD 帐户 NICKIS\kerberos500 上,转到“帐户”选项卡,滚动到底部,然后选中 "Use Kerberos DES encryption types for this account" 的框。
然后通过组策略在 AD 域级别启用 DES 加密本身。为此,请执行以下操作:
- 打开组策略管理控制台 (GPMC)。
- 编辑默认域策略 GPO。 (创建一个新的域级 GPO 并对其进行编辑更安全,但这取决于您)。
- 导航到计算机配置 > 策略 > Windows 设置 > 安全设置 > 本地策略 > 安全选项 > “网络安全:配置 Kerberos 允许的加密类型”并选中 DES_CBC_MD5 的两个复选框和 DES_CBC_MD5。重要提示:在同一个组策略中,还要确保还选中了 RC4、AES128 和 AES256 的复选框。这些加密类型不会用于您网站的票证,但它们将用于域中的所有其他内容。确定,您已退出对话框并关闭 GPMC。
- 运行 DC 服务器和客户端上的 'gpupdate /force' 命令。
- 运行 'klist purge' 在客户端清除所有 Kerberos 票证。
- 在网络浏览器中,清除缓存并删除所有 cookie。
- 确保 DC 服务器允许端口 8080 TCP 入站。
- 再试一次。
参考:Windows Configurations for Kerberos Supported Encryption Type
编辑 3:避免在 same 机器上 运行ning Kerberos KDC(DC)、客户端和服务器。这是获得 "Defective token error" 的经典方法,即使您已正确完成所有其他操作。
编辑 4:(由 OP 验证的最终更新):查看新的 ktpass keytab 创建输出,我看到了这个:目标域控制器:WIN-OVV6VHBGIB8.fusionis.life。现在,密钥表中定义的 SPN 是 HTTP/kerberos500.nickis.life。 AD 域名与您定义的 SPN 不同,因此除非您在这些域之间建立某种信任设置,否则这不会起作用。如果您没有信任,则需要使用 HTTP/kerberos500.fusionis.life 的 SPN。