Пытаюсь установить SSL соединение. Сертификаты создал. Класc SSLConnection (где-то с нета стащил) Код | public class SSLConnection {
private SSLContext ctx ; private KeyStore mykey , mytrust ; private String key, trust ;
public SSLConnection(String key , String trust , char[] storepass, char[] keypass) { this.key = key; this.trust = trust ; initSSLContext(storepass , keypass ); }
public void initKeyStores(String key , String trust , char[] storepass){ try { mykey = KeyStore.getInstance("JKS" , "SUN"); mytrust = KeyStore.getInstance("JKS", "SUN");
mykey.load(new FileInputStream(key) ,storepass); mytrust.load(new FileInputStream(trust) ,storepass ); } catch(Exception e) { System.err.println(e.getMessage()); } }
public void initSSLContext(char[] storepass , char[] keypass) { try { ctx = SSLContext.getInstance("TLSv1" , "SunJSSE"); initKeyStores(key , trust , storepass) ; TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE"); tmf.init(mytrust); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509","SunJSSE"); kmf.init(mykey , keypass); ctx.init(kmf.getKeyManagers() , tmf.getTrustManagers() ,null) ; } catch(Exception e) { System.err.println(e.getMessage()); } }
public SSLContext getMySSLContext() { return ctx ; } }
|
Реализация сервера: Код | String key = "*******/.keystore"; String trust = "*******/trust"; char[] storepass = "*****".toCharArray(); char[] keypass = "******".toCharArray(); SSLConnection sslConnection = new SSLConnection(key, trust, storepass, keypass);
SSLServerSocketFactory ssf = (sslConnection.getMySSLContext()).getServerSocketFactory();
providerSocket = ssf.createServerSocket(port); ((SSLServerSocket)providerSocket).setNeedClientAuth(true);
SSLSocket socket = (SSLSocket)providerSocket.accept();
|
Реализация клиентской части: Код | String key = "********/.keystore"; String trust = "*********/trust"; char[] storepass = "***".toCharArray(); char[] keypass = "***".toCharArray(); SSLConnection sslConnection = new SSLConnection(key, trust, storepass, keypass); SSLSocketFactory sf = sslConnection.getMySSLContext().getSocketFactory(); connection = (SSLSocket)sf.createSocket(address , port); connection.startHandshake();
|
На строчке connection.startHandshake(); идет жуткое зависание минут на 3-5. После чего конект таки устанавливается и можно работать. Что я делаю не так? Может необходимо какие-то параметры дополнительно в сокете установить или еще что? у меня впечаление что какой-то timeout отсиживается (неболее чем личное мнение). Добавлено через 10 минут и 21 секундуА иногда в процедуре получаю такое исключение Код | javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:742) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041) at com.archon.callcenter.common.socketSupport.SocketClient.SocketClient.createConnection(SocketClient.java:69) at com.archon.callcenter.client.proxy.RemoteProxy.initSockeClient(RemoteProxy.java:251) at com.archon.callcenter.client.workspace.WorkspaceFrame$UserLoginEventListener.loginOccurred(WorkspaceFrame.java:1338) at com.archon.callcenter.client.workspace.WorkspaceFrame.fireUserLoginEvent(WorkspaceFrame.java:1308) at com.archon.callcenter.client.proxy.LoginState.checkAuth(LoginState.java:102) at com.archon.callcenter.client.proxy.RemoteProxy.checkAuth(RemoteProxy.java:221) at com.archon.callcenter.client.frames.users.LoginFrame$ButtonLoginListener.actionPerformed(LoginFrame.java:88) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234) at java.awt.Component.processMouseEvent(Component.java:5488) at javax.swing.JComponent.processMouseEvent(JComponent.java:3126) at java.awt.Component.processEvent(Component.java:5253) at java.awt.Container.processEvent(Container.java:1966) at java.awt.Component.dispatchEventImpl(Component.java:3955) at java.awt.Container.dispatchEventImpl(Container.java:2024) at java.awt.Component.dispatchEvent(Component.java:3803) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822) at java.awt.Container.dispatchEventImpl(Container.java:2010) at java.awt.Window.dispatchEventImpl(Window.java:1774) at java.awt.Component.dispatchEvent(Component.java:3803) at java.awt.EventQueue.dispatchEvent(EventQueue.java:463) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149) at java.awt.EventDispatchThread.run(EventDispatchThread.java:110) Caused by: java.io.EOFException: SSL peer shut down incorrectly at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:723) ... 34 more
|
|