2

概括

无论有没有 netlib,通过 TCP 连接到 ActiveMQ 都可以正常工作。
在没有 netlib 的情况下通过SSL连接可以正常工作,但在使用 netlib 时会失败

注意:我使用的是apache-activemq-5.6.0silvertunnel.org_netlib-0.14-beta

无论是使用 netlib 的 tcpipNetLayer 还是 torNetLayer,都会出现这个问题。然而,为了简单起见,这里只考虑 tcpipNetLayer 的情况。

顺便说一句,SSL + netlib 与 HornetQ 消息服务器(以不同的方式实现 SSL 身份验证)配合得很好,但 HornetQ 遇到的问题导致我尝试使用 ActiveMQ。

为方便起见,我创建了一个简单的测试用例,其中包含一个消费者和两个不同的生产者。

  • 生产者在没有 netlib 的情况下连接 - 工作正常。
  • producer-tcpip使用 tcpipNetLayer 与 neltib 连接 - 出现以下错误:

为 ActiveMQ 启用 SSL 调试后,producer-tcpip 程序将以下错误消息输出到控制台,然后挂起:

ActiveMQ Transport: ssl://null:0, handling exception: java.lang.NullPointerException

这是 SSL 握手的中途,因为 producer-tcpip 程序会生成 log4j 消息:

DEBUG org.apache.activemq.transport.failover.FailoverTransport - Attempting  0th  connect to: ssl://localhost:61616
DEBUG org.apache.activemq.transport.WireFormatNegotiator - Sending: WireFormatInfo { version=9, properties={MaxFrameSize=104857600, CacheSize=1024, CacheEnabled=true, SizePrefixDisabled=false, MaxInactivityDurationInitalDelay=10000, TcpNoDelayEnabled=true, MaxInactivityDuration=30000, TightEncodingEnabled=true, StackTraceEnabled=true}, magic=[A,c,t,i,v,e,M,Q]}

然后,当 producer-tcpip 程序被杀死(例如使用 ctrl+C)时,activemq.log 报告:

WARN  | Transport Connection to: tcp://127.0.0.1:49463 failed: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: ssl:///127.0.0.1:49463
ERROR | Could not accept connection from tcp://127.0.0.1:49463: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake | org.apache.activemq.broker.TransportConnector | ActiveMQ Task-3

我不知道是什么原因造成的,也不知道如何解决。任何人都可以帮忙吗?

重现问题的步骤(需要不到 15 分钟):

下载测试用例

wget http://anandavala.info/miscl/testing-AMQ-Netlib-SSL.zip
unzip testing-AMQ-Netlib-SSL.zip
rm testing-AMQ-Netlib-SSL.zip
cd testing-AMQ-Netlib-SSL

下载最新的 ActiveMQ 到测试目录

wget https://www.apache.org/dist/activemq/apache-activemq/5.6.0/apache-activemq-5.6.0-bin.tar.gz
tar -xzf apache-activemq-5.6.0-bin.tar.gz
rm apache-activemq-5.6.0-bin.tar.gz

编辑 conf/activemq.xml 以接受 ssl

gedit apache-activemq-5.6.0/conf/activemq.xml

用以下几行替换 transportConnectors 条目(以启用 SSL)

        <transportConnectors>
            <transportConnector name="ssl"     uri="ssl://0.0.0.0:61616?needClientAuth=true"/>
        </transportConnectors>
        <sslContext>
            <sslContext 
            keyStore="broker.ks" keyStorePassword="password"
            trustStore="client.ks" trustStorePassword="password"/>
        </sslContext>

启动服务器

cd apache-activemq-5.6.0
bin/activemq start

查看日志输出

tail -f data/activemq.log 

打开另一个控制台,然后 cd 进入testing-AMQ-Netlib-SSL目录

将最新的 SilverTunnel netlib 下载到测试目录中

wget http://sourceforge.net/projects/silvertunnel/files/silvertunnel_Netlib/silvertunnel.org_netlib-0.14-beta.zip
unzip silvertunnel.org_netlib-0.14-beta.zip
rm silvertunnel.org_netlib-0.14-beta.zip

将源代码编译成三个可运行的 jar 文件在不同的目录中

ant

运行消费者

cd consumer
./consumer

打开另一个控制台,然后 cd 进入testing-AMQ-Netlib-SSL/producer目录

运行生产者

./producer

让它运行一会儿,让自己满意,然后按 ctrl+C 杀死生产者

运行生产者-tcpip

cd ../producer-tcpip
./producer-tcpip

让它运行一点来满足你自己它已经停止在 NullPointerException 然后通过按 ctrl+C 来杀死 producer-tcpip

注意 producer-tcpip 输出中的调试消息

tail -f logs/output.log 

还要注意出现在 activemq.log 底部的错误消息(请参阅第一个控制台窗口的尾部输出)或在当前提示符下键入

tail -f ../apache-activemq-5.6.0/data/activemq.log 

谢谢你的帮助!

4

0 回答 0