使用脚本生成keytab后kinit预认证失败问题求助
解决Kerberos Keytab预认证失败问题
你遇到的Preauthentication failed错误大概率是密钥版本号(kvno)不匹配导致的——你的脚本硬编码了-k 1,但实际AD中用户的kvno在密码修改后会自动递增,用旧的kvno生成的keytab自然无法通过预认证。
下面是具体的修复步骤:
1. 确认当前用户的正确kvno
先执行命令获取用户当前的密钥版本号:
kvno username@SNAPP.NET
输出类似username@SNAPP.NET: kvno = 3,这里的3就是你需要用的kvno。
2. 修改脚本,使用正确的kvno并优化加密算法
把脚本里的硬编码kvno替换为实际值,同时移除可能被AD禁用的过期算法(比如arcfour-hmac-md5-exp),优先使用现代加密算法:
#!/bin/bash user="username" pass="password" realm="SNAPP.NET" # 获取当前有效的kvno kvno=$(kvno "$user@$realm" | awk '{print $2}') printf "%b" "add_entry -password -p $user@$realm -k $kvno -e aes256-cts-hmac-sha1-96 $pass add_entry -password -p $user@$realm -k $kvno -e aes128-cts-hmac-sha1-96 $pass add_entry -password -p $user@$realm -k $kvno -e arcfour-hmac-md5 $pass write_kt $user.keytab" | ktutil
注意:如果密码包含$、!等特殊字符,要用单引号包裹pass变量,比如pass='MyP@ssw0rd!',避免Bash解析特殊字符导致密码错误。
3. 验证生成的keytab
生成keytab后,用以下命令检查条目是否正确:
klist -kte username.keytab
确保输出中的kvno和你之前获取的一致,且包含AD支持的加密算法。
4. 测试kinit认证
最后用keytab测试认证:
kinit -kt username.keytab username@SNAPP.NET
如果没有报错,说明keytab正常可用。
另外,还要检查两点:
- 生成keytab的机器与AD服务器的时间差不能超过5分钟(Kerberos对时间同步要求严格);
- 确保AD用户账户的"预认证"选项是开启状态(默认开启,若关闭也会导致预认证失败,但你手动kinit能成功的话大概率是开启的)。
内容的提问来源于stack exchange,提问作者Nestor
相关产品推荐
相关产品推荐

