ObjectMessage

特性 > 消息特性 > ObjectMessage

虽然 ObjectMessage 的使用通常不建议,因为它在生产者和消费者之间引入了类路径耦合,但 ActiveMQ Classic 作为 JMS 规范的一部分支持它们。

安全

ObjectMessage 对象依赖于 Java 序列化来编组/反编组对象有效负载。此过程通常被认为是不安全的,因为恶意有效负载可以利用主机系统。因此,从 5.12.25.13.0 版本开始,ActiveMQ Classic 强制用户显式列入白名单允许使用 ObjectMessage 交换的包。

如果需要交换对象消息,则需要添加应用程序正在使用的包。可以通过使用 org.apache.activemq.SERIALIZABLE_PACKAGES 系统属性来实现,该属性由代理和 activemq 客户端库解释。可以将此系统属性添加到 ${ACTIVEMQ_HOME}/bin/env 脚本中的 ACTIVEMQ_OPTS 变量中。

例如

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=java.lang,javax.security,java.util,org.apache.activemq,org.fusesource.hawtbuf,com.thoughtworks.xstream.mapper,com.mycompany.myapp

com.mycompany.myapp 包添加到受信任包列表中。请注意,此处列出的其他包默认情况下已启用,因为它们对于正常的代理工作是必需的。如果您想绕过此机制,可以使用 * 通配符允许所有包被信任,例如

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*

客户端

在客户端方面,需要相同的机制,因为恶意代码可能在 ObjectMessage.getObject() 调用中反序列化,从而危及应用程序的环境。可以在代理上使用相同的配置机制,并使用系统属性配置受信任的类。但是,这在客户端应用程序中通常不方便,因此在 5.12.25.13.1 中,我们引入了使用 ActiveMQConnectionFactory 的额外配置机制。定义了两种附加方法

  • setTrustedPackages() 方法允许设置要反序列化的受信任包列表,例如
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
    factory.setTrustedPackages(new ArrayList(Arrays.asList("org.apache.activemq.test,org.apache.camel.test".split(","))));
    
  • setTrustAllPackages() 允许关闭安全检查并信任所有类。这对于测试目的很有用。
    ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
    factory.setTrustAllPackages(true);
    

    可以在 Camel 上下文中设置相同的属性,例如

<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://127.0.0.1:61616"/>
    <property name="trustedPackages">
        <list>
            <value>org.apache.activemq.test</value>
            <value>org.apache.camel.test</value>
        </list>
    </property>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="connectionFactory"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig"/>
</bean>

<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
    <property name="brokerURL" value="tcp://127.0.0.1:61616"/>
<property name="trustAllPackages" value="true"/>
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="connectionFactory"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
    <property name="configuration" ref="jmsConfig"/>
</bean>

此配置将覆盖已设置的系统属性。

Apache, ActiveMQ, Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。