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

通过SilverTunnel netlib连接时,与ActiveMQ服务器的SSL握手会产生NullPointerException 总结,ssl,nullpointerexception,activemq,freeze,handshake,Ssl,Nullpointerexception,Activemq,Freeze,Handshake,无论是否使用netlib,通过TCP连接到ActiveMQ都可以正常工作。 通过SSL进行连接在没有netlib的情况下可以正常工作,但在netlib的情况下失败 注意:我使用的是apache-activemq-5.6.0和silvertunnel.org\u netlib-0.14-beta 无论是使用netlib的tcpipNetLayer还是使用torNetLayer,都会出现此问题。然而,这里只考虑tcpipNetLayer的情况,以保持简单 顺便说一句,SSL+netlib在Horne

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

注意:我使用的是apache-activemq-5.6.0silvertunnel.org\u netlib-0.14-beta

无论是使用netlib的tcpipNetLayer还是使用torNetLayer,都会出现此问题。然而,这里只考虑tcpipNetLayer的情况,以保持简单

顺便说一句,SSL+netlib在HornetQ消息传递服务器上运行良好(它以不同的方式实现SSL身份验证),但HornetQ存在问题,导致我尝试使用ActiveMQ

为了方便起见,我与一个消费者和两个不同的生产商创建了一个

  • 制作人不使用netlib连接-工作正常
  • 生产者tcpip使用tcpipNetLayer与neltib连接-出现以下错误:
启用ActiveMQ的SSL调试后,producer tcpip程序将以下错误消息输出到控制台,然后挂起:

ActiveMQ Transport: ssl://null:0, handling exception: java.lang.NullPointerException
这是SSL握手的中途,因为生产者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]}
然后,当生产者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分钟): 下载

将最新的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
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
编辑conf/activemq.xml以接受ssl

gedit apache-activemq-5.6.0/conf/activemq.xml
用以下行替换transportConnectors条目(以启用SSL)

查看日志输出

tail -f data/activemq.log 
打开另一个控制台,然后将cd放入testing AMQ Netlib SSL目录中

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
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
将最新的SilverTunnel netlib下载到测试目录中

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
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目录中

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
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
管理制作人

./producer
让它运行一段时间,让你自己满意,然后点击ctrl+C杀死制作人

运行生产商tcpip

cd ../producer-tcpip
./producer-tcpip
让它运行一段时间,让自己确信它已在NullPointerException停止,然后通过点击ctrl+C杀死生产者tcpip

注意生产者tcpip输出中的调试消息

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

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

谢谢你的帮助!我不知道这是否重要,但ActiveMQ和HornetQ实现SSL的方式之间的一个主要区别是ActiveMQ需要通过JVM命令行选项进行一些配置。例如,一个典型的命令行是:java-Djavax.net.ssl.keyStore=../apache-activemq-5.6.0/conf/client.ks-Djavax.net.ssl.keystrepassword=password-Djavax.net.ssl.trustStore=../apache-activemq-5.6.0/conf/client.ts-Djavax.net.debug=ssl-jar producer.jar。当Netlib对JVM进行更新时,是否会丢失或丢失此信息腐败?只是一个想法…不,前面评论中的想法是不正确的。我刚刚通过SSLSocket(通过Netlib)成功地连接了两个Java应用程序。SSLSockets使用与上述相同的命令行配置。因此,SSL命令行参数可以由Netlib处理。解决方法:使用SSLSockets建议解决Netlib和ActiveMQ之间的不兼容问题。与其尝试通过一个分层的SSL连接直接连接到ActiveMQ,不如通过分层的SSLSocket连接到服务器端的一个小型Java应用程序(称为“接收器”)。然后,在服务器端,接收方程序通过本地主机TCP连接将数据传递到ActiveMQ服务器。使用中间应用程序意味着Netlib和ActiveMQ不必直接接触。我不知道这是否重要,但ActiveMQ和HornetQ实现SSL的方式之间的一个主要区别是ActiveMQ需要通过JVM命令行选项进行一些配置。例如,一个典型的命令行是:java-Djavax.net.ssl.keyStore=../apache-activemq-5.6.0/conf/client.ks-Djavax.net.ssl.keystrepassword=password-Djavax.net.ssl.trustStore=../apache-activemq-5.6.0/conf/client.ts-Djavax.net.debug=ssl-jar producer.jar。当Netlib对JVM进行更新时,是否会丢失或丢失此信息腐败?只是一个想法…不,前面评论中的想法是不正确的。我刚刚通过SSLSocket(通过Netlib)成功地连接了两个Java应用程序。SSLSockets使用与上述相同的命令行配置。因此,SSL命令行参数可以由Netlib处理。解决方法:使用SSLSockets建议解决Netlib和ActiveMQ之间的不兼容问题。与其尝试通过一个分层的SSL连接直接连接到ActiveMQ,不如通过分层的SSLSocket连接到服务器端的一个小型Java应用程序(称为“接收器”)。然后,在服务器端,接收方程序通过本地主机TCP连接将数据传递到ActiveMQ服务器。使用中间应用程序意味着Netlib和ActiveMQ不必直接接触。