通过TCP连接到ActiveMQ可以在有或没有netlib的情况下正常工作 通过 SSL 进行连接可以在没有netlib 的情况下正常工作,但在netlib 时失败。
注意:我正在使用 apache-activemq-5.6.0 和 silvertunnel.org_netlib-0.14-beta 。
无论是使用netlib的tcpipNetLayer还是torNetLayer,都会出现此问题。但是,这里只考虑tcpipNetLayer案例以保持简单。
BTW,SSL + netlib与HornetQ消息服务器(以不同方式实现SSL身份验证)工作正常,但HornetQ遇到问题导致我尝试使用ActiveMQ。为方便起见,我创建了一个simple test case,其中包含消费者和两个不同的制作人。
在为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
我不知道造成这种情况的原因或解决方法。有人可以帮忙吗?
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
打开另一个控制台,然后进入 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
打开另一个控制台,然后进入 testing-AMQ-Netlib-SSL / producer 目录
运行生产者
./producer
让它运行一段时间来满足自己它的工作方式然后通过按ctrl + C来杀死生产者
运行producer-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