gpt4 book ai didi

java - 使用 SSL 和自签名证书让 JMX 在 Tomcat 7 下工作

转载 作者:行者123 更新时间:2023-11-28 22:13:30 26 4
gpt4 key购买 nike

我试图让 JMX 在 Tomcat 7.0.23 下使用 SSL 工作。服务器位于 AWS,这意味着所有主机都是 NATed,我需要使用 JmxRemoteLifecycleListener 来显式设置 JMX 使用的两个端口。我一直在阅读有关该主题的大量资料,但我就是无法将所有部分正确地组合在一起。

我可以让 JMX 在没有 SSL 的情况下正常工作。我已经为我的 Tomcat 版本下载了 catalina-jmx-remote.jar 版本并将其安装在我的 tomcat/lib 目录中。我的 server.xml 包含:

  <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
rmiRegistryPortPlatform="1099" rmiServerPortPlatform="1098" />

当我使用以下设置启动 Tomcat 时,我可以连接到不安全的 session :

-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 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
---

我已经通过导出 key 和验证证书链来验证我的本地 keystore 和信任库是否正确设置(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 Registry。为了让 RMI Registry 使用 SSL,您需要传递额外的 -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?它需要知道商店在哪里以及相应的密码。

对于 VisualVM,您可以安装 VisualVM-Security 插件,它会在选项对话框中添加一个新选项卡,允许您在 UI 中自定义 SSL 相关选项。

关于java - 使用 SSL 和自签名证书让 JMX 在 Tomcat 7 下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033379/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com