带有密码的 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" 选项卡上:

  1. 确保取消选中所有帐户选项(密码永不过期除外)。
  2. 确保 SPN HTTP/TEST。abc.mycompany.com 已分配给帐户。

参考:Administering SPNEGO within WebSphere Application Server: Tips on using Kerberos service principal names

编辑:

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 帐户。

密钥表

  1. 每次更换 keytab 时重新启动 WebSphere 应用程序服务。
  2. 通过运行执行以下命令验证 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:

  1. 从控制面板或 Internet Explorer 的“工具”菜单中选择“Internet 选项”,打开“Internet 选项”对话框。
  2. 在“Internet 选项”对话框的“安全”选项卡上,select 本地 Intranet,然后单击“自定义级别”。
  3. 在“安全设置”对话框的“登录”下,select "Automatic logon only in Intranet zone",然后单击“确定”。
  4. 在本地 Intranet 仍然 select 的“安全设置”选项卡上的“Internet 选项”对话框中,单击“站点”。
  5. 在“本地 Intranet”对话框中,单击“高级”。
  6. 在下一个对话框(也称为本地 Intranet)中,在 "Add this Web site to the zone" 框中键入您网站的 URL(例如,http://test.abc.mycompany.com),然后单击添加.
  7. 在“本地 Intranet”对话框中,框单击“确定”。
  8. 在原来的“本地 Intranet”对话框中,单击“确定”。
  9. 在“高级”选项卡下,确保启用 "Enable Integrated Windows Authentication"(这是默认设置)。
  10. 在“Internet 选项”对话框中,单击“确定”。

参考:Configuring Internet Explorer for Automatic Logon