创建密钥表和服务主体名称

use*_*693 7 kerberos spn

我正在尝试为 Java 服务器设置密钥表以支持 Windows 网络上的 Kerberos 身份验证。即使在命令行工具级别,我也很难让它工作,甚至还没有达到服务器设置!我现在的计划是尝试让它在我的开发 PC 上运行,因为我有开发工作和调试要做。所以我的目标是让 Java 服务器在我的 PC 上运行,而客户端在连接到它的同一台机器上运行。

这是我到目前为止所做的,我真的很笨拙,所以我可能会做各种错误的事情!

创建了服务主体名称

我让我们的域管理员之一运行此命令:

setspn -A TEST/pc-name.mydomain.com my-user-name
Run Code Online (Sandbox Code Playgroud)

这似乎成功完成,我可以成功列出此 SPN

setspn -L my-user-name
Run Code Online (Sandbox Code Playgroud)

创建了一个密钥表文件

我用这个命令创建了一个密钥表:

ktpass /princ TEST/pc-name.mydomain.com@MYDOMAIN.COM /pass <my-password> /ptype KRB5_NT_SRV_HST /out <keytab-filename>
Run Code Online (Sandbox Code Playgroud)

这似乎成功创建了一个密钥表,尽管它确实警告 ptype 和帐户类型不匹配(但无论我为 ptype 选择什么,我都会收到相同的警告)。如果我运行这个命令:

klist -k file:/<keytab-filename>
Run Code Online (Sandbox Code Playgroud)

然后它列出了我期望的 SPN,即 TEST/pc-name.mydomain.com@MYDOMAIN.COM

问题!

现在我想检查密钥表是否适用于此 SPN,所以我正在运行

kinit -t <keytab-filename> TEST/pc-name.mydomain.com@MYDOMAIN.COM
Run Code Online (Sandbox Code Playgroud)

然后我收到错误“krb_error 6 Client not found in Kerberos database”。

我究竟做错了什么?

小智 4

我不太确定 my-user-name 是指计算机对象还是活动目录中的用户对象;我假设它是一个用户对象。在这种情况下,我认为 setspn 是不合适的;这是为了修改现有计算机帐户的 SPN。对于用户帐户,我怀疑 SRV_HST 是否正确。

显然,对与用户对象关联的 SPN 的支持有些有限;我在某处读到这实际上仅限于一个用户。我也无法让您的 ktpass 调用为我工作,因为它坚持 a) 指定应与 SPN 关联的用户帐户(通过 mapuser),以及 b) 设置 SPN 密码。我认为后者是不可避免的,通过ktpass创建keytab。

我设法以“标准方式”创建密钥表,即通过设置专用用户帐户并将其与 SPN 关联:

ktpass /princ TEST/host@DOMAIN /mapuser user@DOMAIN /pass *  /out foo.keytab /ptype KRB5_NT_PRINCIPAL
Run Code Online (Sandbox Code Playgroud)

该操作(预期)破坏了用户的登录,但是,我随后能够使用

 kinit -k -t /tmp/foo.keytab  TEST/host@DOMAIN
Run Code Online (Sandbox Code Playgroud)