我已在 debian wheezy 上成功安装了 Kerberos,并且可以使用 kinit 中的 Kerberos 票证执行服务身份验证(Apache、ssh)。
我想使用 kinit (pkinit) 证书而不是密码。
我已按照描述的步骤进行操作这里。
我正在尝试使用此命令进行身份验证:
kinit -C FILE:client.pem,client.key [email protected]
返回密码不正确。
我很确定问题来自服务器而不是客户端。从wireshark,客户端在使用pkinit 时发送其证书。由于 kdc 未提供 AS-REP,因此客户端可能会收到“密码不正确”的通用错误消息,这意味着它无法破译其票证(因为没有任何票证被输入)。
我最终得到了该服务器 /etc/krb5.conf 配置:
[realms]
MAYTACAPAC.INC = {
kdc = kerberos.maytacapac.inc
admin_server = kerberos.maytacapac.inc
default_domain = maytacapac.inc
detabase_module = openldap_ldapconf
kdc_tcp_ports = 88
allow_pkinit = yes
pkinit_identity = FILE:/root/pkinit/kdc.pem,/root/pkinit_wiki/kdc.key
pkinit_anchors = FILE:/root/pkinit/ca.pem
module = pkinit:/usr/lib/x86_64-linux-gnu/krb5/plugins/preauth/pkinit.so
}
然后我启动 krb5-kdc 服务,日志文件中有以下消息:
# systemctl -l status krb5-kdc
● krb5-kdc.service - Kerberos 5 Key Distribution Center
Loaded: loaded (/lib/systemd/system/krb5-kdc.service; enabled)
Drop-In: /lib/systemd/system/krb5-kdc.service.d
└─slapd-before-kdc.conf
Active: active (running) since Fri 2016-04-29 14:59:57 CEST; 1min 3s ago
Process: 1042 ExecStart=/usr/sbin/krb5kdc -P /var/run/krb5-kdc.pid $DAEMON_ARGS (code=exited, status=0/SUCCESS)
Main PID: 1043 (krb5kdc)
CGroup: /system.slice/krb5-kdc.service
└─1043 /usr/sbin/krb5kdc -P /var/run/krb5-kdc.pid
Apr 29 14:59:57 kerberos krb5kdc[1042]: preauth pkinit failed to initialize: No realms configured correctly for pkinit support
Apr 29 14:59:57 kerberos krb5kdc[1042]: setting up network...
Apr 29 14:59:57 kerberos krb5kdc[1042]: listening on fd 8: udp 0.0.0.0.88 (pktinfo)
Apr 29 14:59:57 kerberos krb5kdc[1043]: commencing operation
这说明这一边有问题。
我用谷歌搜索了这个错误一段时间,但没有成功。 kinit 对于密码验证仍然可以正常工作。
更新
我已将证书放在默认目录 /var/lib/krb5kdc 中。当我重新启动服务器时,所描述的错误将从日志中消失。
但是,现在,当我尝试从客户端的服务器获取 TGT 时出现错误。我在服务器日志中得到:
preauth (pkinit) verify failure: Key parameter not accepted
我在客户端收到此错误消息:
kinit: krb5_get_init_creds: PREAUTH_FAILED
Wireshark 向我显示此错误作为 as-req 的回复:
KDC_ERR_KEY_TOO_WEAK
我在客户端 /etc/krb5.conf 中设置了 pkinit_dh_min_bits = 1024。现在正在工作,我得到了我的票 \o/
但是,我更喜欢使用至少 2048 位长的密钥进行 dh 交换,但现在不能(出现相同的最后一个错误)。
看起来客户端想要使用 1024 位 dh 参数,然后服务器拒绝并关闭连接。我不知道如何强制客户端提供 >=2048 位 dh 参数,因为客户端 /etc/krb5.conf 中的 pkinit_dh_min_bits = 2048 没有任何效果。