![创建密钥表和服务主体名称](https://linux22.com/image/494960/%E5%88%9B%E5%BB%BA%E5%AF%86%E9%92%A5%E8%A1%A8%E5%92%8C%E6%9C%8D%E5%8A%A1%E4%B8%BB%E4%BD%93%E5%90%8D%E7%A7%B0.png)
我正在尝试为 Java 服务器设置一个密钥表,以支持 Windows 网络上的 Kerberos 身份验证。我甚至在命令行工具级别上也很难让它工作,甚至还没有完成服务器设置!我现在的计划是尝试让它在我的开发电脑上运行,因为我有开发工作和调试要做。所以我的目标是让 Java 服务器在我的电脑上运行,并让客户端在同一台机器上运行并连接到它。
这是我到目前为止所做的事情,我真的是笨手笨脚地做着,所以我可能会做各种错误的事情!
创建服务主体名称
我让我们的一位域管理员运行了这个命令:
setspn -A TEST/pc-name.mydomain.com my-user-name
这似乎已成功完成,我可以使用以下方法成功列出此 SPN
setspn -L my-user-name
创建了 keytab 文件
我使用以下命令创建了一个密钥表:
ktpass /princ TEST/[email protected] /pass <my-password> /ptype KRB5_NT_SRV_HST /out <keytab-filename>
这似乎成功创建了一个 keytab,尽管它确实警告 ptype 和帐户类型不匹配(但无论我为 ptype 选择什么,我都会收到相同的警告)。如果我运行此命令:
klist -k file:/<keytab-filename>
然后它列出了我期望的 SPN,即 TEST/[电子邮件保护]
问题!
现在我想检查 keytab 是否适用于此 SPN,因此我运行
kinit -t <keytab-filename> TEST/[email protected]
然后我收到一个错误“krb_error 6 客户端未在 Kerberos 数据库中找到”。
我究竟做错了什么?
答案1
我不太确定 my-user-name 是指计算机对象还是 Active Directory 中的用户对象;我假设它是用户对象。在这种情况下,我认为 setspn 不合适;这是为了修改现有机器帐户的 SPN。对于用户帐户,我怀疑 SRV_HST 是否正确。
显然,对与用户对象关联的 SPN 的支持有些有限;我读到过某处说这实际上仅限于一个用户。我也无法让您的 ktpass 调用为我工作,因为它坚持 a) 指定应与 SPN 关联的用户帐户(通过 mapuser),以及 b) 设置 SPN 密码。我认为后者是通过 ktpass 创建密钥表不可避免的。
我设法以“标准方式”创建了一个密钥表,即通过设置专用的用户帐户并将其与 SPN 关联:
ktpass /princ TEST/host@DOMAIN /mapuser user@DOMAIN /pass * /out foo.keytab /ptype KRB5_NT_PRINCIPAL
该操作(预期)导致用户登录失败,但是我随后能够使用 kinit
kinit -k -t /tmp/foo.keytab TEST/host@DOMAIN