0

我在 JBoss-5.1.0 上部署了一个 Java EE 应用程序。为了获得额外的安全性,我在 JBoss 前面设置了启用 Apache + 的 ssl。Tomcat 使用(端口 8001 上的 AJP 1.3)与服务器通信。所以我的配置看起来像:

tomcat:443 (ssl) ---|--- Jboss:8080 (IpAddress:8080) (http)

这种配置似乎适用于除 flex 部分之外的所有静态和动态页面。当我尝试访问 flex 部分的任何内容时,我的问题就开始了。AMF 通道失败,我可以在服务器日志中看到以下堆栈跟踪:

2012-04-13 16:19:50,940 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/catissuecore].[MessageBrokerServlet]] (ajp-127.0.0.1-8009- 4) Servlet MessageBrokerServlet 的 Servlet.service() 抛出异常 flex.messaging.security.SecurityException:必须通过安全协议联系安全端点“/messagebroker/amfsecure”。 在 flex.messaging.endpoints.AbstractEndpoint.validateRequestProtocol(AbstractEndpoint.java:862) 在 flex.messaging.endpoints.AbstractEndpoint.service(AbstractEndpoint.java:630) 在 flex.messaging.endpoints.AMFEndpoint.service(AMFEndpoint.java:99 ) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 在 org.apache.catalina.core .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235) 在 org.apache.catalina.core.StandardContextValve 的 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) .invoke(StandardContextValve.java:191) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92 ) 在 org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) 在 org.apache.catalina 的 org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)。 core.StandardHostValve.invoke(StandardHostValve.java:127) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) 在 org.apache.catalina .core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 在 org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:436 ) 在 org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 在 java.lang。线程.run(线程.java:662)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 调用(CachedConnectionValve.java:158) .coyote.ajp.AjpProcessor.process(AjpProcessor.java:436) 在 org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker .run(JIoEndpoint.java:447) 在 java.lang.Thread.run(Thread.java:662)在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 调用(CachedConnectionValve.java:158) .coyote.ajp.AjpProcessor.process(AjpProcessor.java:436) 在 org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384) 在 org.apache.tomcat.util.net.JIoEndpoint$Worker .run(JIoEndpoint.java:447) 在 java.lang.Thread.run(Thread.java:662)ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java: 662)ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:384) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java: 662)

我在 remote-config.xml 中定义了以下通道:

 <default-channels>
    <channel ref="my-amf"/>
     <channel ref="my-secure-amf"/>
 </default-channels>

我的 services-config.xml 具有以下配置

 <channels>
    <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
        <endpoint uri="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties>
            <polling-enabled>false</polling-enabled>
        </properties>
    </channel-definition>

    <channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">
        <endpoint uri="https://{server.name}:{server.port}/{context.root}/messagebroker/amfsecure" class="flex.messaging.endpoints.SecureAMFEndpoint"/>
        <properties>
            <!--HTTPS requests on some browsers do not work when pragma "no-cache" are set-->
            <add-no-cache-headers>false</add-no-cache-headers>
        </properties>
    </channel-definition>

有没有人面临这个问题?

任何指针都会很有用。

4

2 回答 2

1

尽管解决方案在另一个答案中,但并不明显。如果 SSL 在负载均衡器或 Apache 中终止,则应按secure-amf如下方式切换通道定义类:

<channel-definition id="my-secure-amf" class="mx.messaging.channels.AMFChannel">

<channel-definition id="my-secure-amf" class="mx.messaging.channels.SecureAMFChannel">

来源:http: //blogs.adobe.com/kmossman/2010/02/lcds_with_ssl_termination_with.html

于 2013-01-31T23:42:39.610 回答
0

在我的情况下,我只允许 HTTPS 流量,并且所有这些 HTTPS 流量都被允许通过启用 ssl 的 Apache 服务器进行路由。我还有一个负载均衡器,它与 Apache 发送 HTTP 请求而不是 HTTPS 请求进行对话,这是问题的根本原因。我更改了负载均衡器的设置,它工作正常。

例外:必须通过安全协议联系安全端点“/messagebroker/amfsecure”。

  1. 此异常本身表示您正在尝试通过不安全协议连接到 flex 客户端到安全端点。
  2. 安全端点从客户端接收消息/请求并对其进行解码,然后将它们发送到 MessageBroker 以路由到服务。所以这里的请求没有加密,安全端点会抛出异常,因为在解码请求时假定是加密的。

有两种解决方案:

  • 找出不安全请求被发送到安全端点的原因。并尝试解决此问题。为此,您可能需要监控所有发送和接收的请求。
  • 打开 services-config.xml 文件并将 flex 安全通道的端点类名更改为“flex.messaging.endpoints.AMFEndpoint”。通过更改此设置,您将告诉 flex 客户端通过不安全的端点处理所有请求。如果您不关心您的配置并且只想运行应用程序,请执行此操作。
于 2012-05-03T22:50:21.357 回答