2016-09-28 51 views
0

我是JMX的新手。我需要創建一個定製的JMX客戶端,它將連接到遠程服務器並從mbeans讀取數據。連接由SSLHandshakeException引起的JMX錯誤

這裏是應用程序的代碼,我到目前爲止有:

String url = "service:jmx:rmi:///jndi/rmi://host:port/jmxrmi"; 
JMXServiceURL serviceURL = new JMXServiceURL(url); 
Map env = new HashMap(); 
String[] creds = { "role", "password" }; 
env.put(JMXConnector.CREDENTIALS, creds); 
JMXConnector cc = JMXConnectorFactory.connect(serviceURL, env); 
MBeanServerConnection mbsc = cc.getMBeanServerConnection(); 

當我啓動我的應用程序我得到以下錯誤(修改,添加完整的堆棧跟蹤):

Exception in thread "main" java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:304) 
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:308) 
    at Main.main(Main.java:21) 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179) 
    at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2430) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270) 
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747) 
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) 
    at java.io.DataOutputStream.flush(DataOutputStream.java:123) 
    ... 9 more 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:229) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    ... 20 more 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    ... 26 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 

任何幫助將不勝感激。

+0

您沒有受信任的證書。使用* -Djavax.net.debug = all *選項運行您的應用程序,以調試證書中的確切問題。也許如果你有一個自簽名的,你應該把它導入到trustr。或者,如果您的CA沒有得到認可,您應該將CA證書導入到委託人中。 –

+0

@MarioAlexandroSantini我按照建議添加了完整的堆棧跟蹤 –

+0

異常只是說你在證書鏈中存在問題。我不確定是服務器還是客戶端。它看起來服務器沒有可信任的證書。使用jvm選項* -Djavax.net.debug = all *運行您的客戶端。這會打印大量信息,例如來自服務器的證書,並告訴您爲什麼它沒有找到適合目標的東西。 –

回答

1

問題在於缺少客戶端密鑰庫中的服務器證書。