当通过SilverTunnel netlib连接时,与ActiveMQ服务器的SSL握手会产生NullPointerException

时间:2012-09-14 07:59:56

标签: ssl nullpointerexception activemq hang handshake

摘要

通过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,其中包含消费者和两个不同的制作人。

  • 制作人连接没有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分钟):

下载test case

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 

感谢您的帮助!

0 个答案:

没有答案