密码的SPNEGO身份validation问题
我已将我的应用程序配置为通过SPNEGO与Websphere一起使用Kerberos身份validation。
这是细节
的krb5.conf
[libdefaults] default_realm = ABC.MYCOMPANY.COM default_keytab_name = FILE:C:\IBM\WebSphere\AppServer\kerberos\MyServer.keytab default_tkt_enctypes = rc4-hmac des-cbc-md5 default_tgs_enctypes = rc4-hmac des-cbc-md5 forwardable = true renewable = true noaddresses = true clockskew = 300 [realms] ABC.MYCOMPANY.COM = { kdc = TEST.abc.mycompany.com:88 default_domain = mycompany.com } [domain_realm] .mycompany.com = ABC.MYCOMPANY.COM
login.conf的
spnego-client { com.sun.security.auth.module.Krb5LoginModule required; }; spnego-server { com.sun.security.auth.module.Krb5LoginModule required storeKey=true useKeyTab=true keyTab="MyServer.keytab"; };
spnego属性
Spnego properties: spnego.allow.basic=false spnego.allow.localhost=false spnego.allow.unsecure.basic=false spnego.login.client.module=spnego-client spnego.login.server.module=spnego-server spnego.prompt.ntlm=false spnego.allow.delegation=true spnego.logger.level=1
当我访问我的应用程序时,我收到以下错误
Config missing param value for: spnego.preauth.password Stack Trace : java.lang.NullPointerException: Config missing param value for: spnego.preauth.password at net.sourceforge.spnego.SpnegoAuthenticator$1.getInitParameter(SpnegoAuthenticator.java:218) at net.sourceforge.spnego.SpnegoFilterConfig.(SpnegoFilterConfig.java:145) at net.sourceforge.spnego.SpnegoFilterConfig.getInstance(SpnegoFilterConfig.java:316) at net.sourceforge.spnego.SpnegoAuthenticator.(SpnegoAuthenticator.java:206)
用于创建keytab文件的命令
C:\IBM\WebSphere\AppServer\java>ktpass -out c:\temp\MyServer.keytab -princ HTTP/TEST.abc.mycompany.com@ABC.MYCOMPANY.COM -mapUser wasMyServer -mapOp set -pass mypassword -crypto RC4-HMAC-NT -pType KRB5_NT_PRINCIPAL
我没有使用spnego密码,我希望它使用keytab,我不明白为什么抛出错误说param缺失。
虽然您没有使用Active-Directory标记您的问题,但您必须运行它,因为您尝试使用RC4-HMAC-NT,它曾经是Microsoft Active Directory的主要加密算法。 我曾经说过,因为从Windows Server 2008 R2开始,AES26-SHA1成为默认的加密算法。 也就是说,Active Directory帐户wasMyServer需要配置为符合Kerberos协议。 根据WebSphere安装说明,它应该是用户帐户,而不是计算机帐户,并且可以灵活地在应用程序服务器上正确运行Kerberized服务。 也就是说,在用户帐户“wasMyServer”的“帐户”标签上:
- 确保未选中所有帐户选项(密码永不过期)。
- 确保已将 SPN HTTP / TEST.abc.mycompany.com分配给该帐户。
参考: 在WebSphere Application Server中管理SPNEGO:有关使用Kerberos服务主体名称的提示
EDITS:
的krb5.conf
你的krb5.conf里面似乎有问题。 您只有这两行显示为支持RC4-HMAC:
default_tkt_enctypes = rc4-hmac des-cbc-md5 default_tgs_enctypes = rc4-hmac des-cbc-md5
要完全启用RC4-HMAC加密类型,请在下方添加其他行:
permitted_enctypes = rc4-hmac des-cbc-md5
(作为旁注,没有人再使用des-cbc-md5加密类型了,但我把它留在了那里)
DNS域名需要在整个文件中保持一致。 为简单起见,DNS域名和Kerberos域名称应匹配(除了在UPPER情况下指定的Kerberos域名称)。 它们不必匹配,但是当它们不匹配时,它会使故障排除更难。
既然您澄清了您的AD域名是abc.mycompany.com
,我建议使用krb5.conf文件,如下所示:
[libdefaults] default_realm = ABC.MYCOMPANY.COM default_keytab_name = FILE:C:\IBM\WebSphere\AppServer\kerberos\MyServer.keytab default_tkt_enctypes = rc4-hmac des-cbc-md5 default_tgs_enctypes = rc4-hmac des-cbc-md5 permitted_enctypes = rc4-hmac des-cbc-md5 forwardable = true renewable = true noaddresses = true clockskew = 300 [realms] ABC.MYCOMPANY.COM = { kdc = TEST.abc.mycompany.com:88 default_domain = abc.mycompany.com } [domain_realm] .abc.mycompany.com = ABC.MYCOMPANY.COM abc.mycompany.com = ABC.MYCOMPANY.COM
参考: 使用更强加密算法的安全通信
结节
所有SPN在任何给定的Kerberos领域中必须是唯一的。 如果出现重复的SPN,请运行以下命令以查找已注册重复SPN的AD帐户,并从未使用SPN的帐户中删除SPN。 对此的提示是,生成密钥表的AD帐户的SPN是SPN应该注册的唯一位置。 因此,对于这种情况,只有AD帐户wasMyServer应该具有SPN HTTP / TEST.abc.mycompany.com 。 要在目录中查找所有重复的SPN,请在加入AD域的计算机上的Windows命令行管理程序中运行以下命令:
setspn -X
输出将列出所有已注册重复SPN的AD帐户,您可以根据我的指导采取纠正措施。 命令:
setspn -D HTTP/TEST.abc.mycompany.com wasMyServer
…将从AD帐户名称中删除重复的SPN。 或者您也可以在AD用户和计算机GUI中删除它。 每次重新创建密钥表之前,请运行以上命令清理AD帐户。
密钥表
- 每次更换keytab时都要重新启动WebSphere应用程序服务。
- 通过运行以下命令validationWAS服务器上的keytab。 validation从KDC中提取Kerberos票证,因此如果成功,则表示keytab没有任何问题。
kinit -k -t MyServer.keytab HTTP / TEST.abc.mycompany.com
注意:kinit不附带Windows,但它附带Java JRE / JDK,因此您需要将keytab的副本放在存在kinit的同一目录中,否则确保
位于系统PATH中为了成功运行命令。
网页浏览器
确保将Web浏览器配置为自动将Windows凭据(实质上是包含Kerberos服务票证的SPNEGO令牌)发送到应用程序服务器。 为此,请按照以下说明操作。
IE浏览器:
- 通过从“控制面板”或Internet Explorer的“工具”菜单中选择“Internet选项”,打开“Internet选项”对话框。
- 在“Internet选项”对话框的“安全”选项卡上,选择“本地Intranet”,然后单击“自定义级别”。
- 在“安全设置”对话框的“登录”下,选择“仅在Intranet区域中自动登录”,然后单击“确定”。
- 在“安全设置”选项卡上的“Internet选项”对话框中,仍然选中“本地Intranet”,单击“站点”。
- 在“本地Intranet”对话框中,单击“高级”。
- 在下一个对话框(也称为“本地Intranet”)中,在“将该网站添加到区域中”框中键入您的网站的URL(例如, http://test.abc.mycompany.com ),然后单击添加。
- 在“本地Intranet”对话框中,单击“确定”。
- 在原始的“本地Intranet”对话框中,单击“确定”。
- 在“高级”选项卡下,确保启用“启用集成Windows身份validation”(这是默认设置)。
- 在“Internet选项”对话框中,单击“确定”。
参考: 配置Internet Explorer以进行自动登录
- 如何在JBoss中配置SQL Server数据源以使用特定的Active Directory用户进行连接?
- 无法从Java获得与AD的连接
- 安全Java SOAP Web服务 – Active Directory身份validation信任
- 在ssl(ldaps)的支持下连接活动目录
- 将Ldap用户与使用Java的组关联
- 带有Active Directory的JNDI PartialResultException
- 使用JNDI / Java中的当前用户在LDAP上进行身份validation
- 为什么JDK1.8.0u121无法找到kerberos default_tkt_enctypes类型? (KrbException:default_tkt_enctypes没有支持的默认etypes)
- 使用JNDI启用Active Directory帐户