概要
TCP 経由の ActiveMQ への接続は、netlib の有無にかかわらず正常に機能します。SSL
経由の接続は、 netlib がなくても正常に機能しますが、 netlibでは失敗します。
注: apache-activemq-5.6.0とsilvertunnel.org_netlib-0.14-betaを使用しています。
この問題は、netlib の tcpipNetLayer または torNetLayer を使用している場合に発生します。ただし、単純にするために、ここでは tcpipNetLayer のケースのみを考慮します。
ところで、SSL + netlib は HornetQ メッセージング サーバー (SSL 認証の実装が異なる) で問題なく動作しましたが、HornetQ には問題があったため、ActiveMQ を使用してみました。
便宜上、1 つのコンシューマーと 2 つの異なるプロデューサーを使用する簡単なテスト ケースを作成しました。
- プロデューサーは netlib なしで接続します - 正常に動作します。
- producer-tcpipは tcpipNetLayer を使用して neltib に接続します - 次のエラーが発生します:
ActiveMQ の SSL デバッグがオンになっていると、producer-tcpip プログラムはコンソールに次のエラー メッセージを出力し、ハングします。
ActiveMQ Transport: ssl://null:0, handling exception: java.lang.NullPointerException
Producer-tcpip プログラムが log4j メッセージを生成するため、これは SSL ハンドシェイクの途中です。
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
ソースコードを別々のディレクトリにある 3 つの実行可能な jar ファイルにコンパイルします
ant
コンシューマーを実行する
cd consumer
./consumer
別のコンソールを開き、cd でtesting-AMQ-Netlib-SSL/producerディレクトリに移動します
プロデューサーを実行する
./producer
動作することを確認するために少し実行してから、ctrl + C を押してプロデューサーを強制終了します。
プロデューサー-tcpip を実行します
cd ../producer-tcpip
./producer-tcpip
NullPointerException で停止したことを確認するために少し実行してから、ctrl+C を押してプロデューサー-tcpip を強制終了します。
Producer-tcpip の出力のデバッグ メッセージに注意してください。
tail -f logs/output.log
また、activemq.log の下部に表示されるエラー メッセージに注目するか (最初のコンソール ウィンドウの末尾の出力を参照)、現在のプロンプトで次のように入力します。
tail -f ../apache-activemq-5.6.0/data/activemq.log