Socket seguro, utilizando a api SSLSocket

31/08/2010

0

olá, tenho uma classe java que move os arquivos de um diretório (cliente) para o servidor, utilizando a API Socket.
O problema é que agora eu preciso fazer com essa transferência de arquivos seja segura, estou utilizando então a API SSLSocket, usando a porta 22, só que estou tendo problemas, eu consigo me conectar mas quando dou um startHandshake(), da o seguinte erro :
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Alguém tem alguma idéia do que seja isso, procurei bastante já mas não consegui chegar a nenhuma solução, talvez seja alguma configuração do servidor.

Meu código é esse:

/**
     * Conecta-se com um servidor FTP.
     *
     * @host Nome do host com o servidor FTP
     * @port Porta de conexão
     * @use  Usuário de acesso
     * @pass Senha do usuário
     *
     * @return Não há retorno.
     *
     * @throws IOException - Erro na conexão com o servidor de FTP.
     *******************************************************************************/
    public synchronized void connect (String host, int port, String user, String pass) throws IOException
    {
        String response;

        //--- Verifica se já está conectado ---
        if (mSSLSocket != null)
            throw new IOException("Is already connected.");
        
        //--- Inicia variáveis ---
        //SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        //SSLServerSocket servidorSeguro = (SSLServerSocket) ssf.createServerSocket(port);
        
        
        mSSLSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 

        //mSocket = new Socket(host, port);
        //mSocket.setTcpNoDelay(true);
        
        mSSLSocket = (SSLSocket) mSSLSocketFactory.createSocket(host, port);
        mSSLSocket.setEnabledCipherSuites(mSSLSocket.getEnabledCipherSuites());
        mSSLSocket.startHandshake();
        
        mReader = new BufferedReader(new InputStreamReader(mSSLSocket.getInputStream()));
        mWriter = new BufferedWriter(new OutputStreamWriter(mSSLSocket.getOutputStream()));
        
        System.out.println("Socket class: "+mSSLSocket.getClass());
        System.out.println("   Remote address = " +mSSLSocket.getInetAddress().toString());
        System.out.println("   Remote port = "+mSSLSocket.getPort());
        System.out.println("   Local socket address = " +mSSLSocket.getLocalSocketAddress().toString());
        System.out.println("   Local address = " +mSSLSocket.getLocalAddress().toString());
        System.out.println("   Local port = "+mSSLSocket.getLocalPort());
        System.out.println("   Need client authentication = " +mSSLSocket.getNeedClientAuth());
        System.out.println("   Sessão = "+mSSLSocket.getSession());
        SSLSession ss = mSSLSocket.getSession();
        System.out.println("   Cipher suite = "+ss.getCipherSuite());
        System.out.println("   Protocol = "+ss.getProtocol());
        System.out.println("Socket: "+mSSLSocket.toString());
        System.out.println("Conectado: "+mSSLSocket.isConnected());
    
        //--- Modo default de transferência: binário ---
        bin();
    } //connect


Fabiano Souza

Fabiano Souza

Responder

Posts

06/09/2010

Dyego Carmo

Qual servidor de FTP que você está usando na outra ponta ?

Responder

13/09/2010

Fabiano Souza

Qual servidor de FTP que você está usando na outra ponta ?



O problema com o FTP aqui foi resolvido, era um problema de configuração mesmo, o servidor que não estava preparado para esse tipo de conexão.
Eu usei uma outra biblioteca que usa comandos SCP, assim eu resolvi  meu problema.
Obrigado.


Agora estou com outra dúvida aqui!

Tenho uma conexão com banco aberta, tenho statements dessa conexão, eu usei o método setQueryTimeout(60), da classe Statement, para pelo que eu entendi, terminar essa transação com banco, caso esse sql demore muito para retornar, ou seja, evita que o sistema trave devido a uma consulta em execução.

Pois bem, isso parece não funcionar quando é um erro físico por exemplo, eu executo meu script aqui, depois de estanciar a conexão, o statement, setar o timeout do statement em 10s por exemplo, eu retiro o cabo de rede, depois executo uma consulta no banco, que vai ficar travada, pois estou sem cabo de rede, daí espero que essa consulta seja abortada após os 10s de timeout, mas isso não acontece, a consulta fica em execução e trava o sistema, até que o cabo de rede seja colocado de volta por exemplo.

Alguma idéia de como resolver isso, terminar a execução de uma consulta caso ela exceda o tempo limite?
Responder

13/09/2010

Dyego Carmo

Esta opcao utiliza um parametro do banco de dados para garantir que a query seja executada em X tempo , caso senao o proprio banco de dados cancela entende ? Depende muito do driver JDBC , o do mysql eu sei que funciona..

Responder

14/09/2010

Fabiano Souza

O banco que eu uso aqui é o Oracle, e parece que não está funcionando bem, quando fico sem comunicação com este no servidor.

Enquanto essa comunicação não for estabelecida, o banco fica esperando, travado, mesmo eu indicando que o timeout é de 20s por exemplo.

Somente depois de estabilizada a comunicação, é que o banco precebe que timeout foi atingido e envia uma exception.

Enfim, deve ser uma configuração a parte do banco, porque o driver realmente não atende isso, o que você acha?
Responder

14/09/2010

Dyego Carmo

Já que o JDBC da Oracle nao implementa direito esta funcionalidade , o que você pode fazer é botar esta consulta dentro de uma thread , executa-la e aguardar 20 segundos para ela terminar , caso nao termine vc mata ela...

O efeito é o mesmo , porem o controle é seu :)

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar