Rappels programma,on réseau Java- suite C. Delporte M2- Internet Rappel Java 1
Socket programming Two socket types for two transport services: UDP: unreliable datagram TCP: reliable, byte stream-oriented C. Delporte M2-Internet Rappel Java 2-2
Socket UDP Socket SSL C. Delporte M2- Internet Rappel Java 3
Classes java.net.datagrampacket java.net.datagramsocket java.net.mul1castsocket java.net.serversocket javax.net.ssl.sslserversocket java.net.socket javax.net.ssl.sslsocket C. Delporte M2- Internet Rappel Java 4
Socket UDP C. Delporte M2-Internet Rappel Java 1-5
UDP C. Delporte M2-Internet Rappel Java 6
DatagramPacket q Un paquet contient au plus 65,507 bytes q Pour construire les paquets v public DatagramPacket(byte[] buffer, int length) v public DatagramPacket(byte[] buffer, int offset, int length) q Pour construire et envoyer v public DatagramPacket(byte[] data, int length, InetAddress destination, int port) v public DatagramPacket(byte[] data, int offset, int length, InetAddress destination, int port) v public DatagramPacket(byte[] data, int length, SocketAddress destination, int port) v public DatagramPacket(byte[] data, int offset, int length, SocketAddress destination, int port) C. Delporte M2-Internet Rappel Java 7
Exemple String s = "On essaie "; byte[] data = s.getbytes("ascii"); try { InetAddress ia = InetAddress.getByName("www.liafa.univ-parisdiderot.fr"); int port = 7;// existe-t-il? DatagramPacket dp = new DatagramPacket(data, data.length, ia, port); catch (IOException ex) C. Delporte M2-Internet Rappel Java 8
Méthodes q Adresses v public InetAddress getaddress( ) v public int getport( ) v public SocketAddress getsocketaddress( ) v public void setaddress(inetaddress remote) v public void setport(int port) v public void setaddress(socketaddress remote) C. Delporte M2-Internet Rappel Java 9
Méthodes (suite) q Manipulation des données: v public byte[] getdata( ) v public int getlength( ) v public int getoffset( ) v public void setdata(byte[] data) v public void setdata(byte[] data, int offset, int length ) v public void setlength(int length) C. Delporte M2-Internet Rappel Java 10
Exemple import java.net.*; public class DatagramExample { public static void main(string[] args) { String s = "Essayons."; byte[] data = s.getbytes( ); try { InetAddress ia = InetAddress.getByName("www.liafa.univ-parisdiderot.fr"); int port =7; DatagramPacket dp = new DatagramPacket(data, data.length, ia, port); System.out.println(" Un packet pour" + dp.getaddress( ) + " port " + dp.getport( )); System.out.println("il y a " + dp.getlength( ) + " bytes dans le packet"); System.out.println( new String(dp.getData( ), dp.getoffset( ), dp.getlength( ))); catch (UnknownHostException e) { System.err.println(e); C. Delporte M2-Internet Rappel Java 11
DatagramSocket q Constructeurs v public DatagramSocket( ) throws SocketException v public DatagramSocket(int port) throws SocketException v public DatagramSocket(int port, InetAddress interface) throws SocketException v public DatagramSocket(SocketAddress interface) throws SocketException v (protected DatagramSocket(DatagramSocketImpl impl) throws SocketException) C. Delporte M2-Internet Rappel Java 12
Exemple java.net.*; public class UDPPortScanner { public static void main(string[] args) { for (int port = 1024; port <= 65535; port++) { try { // exception si utilisé DatagramSocket server = new DatagramSocket(port); server.close( ); catch (SocketException ex) { System.out.println("Port occupé" + port + "."); // end try // end for C. Delporte M2-Internet Rappel Java 13
Envoyer et recevoir q public void send(datagrampacket dp) throws IOException q public void receive(datagrampacket dp) throws IOException C. Delporte M2-Internet Rappel Java 14
Un exemple: Echo q UDPServeur v UDPEchoServeur q UDPEchoClient SenderThread ReceiverThread C. Delporte M2-Internet Rappel Java 15
Echo: UDPServeur import java.net.*; import java.io.*; public abstract class UDPServeur extends Thread { private int buffersize; protected DatagramSocket sock; public UDPServeur(int port, int buffersize) throws SocketException { this.buffersize = buffersize; this.sock = new DatagramSocket(port); public UDPServeur(int port) throws SocketException { this(port, 8192); public void run() { byte[] buffer = new byte[buffersize]; while (true) { DatagramPacket incoming = new DatagramPacket(buffer, buffer.length); try { sock.receive(incoming); this.respond(incoming); catch (IOException e) { System.err.println(e); // end while public abstract void respond(datagrampacket request); C. Delporte M2-Internet Rappel Java 16
UDPEchoServeur public class UDPEchoServeur extends UDPServeur { public final static int DEFAULT_PORT = 2222; public UDPEchoServeur() throws SocketException { super(default_port); public void respond(datagrampacket packet) { try { byte[] data = new byte[packet.getlength()]; System.arraycopy(packet.getData(), 0, data, 0, packet.getlength()); try { String s = new String(data, "8859_1"); System.out.println(packet.getAddress() + " port " + packet.getport() + " reçu " + s); catch (java.io.unsupportedencodingexception ex) { DatagramPacket outgoing = new DatagramPacket(packet.getData(), packet.getlength(), packet.getaddress(), packet.getport()); sock.send(outgoing); catch (IOException ex) { System.err.println(ex); C. Delporte M2-Internet Rappel Java 17
Client: UDPEchoClient public class UDPEchoClient { public static void lancer(string hostname, int port) { try { InetAddress ia = InetAddress.getByName(hostname); SenderThread sender = new SenderThread(ia, port); sender.start(); Thread receiver = new ReceiverThread(sender.getSocket()); receiver.start(); catch (UnknownHostException ex) { System.err.println(ex); catch (SocketException ex) { System.err.println(ex); // end lancer C. Delporte M2-Internet Rappel Java 18
ReceiverThread class ReceiverThread extends Thread { DatagramSocket socket; private boolean stopped = false; public ReceiverThread(DatagramSocket ds) throws SocketException { this.socket = ds; public void halt() { this.stopped = true; public DatagramSocket getsocket(){ return socket; public void run() { byte[] buffer = new byte[65507]; while (true) { if (stopped) return; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); try { socket.receive(dp); String s = new String(dp.getData(), 0, dp.getlength()); System.out.println(s); Thread.yield(); catch (IOException ex) {System.err.println(ex); C. Delporte M2-Internet Rappel Java 19
SenderThread public class SenderThread extends Thread { private InetAddress server; private DatagramSocket socket; private boolean stopped = false; private int port; public SenderThread(InetAddress address, int port) throws SocketException { this.server = address; this.port = port; this.socket = new DatagramSocket(); this.socket.connect(server, port); public void halt() { this.stopped = true; // C. Delporte M2-Internet Rappel Java 20
SenderThread // public DatagramSocket getsocket() { return this.socket; public void run() { try { BufferedReader userinput = new BufferedReader(new InputStreamReader(System.in)); while (true) { if (stopped) return; String theline = userinput.readline(); if (theline.equals(".")) break; byte[] data = theline.getbytes(); DatagramPacket output = new DatagramPacket(data, data.length, server, port); socket.send(output); Thread.yield(); // end try catch (IOException ex) {System.err.println(ex); // end run C. Delporte M2-Internet Rappel Java 21
Autres méthodes q public void close( ) q public int getlocalport( ) q public InetAddress getlocaladdress( ) q public SocketAddress getlocalsocketaddress( ) q public void connect(inetaddress host, int port) q public void disconnect( ) q public int getport( ) q public InetAddress getinetaddress( ) q public InetAddress getremotesocketaddress( ) C. Delporte M2-Internet Rappel Java 22
Options q SO_TIMEOUT v public synchronized void setsotimeout(int timeout) throws SocketException v public synchronized int getsotimeout( ) throws IOException q SO_RCVBUF v public void setreceivebuffersize(int size) throws SocketException v public int getreceivebuffersize( ) throws SocketException q SO_SNDBUF v public void setsendbuffersize(int size) throws SocketException v int getsendbuffersize( ) throws SocketException q SO_REUSEADDR (plusieurs sockets sur la même adresse) v public void setreuseaddress(boolean on) throws SocketException v boolean getreuseaddress( ) throws SocketException q SO_BROADCAST v public void setbroadcast(boolean on) throws SocketException v public boolean getbroadcast( ) throws SocketException C. Delporte M2-Internet Rappel Java 23
Multicast socket (UDP) C. Delporte M2-Internet Rappel Java 1-24
public class Mul1castSocket extends DatagramSocket Constructeur: Mul,castSocket() Mul,castSocket(int port) C. Delporte M2- Internet Rappel Java 25
Groupe formé sur une adresse IP de classe D Classe D: entre 224.0.0.0 et 255.255.255.255) Adresse 224.0.0.0 réservée Méthodes ges,on groupe void joingroup(inetaddress mcastaddr) void leavegroup(inetaddress mcastaddr) C. Delporte M2- Internet Rappel Java 26
Exemple InetAddress mul,castaddress ; // Une adresse IP speciale Mul,castSocket socket ; /* crea,on: */ socket = new Mul,castSocket (port) ; /* Adresse IP mul,cast pour envoyer dans le reseau local : */ mul,castaddress = InetAddress.getByName ("230.1.1.66") ; /* Indiquer qu'on veut recevoir les paquets a des,na,on de ce]e adresse de groupe : */ socket.joingroup (mul,castaddress) ; C. Delporte M2-Internet Rappel Java 1-2
Exemple ( suite) ByteBuffer b = ByteBuffer.allocate(1400) ; String msg = "envoi" ; b.put (msg.getbytes()) ; b.flip () ; /* limit devient la posi,on courante et posi,on est mis a 0 */ /* Le paquet : Une adresse IP, un port et des octets... */ DatagramPacket datagram = new DatagramPacket (b.array(), b.limit()) ; SocketAddress dest = new InetSocketAddress (mul,castaddress, port) ; datagram.setsocketaddress (dest) ; try { socket.send (datagram) ; catch (IOExcep,on e) { System.err.println (e) ; C. Delporte M2-Internet Rappel Java 1-2
Secure Socket Layer (SSLSocket) Package javax.net.ssl.*; C. Delporte M2-Internet Rappel Java 1-29
public abstract class SSLSocket extends Socket Stream sockets Fournit des services de sécurité: Authen,fica,on : le serveur est authen,fié, le client peut l être Confiden,alité: le message transmis est encrypté Intégrité: le message n est pas altéré C. Delporte M2- Internet Rappel Java 30
q Ces protections sont specifiées dans une «cypher suite» q Mécanisme de poignée de mains(handshake)pour se mettre d accord sur le chiffrage utilisé ( si pas de chiffrage commun pas de données échangées). Le but de ce processus est d établir une session C. Delporte M2-Internet Rappel Java 1-31
q Initiation du handshake: v StartHandshake() v Tout read ou write v getsession() q Mais pas à la création de la socket : permet de choisir une «cypher suite» autre que le défaut C. Delporte M2-Internet Rappel Java 1-3
U,lise un système : de cryptographie asymétrique ( type RSA) pour l authen,fica,on et l obten,on de clef de cryptage symétrique de cryptographie symétrique ( type DES) pour la communica,on C. Delporte M2- Internet Rappel Java 33
Coté serveur Une paire de clefs cryptographique (clef public, clef privée) Ces clefs sont stockées dans un «magasin» ( keystore) dans une structure de données protégée par un mot de passe keytool est un ou,l de ges,on de cer,ficats et de clefs C. Delporte M2- Internet Rappel Java 34
Coté client Il faut un «magasin» de clef en qui on a confiance ( truststore) contenant le cer,ficat correspondant à la clef public du serveur keytool permet d extraire le cer,ficat du magasin serveur et de l importer dans le magasin du client C. Delporte M2- Internet Rappel Java 35
Cer,ficat Coté serveur: Créa,on d une clef privée/public pour le serveur keytool - genkey - keystore server.jks - alias server - keyalg RSA (demande un mot de passe et autres infos) Extrac,on de la clef public keytool - export - keystore server.jks - alias server - file server.crt C. Delporte M2- Internet Rappel Java 36
Cer,ficat Cote client ( qui dispose de server.crt) keytool - import - alias server - file server.crt - keystore client.jsk C. Delporte M2- Internet Rappel Java 37
Coté serveur System.setProperty("javax.net.ssl.keyStore", "server.jsk"); System.setProperty("javax.net.ssl.keyStorePassword ", "123456"); (123456 mot de passe) Ou java -Djavax.net.ssl.keyStore=server.jsk - Djavax.net.ssl.keyStorePassword=123456 SecureServer C. Delporte M2-Internet Rappel Java 1-3
Coté client System.setProperty("javax.net.ssl.trustStore", "client.jsk"); System.setProperty("javax.net.ssl.trustStorePasswo rd", "123456"); ( 123456 mot de passe) Ou java -Djavax.net.ssl.trustStore=client.jsk -Djavax.net.ssl.trustStorePassword=123456 SecureClient C. Delporte M2-Internet Rappel Java 1-3
1. Client Hello à 2. ß Serveur Hello 3. ß Cer,ficate 4. ß 5. ß Server Hello done C. Delporte M2- Internet Rappel Java 40
1. Client Key exchange à 2.. à 3. Finished à 4. Encrypted Data ß à 5. Close Messages ß à C. Delporte M2- Internet Rappel Java 41
Création socket q Coté serveur SSLServerSocketFactory socketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket serversocket = (SSLServerSocket) socketfactory.createserversocket(port); q Coté Client SSLSocketFactory socketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket socket = (SSLSocket)socketFactory.createSocket(site, port); C. Delporte M2-Internet Rappel Java 1-4
SecureClient.java (echo) import java.io.*; import javax.net.ssl.*; class SecureClient { public static void main(string args[]) { System.setProperty("javax.net.ssl.trustStore", "moncertif"); System.setProperty("javax.net.ssl.trustStorePassword", "123456"); try { SSLSocketFactory socketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); SSLSocket socket = (SSLSocket) socketfactory.createsocket("localhost", 1664); PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); String camarche = "ca marche! "; output.println(camarche); output.flush(); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); String response = input.readline(); System.out.println(response); output.close(); input.close(); socket.close(); catch (IOException ioexception) {System.out.println(" SecureClient IOException "); finally {System.exit(0); C. Delporte M2-Internet Rappel Java 1-4
SecureServer.java import java.io.*; import javax.net.ssl.*; class SecureServer { private SSLServerSocket serversocket; public SecureServer() throws Exception { System.setProperty("javax.net.ssl.keyStore", "server.jsk"); System.setProperty("javax.net.ssl.keyStorePassword", "123456"); SSLServerSocketFactory socketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); serversocket = (SSLServerSocket) socketfactory.createserversocket(1664); C. Delporte M2-Internet Rappel Java 1-4
SecureServer.java private void runserver() { while (true) { try { System.err.println(" Waiting for connection "); SSLSocket socket = (SSLSocket) serversocket.accept(); BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); String a=input.readline(); System.out.println("le serveur a eu "+a); output.println(" C est bon, " + a); output.close(); input.close(); socket.close(); catch (IOException ioexception) { public static void main(string args[]) throws Exception { System.err.println(" main for connection "); SecureServer server = new SecureServer(); server.runserver(); ; C. Delporte M2-Internet Rappel Java 1-4