在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.
现在,您将拥有一个密钥表文件:
c:\Users\Administrator\kerberos500.keytab
和一个用户主体:
HTTP/kerberos500.nickis.life@NICKIS.LIFE
这是提供给GSSApi以获得Kerberos单点登录所需的2个输入。
因此,我将这些输入部署到了Hadoop安全模块中Web容器的kerberos安全领域。
卷毛测试 我尝试使用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:?]
我很沮丧。注意:我在这里和那里发现了几个链接,但是它们没有像我在这里总结的那样在所遵循的步骤中包含所有内容,并且提供的任何解决方案都不适合我。
A
记录。谁能找到我在这里搞砸的东西?
更新:
fusionis.life
的AD服务器,而AD服务器是WIN-OVV6VHBGIB8.fusionis.life
DESKTOP-VTPBE99.fusionis.life
dnsmgmt.msc
并添加了一个带有“ kerberos500.nickis.life”的“ Forward Lookup Zone”,并将主机设置为IP地址DESKTOP-VTPBE99.fusionis.life
。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
错误“ 检测到有缺陷的令牌 ”很可能意味着 检测到 了ntlm令牌。如果kerberos失败,这就是协商机制在流行的Web浏览器中使用的-
否则Web服务器未指示。在窗户上操作系统,它上面的IE
Web浏览器(和Firefox,如果配置正确)基本上说,如果您不使用Kerberos,我将向您发送一个NTLM令牌。服务器回复“没有办法”,我什至都不知道NTLM,所以我称您发送给我的内容有缺陷。由于您似乎是第一次进行此设置,因此当Kerberos失败时,您可能未配置任何后备机制(例如NTLM),因此该错误消息。我们通过了解Kerberos为什么会失败来解决此问题。我想我在两个地方看到了您的问题失败的原因,这与SPN和受信任的站点有关。即使您解决了这两项,也存在与加密有关的第三个原因和第四个原因,为什么它可能继续失败。
如何正确重新生成密钥表:每当您计划制作与该用户帐户关联的密钥表时,均不应运行setspn
-a命令将SPN添加到AD用户。原因是因为keytab创建命令将SPN作为命令的一部分添加到了用户帐户中。如果遵循我的上述建议后您的方案仍然无法使用,则需要通过setpn
-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
然后用新的密钥表替换新的密钥表。有关密钥表的其他深入信息,您可以从我的技术文章中阅读有关如何创建Kerberos密钥表的更多信息:
Kerberos密钥表–解释。我经常根据在此论坛上看到的问题返回并对其进行编辑。
顺便说一句, HTTP / kerberos500.nickis.life
是服务主体,而不是您在问题中所写的用户主体。我只使用Web浏览器在这种HTTP场景中测试Kerberos,而不使用cURL。
如果您认真地完成了我上面强调的所有四点,那么我很肯定,您将解决此问题。
编辑1:
此答案假定您在具有完全限定域名kerberos500.nickis.life的主机上运行HTTP服务。如果您没有使用该名称的主机,我的回答将略有变化。请让我知道。
EDIT2:
要使用http://nickis.life:8080的URL达到身份验证的目的,则可以继续使用已经创建的相同密钥表。
在AD帐户NICKIS \ kerberos500上,转到“帐户”选项卡,滚动到底部,然后选中“为此帐户使用Kerberos DES加密类型”框。
然后,通过组策略在AD域级别启用DES加密本身。为此,请执行以下操作:
参考:Kerberos支持的加密类型的Windows配置
编辑3:避免在同一台计算机上运行Kerberos
KDC(DC),客户端和服务器。这是获得“缺陷令牌错误”的经典方法,即使您已正确完成所有其他操作。
编辑4 :(经过OP验证的最终更新):查看了新的ktpass keytab创建输出,并且我看到了:定向域控制器:WIN-
OVV6VHBGIB8.fusionis.life。现在,密钥表中定义的SPN是HTTP /
kerberos500.nickis.life。AD域名与您定义的SPN不同,因此除非您在这些域之间建立了某种信任关系,否则它将无法正常工作。如果没有信任关系,则需要使用HTTP
/ kerberos500.fusionis.life的SPN。
致命:“https://github.com/scuzzlebuzzle/ol3-1.git/'”身份验证失败
我有一个.NETWCF客户端与Java服务器组件进行对话。服务器端身份验证通过配置为反向代理的中间Apache服务器完成。 NET客户端的配置如下: Apache配置为需要Kerveros身份验证: 如果我在Windows 7上启动我的应用程序,一切都按预期工作:. NET客户端使用Kerberos,Apache验证客户端,我可以使用Spring Security性访问客户端凭据。 如果我在Win
我正在尝试使与和一起工作。我试着按照spring-boot-sample-secure和spring-boot-sample-web-secure中的指南去做,但是我没有让它起作用。 我正在尝试构建一个没有任何ui交互的REST应用程序。因此,我发现这两个样品都不完全适合我的目的。目前我的解决方案是使用AOP。 解决方案对我有效。然而,我想知道这是否是一个好的解决方案。我很好奇是否有更好的解决办法
我想使用我的GitLab帐户中的私有令牌克隆GitLab存储库,而不提示输入我的自动化脚本。 有人能给我一个样品吗? 我知道我可以使用用户和密码执行此操作: 我知道使用ssh密钥是可能的 但是,这两种选择都是不够的。
它似乎使用了“GoogleWebAuthorizationBroker.AuthorizeAsync”,但我不确定如何将该方法与刷新令牌一起使用,而不是在本例中提供给它的客户端机密。
我的环境设置(AWS EKS)的方式是,在我的中,用户有一个exec配置来调用。 这样,当运行时,它将请求令牌对Kubernetes集群进行身份验证。 我目前正在编写一个将与Kubernetes API交互的客户端应用程序。这是用Python编写的,使用的是官方的Python客户端。 在执行任何示例时,我得到的错误是不允许执行某个操作(例如,列表pods)。我认为问题的根源在于我需要将中的令牌传递