Tomcat 7.0.23 で SSL を使用して JMX を動作させようとしています。サーバーは AWS に配置されています。つまり、すべてのホストが NAT 処理されており、JmxRemoteLifecycleListener を使用して、JMX が使用する 2 つのポートを明示的に設定する必要があります。私はこのテーマについて多くの読書をしてきましたが、すべての部分を適切に連携させることはできません.
SSLなしでJMXを正常に動作させることができます。Tomcat のバージョン用のバージョンの catalina-jmx-remote.jar をダウンロードし、tomcat/lib ディレクトリにインストールしました。私のserver.xmlには以下が含まれています:
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
rmiRegistryPortPlatform="1099" rmiServerPortPlatform="1098" />
次の設定で Tomcat を起動すると、安全でないセッションに接続できます。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access
-Djava.rmi.server.hostname=<public IP of server>
-Dcom.sun.management.jmxremote.ssl=false
ただし、これらを次のように変更すると、SSL 接続を確立できなくなります。
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access
-Djava.rmi.server.hostname=<public IP of server>
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.ssl.need.client.auth=false
-Dcom.sun.management.jmxremote.authenticate=true
-Djavax.net.ssl.keyStore=/path/to/keystore.dat
-Djavax.net.ssl.keyStorePassword=<password>
-Djavax.net.ssl.trustStore=/path/to/truststore.dat
-Djavax.net.ssl.trustStorePassword=<password>
keystore.dat には、次の方法で作成された証明書が 1 つだけ含まれています。
openssl x509 -outform der -in cert.pem -out cert.der
keytool -import -alias tomcat -keystore keystore.dat -file cert.der -storepass <password>
truststore.dat には、Java cacerts の完全なコピーと、自己署名証明書の CA 証明書が含まれています。
cp $JAVA_HOME/jre/lib/security/cacerts truststore.dat
keytool -storepasswd -storepass changeit -new <password> -keystore truststore.dat
keytool -import -trustcacerts -file mycacert.pem -alias myalias -keystore truststore.dat -storepass <password>
Tomcat を起動した後、jconsole 経由で接続しようとしましたが、接続を確立できません。openssl を使用して SSL を検証しようとしましたが、Tomcat が証明書を使用していないようです:
$ openssl s_client -connect <host>:1099
CONNECTED(00000003)
140735160957372:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 322 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
キーをエクスポートして証明書チェーンを検証することで、ローカル キーストアとトラストストアが適切に設定されていることを確認しました (combined.pem は truststore.dat からのすべての CA 証明書であり、cert.pem は keystore.dat からの私の証明書です)。
$ openssl verify -verbose -purpose sslserver -CAfile combined.pem cert.pem
cert.pem: OK
だから今、私は完全に途方に暮れています。証明書と CA 証明書は正しいようです。暗号化されていない JMX 接続が機能します。しかし、SSLを使用するための接続を取得できないようです。ここで何が欠けていますか?
これがただのニシンなのかどうかはわかりませんが、keyStore 内のどの証明書が JMX によって使用されるかを指定する方法がわかりません。私が読んだことのいくつかは、エイリアス「tomcat」を持つ証明書を使用しているだけであることを暗示しています。あれは正しいですか?