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,The Apache Software Foundation。 根據Apache License 2.0授權。