KB5050009更新后Kerberos认证AcceptSecurityContext报错SEC_E_LOGON_DENIED求助
解决KB5050009更新后Kerberos认证SEC_E_LOGON_DENIED问题
问题背景
Windows 11安装KB5050009更新后,Kerberos服务端以域用户ServiceUser@MyCompany.com运行时,AcceptSecurityContext函数返回SEC_E_LOGON_DENIED(0x8009030C),但服务端以SYSTEM账号启动时认证正常,卸载该更新可恢复功能。客户端代码运行无异常,SPN配置正确,KDC为最新版本Samba。
解决方案步骤
1. 检查服务账号的Kerberos权限配置
KB5050009可能收紧了Kerberos票据验证的权限要求,需确认服务账号的AD属性:
- 打开AD用户和计算机,找到
ServiceUser账号,进入「账户」选项卡,确认Kerberos AES 128位加密、Kerberos AES 256位加密已勾选(需KDC支持对应加密类型)。 - 若涉及委派场景,进入「委派」选项卡,确保配置了正确的SPN委派权限,测试环境可临时启用「信任此用户委派到任何服务(仅Kerberos)」验证。
2. 显式指定服务账号凭证
原服务端代码中AcquireCredentialsHandleA的第一个参数为nullptr,尝试显式指定服务账号的UPN,确保凭证句柄明确关联目标账号:
CredHandle credentials{}; TimeStamp lifetime{}; std::array<char,9>package={"kerberos"}; // 显式传入服务账号UPN,替换原nullptr const char* serviceUserUpn = "ServiceUser@MyCompany.com"; AcquireCredentialsHandleA(serviceUserUpn, package.data(), SECPKG_CRED_INBOUND, nullptr, nullptr, nullptr, nullptr, &credentials, &lifetime); SecHandle securityContext{}; ULONG attribs=0; auto res=AcceptSecurityContext(&credentials,nullptr,&inBufferArray,attribs, SECURITY_NATIVE_DREP,&securityContext,&outBufferArray,&attribs,nullptr);
3. 验证Kerberos加密类型兼容性
KB5050009可能禁用了RC4等弱加密类型,需确保KDC和服务端使用兼容的强加密:
- 检查Samba的
smb.conf配置,确保kerberos method = secrets and keytab,且keytab文件包含AES类型密钥。 - 在服务端使用
klist命令查看当前票据,确认获取到AES加密的票据,而非RC4。
4. 启用Kerberos日志排查细节
通过Windows事件日志获取更详细的失败原因:
- 打开事件查看器,导航到「应用程序和服务日志」→「Microsoft」→「Windows」→「Kerberos-Key-Distribution-Center」,启用日志。
- 重新触发认证失败,查看事件日志中的具体错误信息(如加密类型不匹配、权限不足等)。
5. 临时注册表调整(测试用)
若上述方法无效,可临时回退Kerberos的加密限制(仅用于测试,不建议长期使用):
- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters。 - 添加DWORD值
AllowWeakCrypto,设置为1(允许弱加密类型)。 - 重启机器后验证认证是否恢复。
内容的提问来源于stack exchange,提问作者Arnaud
相关产品推荐
相关产品推荐

