我正在尝试获取一个针对 Active Directory 工作的测试 Kerberos 客户端/服务器对。我在公司网络的备用域中创建了三个用户,“RichardC”、“Server1”和“Server2”。我的服务器用户已映射到不同的服务主体名称,一个使用 KRB5_NT_PRINCIPAL,另一个使用 KRB5_NT_SRV_HOST。
ktpass -out server2.keytab
-princ server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
-mapuser ServerUser2@BENCHMARKING.RDDEV.LOCAL
-pass ThePassword
-crypto All
-pType KRB5_NT_SRV_HOST
-kvno 2
这次我没有使用 +DesOnly 选项,希望在今天的系统中我不需要 DES。在这个问题中,我已将真实域名替换为 mydomain 以避免管理问题。
这给了我一个密钥表。我可以列出它:
KVNO Principal
---- --------------------------------------------------------------------------
2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (DES cbc mode with CRC-32)
2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (DES cbc mode with RSA-MD5)
2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (ArcFour with HMAC/md5)
2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (AES-256 CTS mode with 96-bit SHA-1 HMAC)
2 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL (AES-128 CTS mode with 96-bit SHA-1 HMAC)
我什至可以使用 kinit -k 使用密钥表中的密钥登录 - 所以它似乎工作。
我有我自己的测试程序,并且没有来自http://download.oracle.com/docs/cd/E19683-01/816-1331/sampleprogs-1/index.html的测试程序。在该程序中,在服务器上,我使用两个 keytab 将 GSS_C_NT_HOSTBASED_SERVICE 更改为 GSS_C_NT_USER_NAME 以使其识别名称。我正在运行 Oracle 演示服务器
./gss-server -mech 1.2.840.113554.1.2.2 server2/serbia.mydomain.com
和客户
./gss-client -mech 1.2.840.113554.1.2.2 serbia.mydomain.com server2 "Hello"
结果:
GSS-API error accepting context: Invalid credential was supplied
GSS-API error accepting context: Service key not available
在这种情况下和我自己的测试代码中,错误发生在客户端发送其第一个令牌之后,而服务器正在尝试对其进行解码。
klist 显示授予客户端的密钥。它正在使用 ArcFour,它位于 keytab 中
Default principal: RichardC@BENCHMARKING.RDDEV.LOCAL
Valid starting Expires Service principal
07/25/11 17:36:49 07/26/11 03:35:18 krbtgt/BENCHMARKING.RDDEV.LOCAL@BENCHMARKING.RDDEV.LOCAL
renew until 08/01/11 17:36:49
07/25/11 17:36:03 07/26/11 03:35:18 server2/serbia.mydomain.com@BENCHMARKING.RDDEV.LOCAL
renew until 08/01/11 17:36:03
可以想象,UNIX 机器(塞尔维亚)可能属于另一个领域(我在这里称为 mydomain.com),尽管它似乎没有设置 Kerberos。我正在使用指向 BENCHMARKING.RDDEV.LOCAL 领域的本地 krb5.conf 文件,但如果机器尝试使用带有其主机名的 DNS,它可能会得到错误的答案。我的 krb5.conf 有
[libdefaults]
default_keytab_name = /users/dev/core/richardc/server1.keytab
default_realm = BENCHMARKING.RDDEV.LOCAL
dns_lookup_kdc = false
default_tkt_types = DES-CBC-MD5
[realms]
BENCHMARKING.RDDEV.LOCAL = {
kdc = gbha-dcbench01p.benchmarking.rddev.local
admin_server = gbha-dcbench01p.benchmarking.rddev.local
}
[domain_realm]
benchmarking.rddev.local = BENCHMARKING.RDDEV.LOCAL
.benchmarking.rddev.local = BENCHMARKING.RDDEV.LOCAL
mydomain.com = BENCHMARKING.RDDEV.LOCAL
.mydomain.com = BENCHMARKING.RDDEV.LOCAL
看起来像 default_tkt_types 之类的选项无效。
问题是 - 我该如何解决我的错误?
谢谢 - 理查德