带有密码的 SPNEGO 身份验证问题
SPNEGO authentication issue with password
我已将我的应用程序配置为通过 SPNEGO 和 Websphere 使用 Kerberos 身份验证。
这里是详细信息
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.getInitParameter(SpnegoAuthenticator.java:218) at net.sourceforge.spnego.SpnegoFilterConfig.<init>(SpnegoFilterConfig.java:145) at net.sourceforge.spnego.SpnegoFilterConfig.getInstance(SpnegoFilterConfig.java:316) at net.sourceforge.spnego.SpnegoAuthenticator.<init>(SpnegoAuthenticator.java:206)
创建密钥表文件的命令
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,我不明白为什么它会抛出错误提示缺少参数。
虽然您没有使用 Active-Directory 标记您的问题,但您必须 运行ning 它,因为您正在尝试使用 RC4-HMAC-NT,它曾经是 Microsoft 的主要加密算法活动目录。我说曾经是,因为从Windows Server 2008 R2开始,AES26-SHA1成为了默认的加密算法。也就是说,Active Directory 帐户 wasMyServer 需要配置为符合 Kerberos 协议。根据 WebSphere 设置说明,它应该是用户帐户,而不是计算机帐户,并使您能够灵活地 运行 应用程序服务器上的 Kerberized 服务。也就是说,在用户帐户“wasMyServer”的 "Account" 选项卡上:
- 确保取消选中所有帐户选项(密码永不过期除外)。
- 确保 SPN HTTP/TEST。abc.mycompany.com 已分配给帐户。
编辑:
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 领域名称应该匹配(除了以大写形式指定的 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
参考:Secure Communications Using Stronger Encryption Algorithms
SPN
所有 SPN 在任何给定的 Kerberos 领域内都必须是唯一的。在重复 SPN 的情况下,运行 下面的命令查找注册了重复 SPN 的 AD 帐户,并从 SPN 为 not 的帐户中删除 SPN正在使用。对此的提示是,用于生成密钥表的 AD 帐户的 SPN 是 only 应该注册 SPN 的地方。因此对于这种情况,只有 AD 帐户 wasMyServer 应该具有 SPN HTTP/TEST.abc.mycompany.com。要在目录中查找所有重复的 SPN,运行 在加入 AD 域的计算机上的 Windows 命令 Shell 中执行以下操作:
setspn -X
输出将列出所有注册了重复 SPN 的 AD 帐户,您可以根据我的指导采取纠正措施。命令:
setspn -D HTTP/TEST.abc.mycompany.com wasMyServer
...将从 AD 帐户名称中删除重复的 SPN。或者您也可以在 AD 用户和计算机 GUI 中删除它。 运行 每次重新创建密钥表之前,上述命令都会清理 AD 帐户。
密钥表
- 每次更换 keytab 时重新启动 WebSphere 应用程序服务。
- 通过运行执行以下命令验证 WAS 服务器上的密钥表。验证从 KDC 中提取 Kerberos 票证,因此如果验证成功,则意味着密钥表没有问题。
kinit -k -t MyServer.keytab HTTP/TEST.abc.mycompany.com
注意:kinit 不随 Windows 一起提供,但它确实随 Java JRE/JDK 一起提供,因此您需要将 keytab 的副本放入同一目录中kinit 存在或以其他方式确保 <JAVA HOME>
在系统路径中,以便 运行 命令成功。
网络浏览器
确保您的 Web 浏览器配置为自动向应用程序服务器发送 Windows 凭据(本质上是包含 Kerberos 服务票证的 SPNEGO 令牌)。为此,请按照以下说明进行操作。
Internet Explorer:
- 从控制面板或 Internet Explorer 的“工具”菜单中选择“Internet 选项”,打开“Internet 选项”对话框。
- 在“Internet 选项”对话框的“安全”选项卡上,select 本地 Intranet,然后单击“自定义级别”。
- 在“安全设置”对话框的“登录”下,select "Automatic logon only in Intranet zone",然后单击“确定”。
- 在本地 Intranet 仍然 select 的“安全设置”选项卡上的“Internet 选项”对话框中,单击“站点”。
- 在“本地 Intranet”对话框中,单击“高级”。
- 在下一个对话框(也称为本地 Intranet)中,在 "Add this Web site to the zone" 框中键入您网站的 URL(例如,http://test.abc.mycompany.com),然后单击添加.
- 在“本地 Intranet”对话框中,框单击“确定”。
- 在原来的“本地 Intranet”对话框中,单击“确定”。
- 在“高级”选项卡下,确保启用 "Enable Integrated Windows Authentication"(这是默认设置)。
- 在“Internet 选项”对话框中,单击“确定”。
我已将我的应用程序配置为通过 SPNEGO 和 Websphere 使用 Kerberos 身份验证。
这里是详细信息
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.getInitParameter(SpnegoAuthenticator.java:218) at net.sourceforge.spnego.SpnegoFilterConfig.<init>(SpnegoFilterConfig.java:145) at net.sourceforge.spnego.SpnegoFilterConfig.getInstance(SpnegoFilterConfig.java:316) at net.sourceforge.spnego.SpnegoAuthenticator.<init>(SpnegoAuthenticator.java:206)
创建密钥表文件的命令
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,我不明白为什么它会抛出错误提示缺少参数。
虽然您没有使用 Active-Directory 标记您的问题,但您必须 运行ning 它,因为您正在尝试使用 RC4-HMAC-NT,它曾经是 Microsoft 的主要加密算法活动目录。我说曾经是,因为从Windows Server 2008 R2开始,AES26-SHA1成为了默认的加密算法。也就是说,Active Directory 帐户 wasMyServer 需要配置为符合 Kerberos 协议。根据 WebSphere 设置说明,它应该是用户帐户,而不是计算机帐户,并使您能够灵活地 运行 应用程序服务器上的 Kerberized 服务。也就是说,在用户帐户“wasMyServer”的 "Account" 选项卡上:
- 确保取消选中所有帐户选项(密码永不过期除外)。
- 确保 SPN HTTP/TEST。abc.mycompany.com 已分配给帐户。
编辑:
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 领域名称应该匹配(除了以大写形式指定的 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
参考:Secure Communications Using Stronger Encryption Algorithms
SPN
所有 SPN 在任何给定的 Kerberos 领域内都必须是唯一的。在重复 SPN 的情况下,运行 下面的命令查找注册了重复 SPN 的 AD 帐户,并从 SPN 为 not 的帐户中删除 SPN正在使用。对此的提示是,用于生成密钥表的 AD 帐户的 SPN 是 only 应该注册 SPN 的地方。因此对于这种情况,只有 AD 帐户 wasMyServer 应该具有 SPN HTTP/TEST.abc.mycompany.com。要在目录中查找所有重复的 SPN,运行 在加入 AD 域的计算机上的 Windows 命令 Shell 中执行以下操作:
setspn -X
输出将列出所有注册了重复 SPN 的 AD 帐户,您可以根据我的指导采取纠正措施。命令:
setspn -D HTTP/TEST.abc.mycompany.com wasMyServer
...将从 AD 帐户名称中删除重复的 SPN。或者您也可以在 AD 用户和计算机 GUI 中删除它。 运行 每次重新创建密钥表之前,上述命令都会清理 AD 帐户。
密钥表
- 每次更换 keytab 时重新启动 WebSphere 应用程序服务。
- 通过运行执行以下命令验证 WAS 服务器上的密钥表。验证从 KDC 中提取 Kerberos 票证,因此如果验证成功,则意味着密钥表没有问题。
kinit -k -t MyServer.keytab HTTP/TEST.abc.mycompany.com
注意:kinit 不随 Windows 一起提供,但它确实随 Java JRE/JDK 一起提供,因此您需要将 keytab 的副本放入同一目录中kinit 存在或以其他方式确保 <JAVA HOME>
在系统路径中,以便 运行 命令成功。
网络浏览器
确保您的 Web 浏览器配置为自动向应用程序服务器发送 Windows 凭据(本质上是包含 Kerberos 服务票证的 SPNEGO 令牌)。为此,请按照以下说明进行操作。
Internet Explorer:
- 从控制面板或 Internet Explorer 的“工具”菜单中选择“Internet 选项”,打开“Internet 选项”对话框。
- 在“Internet 选项”对话框的“安全”选项卡上,select 本地 Intranet,然后单击“自定义级别”。
- 在“安全设置”对话框的“登录”下,select "Automatic logon only in Intranet zone",然后单击“确定”。
- 在本地 Intranet 仍然 select 的“安全设置”选项卡上的“Internet 选项”对话框中,单击“站点”。
- 在“本地 Intranet”对话框中,单击“高级”。
- 在下一个对话框(也称为本地 Intranet)中,在 "Add this Web site to the zone" 框中键入您网站的 URL(例如,http://test.abc.mycompany.com),然后单击添加.
- 在“本地 Intranet”对话框中,框单击“确定”。
- 在原来的“本地 Intranet”对话框中,单击“确定”。
- 在“高级”选项卡下,确保启用 "Enable Integrated Windows Authentication"(这是默认设置)。
- 在“Internet 选项”对话框中,单击“确定”。