Java - SSL

 
Vista:

SSL

Publicado por Jaume (2 intervenciones) el 21/01/2009 00:42:54
Hola, soy inexperto en esto de la programación en java y tengo el siguiente problema:

Tengo que realizar un aplicación cliente-servidor eco con java. Pero tiene que ser una conexion SSL donde se deben autentificar tanto el servidor como el cliente. Mediante el keytool creo dos pares de keystores: 2 para el cliente (truststore con el certificado público del servidor y clientestore con la clave privada del cliente) y lo mismo para el servidor. Hasta aquí de momento bién.
Ahora a la hora de ejecutar los programas me sale esté error:
"Exception in thread "main" java.net.BindException: Permission denied"

A parte de este error me salen todo tipo de problemas, os paso el codigo del cliente y servidor y si me pudierais ayudar y decir-me lo que hago mal os lo agradeceria. La verdad es que soy muy novato en java y me entero de muy poco.

Aquí estan los códigos:

Servidor-------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
 
public class ServidorEco {
 
    public static void main(String[] args) throws IOException {
 
        System.setProperty("javax.net.ssl.keyStore","Servidor.keystore");
        System.setProperty("javax.net.ssl.keyStorePassword","claveservidor");
 
        SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        ServerSocket servidorSocket = ssf.createServerSocket(9999);
 
        System.setProperty("javax.net.ssl.trustStore","trustServidor.keystore");
 
    while (true) {
       SSLSocket socket = (SSLSocket) servidorSocket.accept();
 
    try {
      InputStream is = socket.getInputStream();
      OutputStream os = socket.getOutputStream();
 
      byte[] bytes = new byte[512];
 
      int leidos;
      while ((leidos = is.read(bytes)) != -1) {
         os.write(bytes, 0, llegits);
      }
 
      is.close();
      os.close();
      socket.close();
    } catch (IOException e) {
      System.out.println("Error de conexión.");
    }
  }
 }
}


Cliente-----------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
 
public class ClienteEco {
 
    public static void main(String[] args) throws IOException {
 
   BufferedReader teclado =
   new BufferedReader(new InputStreamReader(System.in));
 
   System.setProperty("javax.net.ssl.keyStore","Client.keystore");
   System.setProperty("javax.net.ssl.keyStorePassword","clavecliente");
 
   System.setProperty("javax.net.ssl.trustStore","trustClient.keystore");
 
   SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
   SSLSocket clientesocket = (SSLSocket) ssf.createSocket("127.0.0.1", 9999);
   BufferedReader leerServidor =
   new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
 
   PrintWriter escribirServidor =
   new PrintWriter(clientesocket.getOutputStream(),true);
 
   for(int i=0; i<3; i++){
   String linea = teclado.readLine();
   escribirServidor.println(linea);
 
   String linearecibida = llegirServidor.readLine();
   System.out.println("Eco: "+linearecibida);
   }
 
   lleerServidor.close();
   escribirServidor.close();
   clientesocket.close();
    }
 
}


---------------
Necesitaria si puede ser que me explicaseis los errores y la manera de solucionarlo y cualquier sugerencia de codigo para mejorar el programa. Muchas gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:SSL

Publicado por Jaume  (2 intervenciones) el 27/01/2009 23:23:52
Buenas, veo que nadie me ha contestado a la pregunta.
Ya he solucionado estos problemas y me funciona la aplicación. Pero no se como hacer para que el cliente se certifique. Ya que en el protocolo ssl esta opción es opcional.
Otro problema es que me gustaria poder capturar el ssl handshake mediante la misma aplicación, sin usar ningún snnifer y no se como hacerlo.

A ver si alguien se anima, muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SSL

Publicado por Silvia (1 intervención) el 10/01/2011 00:44:21
Hola!
Estoy realizando la misma practica y he llegado al mismo problema que tenias. Me gustaría saber, si es posible como lo has solucionado porque yo ya no se que tengo que hacer.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SSL

Publicado por Andrés Torres (1 intervención) el 11/03/2020 17:01:25
Me podrás pasar tu código de favor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SSL

Publicado por Costero (144 intervenciones) el 11/03/2020 19:44:12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
 
public class EchoServer {
    public static void main(String[] arstring) {
        try {
            SSLServerSocketFactory sslserversocketfactory =
                    (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket sslserversocket =
                    (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
            SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
            InputStream inputstream = sslsocket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
 
            PrintWriter respond = new PrintWriter(sslsocket.getOutputStream(), true);
            String received;
            while ((received = bufferedreader.readLine()) != null) {
                System.out.println(received);
                System.out.flush();
                respond.println("I got you: " + received);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

Para correr el servidor:
1
java -Djavax.net.ssl.keyStore=/path/to/yourstore -Djavax.net.ssl.keyStorePassword=TuSecret EchoServer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
 
public
class EchoClient {
    public static void main(String[] arstring) {
        try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
            InputStream inputstream = System.in;
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
            OutputStream outputstream = sslsocket.getOutputStream();
            OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
            BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);
 
            InputStream receivingstream = sslsocket.getInputStream();
            InputStreamReader receivingstreamreader = new InputStreamReader(receivingstream);
            BufferedReader receivingbufferedreader = new BufferedReader(receivingstreamreader);
 
            String sending;
            while ((sending = bufferedreader.readLine()) != null) {
                bufferedwriter.write(sending + '\n');
                bufferedwriter.flush();
                System.out.println("From server ==> " + receivingbufferedreader.readLine());
            }
 
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

Para correr el client:
1
java -Djavax.net.ssl.trustStore=/path/to/store -Djavax.net.ssl.trustStorePassword=TuSecret EchoClient
Cuando el cliente corre, entonces escribes y el servidor echo para atras

Si no tienes store lo puedes crear con el KeyTool. Por ejemplo:

1
$JAVA_HOME/bin/keytool" -genkey -alias tomcat -keyalg RSA -keystore /path/to/store
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SSL

Publicado por Costero (144 intervenciones) el 11/03/2020 17:44:30
Tienes que pasar la option:

1
-Djavax.net.debug=ssl
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar