weblogic 域信任问题

探查域信任问题
问题描述
两个 WebLogic Server 域之间的双向通信产生了安全异常。

备注: 在本文中可以找到异常示例。

快速链接
  • 为什么需要在 WLS 域之间建立信任?
  • 如何在 WLS 7.0 和 8.1 域之间建立信任?
  • 如何在 WLS 6.x 和 8.1(或 7.0)域之间建立信任?
  • 什么是两个 WLS 6.x 域之间的缺省信任关系?
  • 什么是 WLS 7.0 和/或 8.0 域之间的缺省信任关系?
  • 什么是 WLS 6.x 和 8.1(或 7.0)域之间的缺省信任关系?
  • 故障排除
  •  
为什么需要在 WLS 域之间建立信任?
在两个 WebLogic Server 域之间双向通信期间,调用方标识(或内核标识)从一个域传播到另一个域。由于在调用域已经验证了主体,因此在第二个域(服务器)中就没有必要再次验证该主体身份。要建立这种关系,必须在两个域之间建立信任。EJB、从一个服务器向另一个服务器的 JMS 调用、servlet run-as 使用或者从一个服务器到另一个服务器的 EJB身份主体的 run-as 的使用,这些都是需要在域之间建立信任的例子。这是对两个域之间的互操作性的要求。如果两个域之间没有事务上下文传播要求,那么就没有必要在域之间建立信任。

返回页首

如何在 WLS 7.0 和 8.1 域之间建立信任?
按如下所述使用 WebLogic Server 管理控制台设置域信任。根据所使用的 WLS 版本,为两个互相通信的域更改域 Credential。请参考:

  • WLS 8.1 - http://e-docs.bea.com/wls/docs81/secmanage/domain.html#1171534
  • WLS 7.0 - http://e-docs.bea.com/wls/docs70/secmanage/domain.html#1171534

在更改域 Credential 后,重新启动管理服务器,然后启动所有托管服务器。

返回页首

如何在 WLS 6.x 和 8.1(或 7.0)域之间建立信任?
目前在 6.x 中无法用 7.0 和 8.1 中设置的方法定义域 Credential。通过设置 7.0 或 8.1 的域 Credential(按上述指定方法)与 6.x 域的 system 用户密码相同,可以在 6.x 和 7.0(或 8.1)之间建立信任。

返回页首

什么是两个 WLS 6.x 域之间的缺省信任关系?


如果 system 用户在两个域中的密码不相同,那么两个 6.x 域就不能相互信任。

返回页首

什么是 WLS 7.0 和/或 8.1 域之间的缺省信任关系?
如果使用缺省设置来启动 7.0 或 8.1 域中的 WebLogic 管理服务器,由于该管理服务器为整个域生成唯一域 Credential,因此两个不同的域就无法相互信任。

返回页首

什么是 WLS 6.x 和 8.1(或 7.0)域之间的缺省信任关系?
由于 8.1(或 7.0)域中的管理服务器生成的唯一域 Credential(随机)与 6.x 中的系统用户密码不匹配,因此它们无法相互信任。

返回页首

故障排除

如果还没有在列出的域之间建立信任,则可能会出现以下问题。

问题 - 在 6.x 和 8.1 域之间

6.x 服务器
rmi server: 'weblogic.rmi.cluster.ReplicaAwareServerRef@9 - jvmid: '-3417175156
082478004S:10.40.4.32:[8001,8001,8002,8002,8001,8002,-1]:mydomain:myserver', oid
: '9', implementation: 'weblogic.jndi.internal.RootNamingNode@98540''
java.lang.SecurityException: Authentication for user system denied in realm wl_realm
at weblogic.security.acl.Realm.authenticate(Realm.java:212)
at weblogic.security.acl.Realm.getAuthenticatedName(Realm.java:233)
at weblogic.security.acl.internal.Security.authenticate(Security.java:171)
at weblogic.security.acl.internal.Security.verify(Security.java:95)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:292)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:22)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:140)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:121)

8.1 服务器
java.lang.SecurityException: Authentication for user system denied in realm wl_realm

Start server side stack trace:
java.lang.SecurityException: Authentication for user system denied in realm wl_realm
at weblogic.security.acl.Realm.authenticate(Realm.java:212)
at weblogic.security.acl.Realm.getAuthenticatedName(Realm.java:233)
at weblogic.security.acl.internal.Security.authenticate(Security.java:171)
at weblogic.security.acl.internal.Security.verify(Security.java:95)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:292)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:22)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:140)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:121)
End server side stack trace

at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)
at weblogic.jndi.internal.ServerNamingNode_811_WLStub.lookup(Unknown Source)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:338)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:333)
at weblogic.management.ManagedServerLocator.discoverManagedServer(ManagedServerLocator.java:219)
at weblogic.management.ManagedServerLocator.discoverAllKnownServers(ManagedServerLocator.java:130)
at weblogic.management.AdminServerAdmin.discoverManagedServers(AdminServerAdmin.java:527)
at weblogic.management.AdminServerAdmin.finishPostListen(AdminServerAdmin.java:473)
at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:1041)
at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:359)
at weblogic.Server.main(Server.java:32)

解决办法
确保 8.1 服务器的域 Credential 与 6.1 服务器中的系统用户密码相同。

问题 - 在 8.1 域之间

客户端(执行查找的服务器)
java.lang.SecurityException: [Security:090398]Invalid Subject: principals=[weblogic, Administrators]
at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:284)
at weblogic.rmi.cluster.ReplicaAwareRemoteRef.invoke(ReplicaAwareRemoteRef.java:244)
at weblogic.jndi.internal.ServerNamingNode_812_WLStub.lookup(Unknown Source)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:343)
at weblogic.jndi.internal.WLContextImpl.lookup(WLContextImpl.java:336)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at bea.SourceServlet.m1(SourceServlet.java:50)
at bea.SourceServlet.doGet(SourceServlet.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:971)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:400)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6350)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3635)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2585)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

服务器端
java.lang.SecurityException: [Security:090398]Invalid Subject: principals=[weblogic, Administrators].
java.lang.SecurityException: [Security:090398]Invalid Subject: principals=[weblogic, Administrators]
at weblogic.security.service.SecurityServiceManager.seal(SecurityServiceManager.java:682)
at weblogic.rjvm.MsgAbbrevInputStream.getSubject(MsgAbbrevInputStream.java:182)
at weblogic.rmi.internal.BasicServerRef.acceptRequest(BasicServerRef.java:825)
at weblogic.rmi.internal.BasicServerRef.dispatch(BasicServerRef.java:300)
at weblogic.rjvm.RJVMImpl.dispatchRequest(RJVMImpl.java:923)
at weblogic.rjvm.RJVMImpl.dispatch(RJVMImpl.java:844)
at weblogic.rjvm.ConnectionManagerServer.handleRJVM(ConnectionManagerServer.java:222)
at weblogic.rjvm.ConnectionManager.dispatch(ConnectionManager.java:794)
at weblogic.rjvm.t3.T3JVMConnection.dispatch(T3JVMConnection.java:570)
at weblogic.socket.NTSocketMuxer.processSockets(NTSocketMuxer.java:105)
at weblogic.socket.SocketReaderRequest.execute(SocketReaderRequest.java:32)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

解决办法


