我正在尝试使JMX在带有SSL的Tomcat 7.0.23下工作。服务器位于AWS中,这意味着所有主机都已NAT,并且我需要使用JmxRemoteLifecycleListener显式设置JMX使用的两个端口。我已经做了很多关于该主题的阅读,但是我无法使所有部分正常工作。
没有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仅包含通过以下方式创建的单个证书:
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 cacert的完整副本以及我的自签名证书的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的连接。我在这里想念什么?
我不知道这是否只是一条红鲱鱼,但我看不到任何方法来指定JMX使用keyStore中的证书。我读到的一些内容暗示它仅使用别名为“ tomcat”的证书。那是对的吗?
您正在端口 1099* 上启动 RMI注册表 。为了使 RMI注册中心 使用 SSL, 您需要传递一个附加参数。 __ ***-Dcom.sun.management.jmxremote.registry.ssl=true
-Dcom.sun.management.jmxremote.registry.ssl=true
编辑: 您jconsole -J-Djavax.net.ssl.trustStore=truststore -J-Djavax.net.ssl.trustStorePassword=trustword -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password用来启动JConsole吗?它需要知道商店在哪里以及相应的密码。
jconsole -J-Djavax.net.ssl.trustStore=truststore -J-Djavax.net.ssl.trustStorePassword=trustword -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password
对于VisualVM,您可以安装 VisualVM-Security 插件,该插件将在“选项”对话框中添加一个新选项卡,允许您自定义UI中与SSL相关的选项。