WebLogic 12c Kerberos SSO:HTTPS直接访问时浏览器不响应WWW-Authenticate
我在WebLogic 12c结合Kerberos搭建SSO的场景中遇到过几乎完全一致的问题,核心矛盾点在于直接访问HTTPS安全页面时,Kerberos的SPNEGO握手流程因请求解析失败被中断,浏览器 fallback 到基础认证;而先访问HTTP页面再跳转HTTPS能正常工作,是因为复用了已建立的Kerberos会话上下文。
核心原因拆解
结合你提供的日志Malformed request "Can not parse URI from http request"和现象来看,主要有以下几个根源:
HTTPS端口对应的SPN配置不匹配
Kerberos的服务主体名称(SPN)是绑定服务实例的,WebLogic不管是HTTP还是HTTPS服务,默认使用HTTP/[主机名]格式的SPN。如果你的HTTPS服务使用了独立主机名、非标准端口,或者SPN未正确注册到运行WebLogic的服务账号下,会导致浏览器发送的Kerberos令牌无法被WebLogic验证,同时触发请求解析错误。WebLogic SSL监听的主机名配置错误
如果WebLogic的SSL监听配置的是IP地址或0.0.0.0,而非完整主机名,浏览器发送的Host头会和SPN中的主机名不匹配。WebLogic在解析请求URI时会因主机名不一致抛出错误,进而中断SPNEGO握手流程,服务器返回的WWW-Authenticate: Negotiate头无法被浏览器正确处理,最终触发基础认证弹窗。安全约束与SPNEGO认证器的关联缺失
你的web.xml中针对HTTPS页面的transport-guarantee设置为CONFIDENTIAL,但如果对应的login-config未指定SPNEGO作为认证方式,或者WebLogic安全域中的SPNEGO认证器未正确关联Kerberos密钥表(keytab),会导致服务器无法处理HTTPS请求的Kerberos认证,直接 fallback 到基础认证。
具体排查与解决步骤
1. 验证SPN注册正确性
在域控制器(AD)上,使用以下命令检查运行WebLogic的服务账号的SPN注册情况:
setspn -L [WebLogic服务账号名]
确保输出中包含与HTTPS服务匹配的SPN:
- 如果HTTPS使用默认443端口:
HTTP/[你的HTTPS主机名] - 如果使用非标准端口:
HTTP/[你的HTTPS主机名]:[端口号]
如果缺失,用setspn -S命令添加:
setspn -S HTTP/secure.yourdomain.com@YOURREALM.COM [服务账号名]
2. 修正WebLogic SSL监听配置
登录WebLogic控制台,进入环境 > 服务器 > [你的SSL服务器] > 监听端口:
- 将
监听地址设置为完整的主机名(与SPN中的主机名一致),不要使用IP或0.0.0.0 - 确保SSL端口的
协议设置为https,并正确关联了SSL证书
3. 检查web.xml的安全配置
确保HTTPS页面的安全约束关联了SPNEGO认证方式:
<security-constraint> <web-resource-collection> <web-resource-name>Secure HTTPS Pages</web-resource-name> <url-pattern>/secure/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>AuthenticatedUsers</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>SPNEGO</auth-method> <realm-name>mySecurityRealm</realm-name> </login-config>
4. 确认SPNEGO认证器配置
在WebLogic控制台的安全领域 > [你的安全域] > 认证提供者:
- 确保SPNEGO认证器已启用,且
服务主体名称设置为HTTP/[主机名]@REALM.COM(与AD中注册的SPN一致) - 检查
密钥表文件名指向正确的keytab文件,且该文件包含对应SPN的密钥(可以用klist -k [keytab文件路径]验证)
5. 浏览器Kerberos信任配置
确保你的HTTPS域名被加入浏览器的本地Intranet区域:
- IE/Edge:Internet选项 > 安全 > 本地Intranet > 站点 > 添加你的HTTPS域名
- Chrome:通过
chrome://settings/content/handlers或组策略配置Kerberos可信站点,确保浏览器自动发送Kerberos令牌
总结
直接访问HTTPS页面失败的核心是Kerberos SPN不匹配+WebLogic请求解析错误,导致SPNEGO握手流程中断,浏览器触发基础认证。先访问HTTP页面时,已建立的Kerberos会话上下文被HTTPS复用,因此可以正常访问。按照上述步骤逐一排查,基本可以解决问题。
内容的提问来源于stack exchange,提问作者Abhishek Yadav