确保两个 8.1 域的域 Credential 相同。
问题 - 在查找托管服务器过程中出错
管理服务器
Mar 31, 2004 4:41:56 PM EST> at weblogic.rjvm.BasicOutboundRequest.sendReceive(BasicOutboundRequest.java:108)
at weblogic.rmi.internal.BasicRemoteRef.invoke(BasicRemoteRef.java:138)
at weblogic.management.internal.RemoteMBeanServerImpl_812_WLStub.invoke(Unknown Source)
at weblogic.management.internal.MBeanProxy.invoke(MBeanProxy.java:946)
at weblogic.management.internal.MBeanProxy.invokeForCachingStub(MBeanProxy.java:481)
at weblogic.management.runtime.ServerRuntimeMBean_Stub.reconnectToAdminServer(ServerRuntimeMBean_Stub.java:1359)
at weblogic.management.ManagedServerLocator.discoverManagedServer(ManagedServerLocator.java:260)
at weblogic.management.ManagedServerLocator.discoverAllKnownServers(ManagedServerLocator.java:130)
at weblogic.management.AdminServerAdmin.discoverManagedServers(AdminServerAdmin.java:527)
at weblogic.management.AdminServerAdmin.finishPostListen(AdminServerAdmin.java:473)
at weblogic.t3.srvr.T3Srvr.resume(T3Srvr.java:1041)
at weblogic.t3.srvr.T3Srvr.run(T3Srvr.java:359)
at weblogic.Server.main(Server.java:32)
Caused by: weblogic.management.NoAccessRuntimeException: Access not allowed for
subject: principals=[], on ResourceType: ServerRuntime Action: execute, Target:
reconnectToAdminServer

托管服务器

[Ljava.lang.Object;[Ljava.lang.String;)
weblogic.management.NoAccessRuntimeException: Access not allowed for subject: principals=[], on ResourceType: ServerRuntime Action: execute, Target: reconnectToAdminServer.
weblogic.management.NoAccessRuntimeException: Access not allowed for subject: pr
incipals=[], on ResourceType: ServerRuntime Action: execute, Target: reconnectToAdminServer
at weblogic.management.internal.SecurityHelper$IsAccessAllowedPrivilegeAction.wlsRun(SecurityHelper.java:564)
at weblogic.management.internal.SecurityHelper$IsAccessAllowedPrivilegeAction.run(SecurityHelper.java:456)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.management.internal.SecurityHelper.isAccessAllowed(SecurityHelper.java:350)
at weblogic.management.internal.RemoteMBeanServerImpl.private_invoke(RemoteMBeanServerImpl.java:946)
at weblogic.management.internal.RemoteMBeanServerImpl.invoke(RemoteMBeanServerImpl.java:908)
at weblogic.management.internal.RemoteMBeanServerImpl_WLSkel.invoke(Unknown Source)
at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:477)
at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:420)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:353)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:144)
at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:415)
at weblogic.rmi.internal.BasicExecuteRequest.execute(BasicExecuteRequest.java:30)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)

解决办法


如果使用管理控制台更改域 Credential,然后没有关闭托管服务器就重新启动管理服务器,则将会发生此问题。因为托管服务器没有重新启动,它还在内存中保留已缓存的旧域 Credential,所以该 Credential 与管理服务器的域 Credential(新 Credential)不匹配。

在更改域 Credential 时,按顺序依次关闭托管服务器和管理服务器。在关闭托管服务器后,先启动管理服务器然后启动托管服务器。



返回页首

是否需要更多帮助?
如果您已经理解这个模式,但仍需要其它帮助,您可以:
  1. http://support.bea.com/ 上查询 AskBEA(例如使用“domain trust”),以查找其它已发布的解决方案。
  2. http://support.bea.com/ 上,向 BEA 的某个新闻组中提出更详细具体的问题。
如果这还不能解决您的问题,并且您拥有有效的技术支持合同,您可以通过登录以下网站来打开支持案例:http://support.bea.com/

反馈

请给我们提供您的意见,说明此支持诊断模式“探查域信任问题”一文是否有所帮助,您需要的任何解释,以及对支持诊断模式的新主题的任何要求。


免责声明:

依据 BEA 与您签署的维护和支持协议条款,BEA Systems, Inc. 在本网站上提供技术技巧和修补程序供您使用。虽然您可以将这些信息和代码与您获得 BEA 授权的软件一起使用,但 BEA 并不对所提供的技术技巧和修补程序做任何形式的担保,无论是明确的还是隐含的。

本文档中引用的任何商标是其各自所有者的财产。有关完整的商标信息,请参考您的产品手册。


返回页首
 
 

你可能感兴趣的:(weblogic 域信任问题)