2016-04-07 4 views
1

Я пытаюсь подключиться к серверу MBean на другой машине с хранилищем ssl, но я вижу эту ошибку. У меня есть хранилище ключей и доверие на другом сервере. Я также заметил, что обе машины имеют разные версии java. Я не уверен, что это проблема или если им что-то не хватает.JMXConnector не удалось подключиться к ssl keystore

java.rmi.ConnectIOException: Exception creating connection to: 10.1.7.259; nested exception is: 
     java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
     at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source) 
     at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2432) 
     at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:308) 
     at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:270) 
     at com.stop.monitor.giab.JMXListenerClient.connect(JMXListenerClient.java:153) 
     at com.stop.monitor.giab.JMXListenerClient.main(JMXListenerClient.java:72) 
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext) 
     at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:248) 
     at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:262) 
     at javax.rmi.ssl.SslRMIClientSocketFactory.createSocket(SslRMIClientSocketFactory.java:121) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     ... 9 more 
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext) 
     at java.security.Provider$Service.newInstance(Provider.java:1617) 
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:236) 
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:164) 
     at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156) 
     at javax.net.ssl.SSLContext.getDefault(SSLContext.java:96) 
     at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:122) 
     at javax.rmi.ssl.SslRMIClientSocketFactory.getDefaultClientSocketFactory(SslRMIClientSocketFactory.java:207) 
     at javax.rmi.ssl.SslRMIClientSocketFactory.createSocket(SslRMIClientSocketFactory.java:117) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:342) 
     at sun.rmi.transport.DGCImpl_Stub.dirty(Unknown Source) 
     at sun.rmi.transport.DGCClient$EndpointEntry.makeDirtyCall(DGCClient.java:361) 
     at sun.rmi.transport.DGCClient$EndpointEntry.registerRefs(DGCClient.java:303) 
     at sun.rmi.transport.DGCClient.registerRefs(DGCClient.java:139) 
     at sun.rmi.transport.ConnectionInputStream.registerRefs(ConnectionInputStream.java:94) 
     at sun.rmi.transport.StreamRemoteCall.releaseInputStream(StreamRemoteCall.java:157) 
     at sun.rmi.transport.StreamRemoteCall.done(StreamRemoteCall.java:313) 
     at sun.rmi.server.UnicastRef.done(UnicastRef.java:451) 
     at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
     at com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:118) 
     at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.java:205) 
     at javax.naming.InitialContext.lookup(InitialContext.java:417) 
     at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnector.java:1957) 
     at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.java:1924) 
     at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:287) 
     ... 3 more 
Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect 
     at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772) 
     at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) 
     at java.security.KeyStore.load(KeyStore.java:1445) 
     at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(TrustManagerFactoryImpl.java:226) 
     at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultTrustManager(SSLContextImpl.java:767) 
     at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:733) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
     at java.security.Provider$Service.newInstance(Provider.java:1595) 
     ... 29 more 
Caused by: java.security.UnrecoverableKeyException: Password verification failed 
     at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770) 
     ... 39 more 

ответ

0

Проблема была связана с брандмауэром. Это связано с тем, что используемый для соединения URL не указывал второй порт. Таким образом, он просто использовал случайный порт.

//did not use second port. resulted in using random second port 
    String url = "service:jmx:rmi://somehost:9010/jndi/rmi://somehost/jmxrmi"; 
    final JMXConnector jmxConnector = JMXConnectorFactory.connect(url); 

    //this worked because now we are using 1 port 
    String url="service:jmx:rmi://somehost:9010/jndi/rmi://somehost:9010/jmxrmi"; 
    final JMXConnector jmxConnector = JMXConnectorFactory.connect(url); 
0

Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect
из TrustManagerFactoryImpl
из SSLContextImpl$DefaultSSLContext.getDefaultTrustManager

Убедитесь, что доверенное хранилище действует, делая keytool -listс паролем (не бейте возврата обойти его). Я не думаю, что можно создать trustedcert записей в JKS, которые несовместимы между версиями Java (это в некоторых случаях для privatekey записей), но чтобы быть в безопасности, используйте keytool JRE проблемный клиент использует - и, конечно же, тот же файл.

Удостоверьтесь, что системное свойство javax.net.ssl.trustStore имеет имя файла (если не по умолчанию, JRE/lib/security/[jsse] cacerts) и javax.net.ssl.trustStorePassword имеет правильный пароль (всегда).

Также, если формат доверия не является JKS (или PKCS12 в достаточно недавнем Java 8 JRE с keystore.type.compat, оставленным по умолчанию), укажите javax.net.ssl.trustStoreType. Но люди, которые знают, как создавать такие необычные магазины, не задают таких вопросов, как ваша.

Смежные вопросы