Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Проблемы установки SSL соединения


Автор: udjin_ks 11.7.2007, 10:59
Пытаюсь установить 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 отсиживается (неболее чем личное мнение).

 smile

Добавлено через 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


Автор: udjin_ks 11.7.2007, 12:02
Проблема разрешилась добавлением в код сервера connection.startHandshake(); после строчки SSLSocket socket = (SSLSocket)providerSocket.accept();

Но теперь есть другая проблема. С одного SSLSocket сообщение уходит но с другой стороны в input ничего нету...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)