gpt4 book ai didi

java - 带有 RMI 的 JMX 的 SSL

转载 作者:行者123 更新时间:2023-12-04 22:38:38 26 4
gpt4 key购买 nike

我们有一个 Java 应用程序,它与密码验证的 JConsole 连接已经有一段时间了。为了提高安全性,我们尝试加密从 JConsole 到应用程序的连接。
到目前为止,我们已经使用以下启动命令启动了我们的应用程序:

java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=jmx.password \
-Dcom.sun.management.jmxremote.access.file=jmx.access \
-Dcom.sun.management.jmxremote.ssl=false
-jar MyApplication.jar
有了这个,我们可以通过 JConsole、jmxterm 和其他 Java 应用程序完美地访问 MyApplication 的 JMX 方法。在 JConsole 和 jmxterm 中,我们可以同时使用 hostname:1099service:jmx:rmi:///jndi/rmi://hostname:1099/jmxrmi没有问题。在 Java 应用程序中,我们总是使用 service:jmx:rmi:///jndi/rmi://hostname:1099/jmxrmi ,再次没有问题。我们的应用程序没有基于代码的 JMX 端点设置(我们公开了一些方法和属性,但我们没有触及注册表和套接字工厂)。
现在我们正在尝试在我们的应用程序和所有其他方之间设置 SSL,遵循 www.cleantutorials.com/jconsole/jconsole-ssl-with-password-authentication .这样做,我们为 MyApplication 以及与 JMX 方法的客户端连接提供了一个 keystore 和信任库。我们用
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=jmx.password \
-Dcom.sun.management.jmxremote.access.file=jmx.access \
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Djava.rmi.server.hostname=hostname \
-Djavax.net.ssl.keyStore=server-jmx-keystore \
-Djavax.net.ssl.keyStorePassword=password \
-Djavax.net.ssl.trustStore=server-jmx-truststore \
-Djavax.net.ssl.trustStorePassword=password \
-jar MyApplication.jar
在此之后,我们几乎所有的连接都失败了。唯一成功的是通过 JConsole(将客户端 keystore 和信任库添加到启动配置),并且仅使用 hostname:1099 .使用地址 service:jmx:rmi:///jndi/rmi://hostname:1099/jmxrmi不再工作,不是通过 JConsole,不是通过 jmxterm,也不是通过其他应用程序。
我们已经尝试了我们能想到的任何启动设置组合,但我们在任何地方找到的似乎都不起作用。我们在尝试连接时看到的错误,例如jmxterm 是:
java.rmi.ConnectIOException: non-JRMP server at remote endpoint
(如果需要,我可以提供完整的堆栈)。
我们对如何继续,我们可以做些什么来让所有曾经工作的连接现在都工作感到有点不知所措。我们应该怎么做才能启用与 service:jmx:rmi:///jndi/rmi://hostname:1099/jmxrmi 的连接- 类似通过 SSL 的连接字符串?
如果相关,此应用程序使用的是 OpenJDK 11.0.5,我们可能需要在 OpenJDK 8 上运行的其他应用程序。
编辑
调试 JConsole 客户端和后端,似乎客户端尝试建立的协议(protocol)在 SSL 上下文中是未知的。在后端,我们有以下错误:
javax.net.ssl|DEBUG|20|RMI TCP Connection(1)|2021-12-28 10:04:04.265 CET|null:-1|Raw read (
0000: 4A 52 4D 49 00
JRMI.
)
javax.net.ssl|ERROR|20|RMI TCP Connection(1)|2021-12-28 10:04:04.267 CET|null:-1|Fatal (UNEXPECTED_MESSAGE): Unsupported or unrecognized SSL message (
"throwable" : {
javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
at java.base/sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(Unknown Source)
at java.base/sun.security.ssl.SSLSocketInputRecord.decode(Unknown Source)
at java.base/sun.security.ssl.SSLTransport.decode(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl.ensureNegotiated(Unknown Source)
at java.base/sun.security.ssl.SSLSocketImpl$AppInputStream.read(Unknown Source)
at java.base/java.io.BufferedInputStream.fill(Unknown Source)
at java.base/java.io.BufferedInputStream.read(Unknown Source)
at java.base/java.io.DataInputStream.readInt(Unknown Source)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)}
)
之后后端关闭连接。
根据一些在线教程,使用基于服务的 URL 应该可以使 SSL 连接工作,但我们无法使其工作。

最佳答案

抛出的javax.net.ssl.SSLException: Unsupported or unrecognized SSL message表示存在明文而不是 SSL 通信。调试输出中没有 SSL 握手消息(至少 CLIENT_HELLO)这一事实验证了这一假设。
所以很明显客户端不使用 SSLSocket 进行通信。
一个非常简单的基于 SSLSocket 的通信示例可以在 Oracle documentation 中找到。 ,但还有更多可用的。

关于java - 带有 RMI 的 JMX 的 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70309104/

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