2

概要

TCP 経由の ActiveMQ への接続は、netlib の有無にかかわらず正常に機能します。SSL
経由の接続は、 netlib がなくても正常に機能しますが、 netlibでは失敗します。

注: apache-activemq-5.6.0silvertunnel.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 

ご協力いただきありがとうございます!

4

0 に答える 0