Bonjour,
j'ai un petit soucis avec SSL en fait :
je travaille sur une application de partage de fichier, et on m'a demandé de sécuriser les connections, par conséquent je suis partis sur SSL (au début on m'avait demandé SSH mais je trouvais cela un peu gros par rapport à mes besoins ...).
J'utilise un server de message pour mon application, et un server de fichier par utilisateur pour l'application (en gros si j'ai un réseau avec moi et 2 personnes, j'aurais sur mon pc un server de message, 2 servers de fichiers, et un client globale (messsages et flux de données) ).
Quand un client envoie un fichier sur un server la connection SSL se passe bien, etc pas de soucis.
Quand 2 clients envoie chacun un fichier sur le même server, au bout d'un moment il y a un problème sur les messages (je ne vois pas vraiment ou d'ailleurs) et les 2 utilisateurs recoivent leur message (on voit bien les destinataires, les messages etc) mais par contre l'un des deux recoit comme port de connection celui de l'autre, et par conséquent le server ne recoit plus le fichier que d'une personne ... Je ne sais pas si c'est très clair, mais en gros au bout d'un moment les 2 utilisateurs envoient sur le même port et donc un est jeté (je travaille en TCP)..
Voici le code utilisé pour le server :
protected SSLServerSocket serverSocket;
protected SSLSocket socket;
public int PORT;
public static final String KEYSTORE_FILE = "server_keystore";
public static final String ALGORITHM = "sunx509";
public static final String PASSWORD = "password";
protected Server(int port){
PORT = port;
serverSocket = null;
KeyManagerFactory kmf;
KeyManager[] km;
KeyStore ks;
TrustManagerFactory tmf;
TrustManager[] tm;
SSLContext sslc;
try {
ks = KeyStore.getInstance("JKS" );
ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
kmf = KeyManagerFactory.getInstance(ALGORITHM);
kmf.init(ks, PASSWORD.toCharArray());
km = kmf.getKeyManagers();
tmf = TrustManagerFactory.getInstance(ALGORITHM);
tmf.init(ks);
tm = tmf.getTrustManagers();
sslc = SSLContext.getInstance("TLS" );
sslc.init(km, tm, null);
SSLServerSocketFactory ssf = sslc.getServerSocketFactory();
serverSocket = (SSLServerSocket) ssf.createServerSocket(PORT);
//serverSocket = new ServerSocket(PORT);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
reception de message :
socket = (SSLSocket) serverSocket.accept();
ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream());
reception de fichier
socket = (SSLSocket) serverSocket.accept();
in = socket.getInputStream();
code du client :
private String address;
private SSLSocket socket;
public int PORT;
public static final String KEYSTORE_FILE = "client_keystore";
public static final String ALGORITHM = "sunx509";
public static final String PASSWORD = "password";
private SSLSocketFactory sf;
public Client(){
socket = null;
KeyManagerFactory kmf;
KeyStore ks;
TrustManagerFactory tmf;
SSLContext sslc;
try {
kmf = KeyManagerFactory.getInstance(ALGORITHM);
ks = KeyStore.getInstance("JKS" );
ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
kmf.init(ks, PASSWORD.toCharArray());
tmf = TrustManagerFactory.getInstance(ALGORITHM);
tmf.init(ks);
sslc = SSLContext.getInstance("TLS" );
sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
sf = sslc.getSocketFactory();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
envoie de message :
socket = (SSLSocket) sf.createSocket(user.getIpAdress(), PORT);
objOut = new ObjectOutputStream(socket.getOutputStream());
envoie de flux :
socket = (SSLSocket) sf.createSocket(user.getIpAdress(),PORT);
os = socket.getOutputStream();
J'ai généré les certificats SSL sur un pc, auto certifié et je les ai distribués sur les autres machines (j'ai suivi ce que disait ce site : http://www.labo-sun.com/resource-F [...] -java.htm)
Merci bien pour toute aide que vous pourriez m'apporter,