【发布时间】:2025-12-07 18:10:01
【问题描述】:
我花了很多时间将支持 JMX 添加到企业应用程序中。 JMX 应该通过 SQL 使用 SSL 和客户端身份验证。那不是问题。 我正在使用系统属性来启用 SSL。 系统属性对于 JVM 来说是全局的。尤其是在大型应用程序中,如果没有其他配置方法可用,很快就会出现冲突。
特别是在大型企业应用程序中,需要对需要不同证书的不同服务进行调用,尤其是在自动证书选择方面存在限制,需要有一种方法可以在需要时通过灵活的代码挂钩。 不幸的是,JMX 和 RMI 目前没有提供这样的钩子,完全依赖于系统属性或默认的套接字工厂。
有什么方法可以通过不使用系统属性来使用 SSL 来制作 JMX?
编辑:
使用 SslRMIClientSocketFactory 不起作用。
// System.setProperty( "java.rmi.server.randomIDs", "true" );
// System.setProperty( "javax.net.ssl.keyStore", keystore );
// System.setProperty( "javax.net.ssl.keyStorePassword",
// "password" );
// SSL-based RMI socket factories.
SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory();
SslRMIServerSocketFactory ssf = new SslRMIServerSocketFactory();
map.put( RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf );
map.put( RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, ssf );
例外:
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:304)
【问题讨论】: