Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec Java et SSL

4 réponses
Avatar
John.ETTEDGUI
Bonjour,

j'ai un petit soucis avec SSL en fait :
je travaille sur une application de partage de fichier, et on m'a
demand=E9 de s=E9curiser les connections, par cons=E9quent je suis partis
sur SSL (au d=E9but on m'avait demand=E9 SSH mais je trouvais cela un peu
gros par rapport =E0 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=E9seau
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=E9es) ).
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=EAme server, au bout
d'un moment il y a un probl=E8me 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=E9quent le server ne recoit plus le fichier que d'une personne ...
Je ne sais pas si c'est tr=E8s clair, mais en gros au bout d'un moment
les 2 utilisateurs envoient sur le m=EAme port et donc un est jet=E9 (je
travaille en TCP)..

Voici le code utilis=E9 pour le server :

protected SSLServerSocket serverSocket;
protected SSLSocket socket;
public int PORT;
public static final String KEYSTORE_FILE =3D "server_keystore";
public static final String ALGORITHM =3D "sunx509";
public static final String PASSWORD =3D "password";

protected Server(int port){

PORT =3D port;
serverSocket =3D null;
KeyManagerFactory kmf;
KeyManager[] km;
KeyStore ks;
TrustManagerFactory tmf;
TrustManager[] tm;
SSLContext sslc;
try {
ks =3D KeyStore.getInstance("JKS");
ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
kmf =3D KeyManagerFactory.getInstance(ALGORITHM);
kmf.init(ks, PASSWORD.toCharArray());
km =3D kmf.getKeyManagers();
tmf =3D TrustManagerFactory.getInstance(ALGORITHM);
tmf.init(ks);
tm =3D tmf.getTrustManagers();
sslc =3D SSLContext.getInstance("TLS");
sslc.init(km, tm, null);
SSLServerSocketFactory ssf =3D sslc.getServerSocketFactory();
serverSocket =3D (SSLServerSocket) ssf.createServerSocket(PORT);
//serverSocket =3D new ServerSocket(PORT);
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


reception de message :
socket =3D (SSLSocket) serverSocket.accept();
ObjectInputStream objIn =3D new
ObjectInputStream(socket.getInputStream());


reception de fichier
socket =3D (SSLSocket) serverSocket.accept();
in =3D socket.getInputStream();


code du client :
private String address;
private SSLSocket socket;
public int PORT;
public static final String KEYSTORE_FILE =3D "client_keystore";
public static final String ALGORITHM =3D "sunx509";
public static final String PASSWORD =3D "password";
private SSLSocketFactory sf;

public Client(){

socket =3D null;
KeyManagerFactory kmf;
KeyStore ks;
TrustManagerFactory tmf;
SSLContext sslc;

try {
kmf =3D KeyManagerFactory.getInstance(ALGORITHM);
ks =3D KeyStore.getInstance("JKS");
ks.load(new FileInputStream(KEYSTORE_FILE), PASSWORD.toCharArray());
kmf.init(ks, PASSWORD.toCharArray());
tmf =3D TrustManagerFactory.getInstance(ALGORITHM);
tmf.init(ks);
sslc =3D SSLContext.getInstance("TLS");
sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
sf =3D sslc.getSocketFactory();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

envoie de message :
socket =3D (SSLSocket) sf.createSocket(user.getIpAdress(), PORT);
objOut =3D new ObjectOutputStream(socket.getOutputStream());

envoie de flux :
socket =3D (SSLSocket) sf.createSocket(user.getIpAdress(),PORT);
os =3D socket.getOutputStream();

J'ai g=E9n=E9r=E9 les certificats SSL sur un pc, auto certifi=E9 et je les
ai distribu=E9s sur les autres machines (j'ai suivi ce que disait ce
site :
http://www.labo-sun.com/resource-FR-articles-625-0-java-autre-reseau-io-con=
nexion-socket-securisee-en-java.htm)


Merci bien pour toute aide que vous pourriez m'apporter,

Cordialement,

John

4 réponses

Avatar
alexandre cartapanis
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 part is
sur SSL (au début on m'avait demandé SSH mais je trouvais cela un p eu
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é (j e
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-FR-articles-625-0-java-autre-reseau-io -connexion-socket-securisee-en-java.htm)


Merci bien pour toute aide que vous pourriez m'apporter,

Cordialement,

John



D'après ce que j'ai compris de votre souci, plusieurs client tente de s e
connecter sur le même port, et cela pose problème.

Une solution "facile" est d'utiliser un seul port pour les messages, et
d'utiliser un port "aléatoire" pour les fichiers. Cela corresponds en
gros au mode actif/passif du ftp. Le serveur envoie un message "tu peux
m'envoyer un fichier sur le port XXX" ou XXX est aléatoire et non
utilisé. Le serveur ouvre alors une socket sur le port mentionner.
Le client recois le port par un message et se connecte directement sur
ce port.
Une fois la transaction terminée, le serveur referme le port, et attend s
qu'on lui en demande un autre si besoin est.

L'inconvénient principale de cette méthode est le firewall.



--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
John
Bonjour,

en fait il s'agit plus ou moins de ce qui est fait pour le moment.
Chaque client alloue un port pour le transfert de fichier pour un autre
client, et lui envoie le port alloué dans un message. C'est ce message
qui semble poser problème.

J'ai oublié de préciser que le problème que j'ai ne proviens pas si
on transforme les servers / clients SSL en servers/clients normaux,
d'où le fait que je pense que le problème vienne de SSL.
Avatar
alexandre cartapanis
Bonjour,

en fait il s'agit plus ou moins de ce qui est fait pour le moment.
Chaque client alloue un port pour le transfert de fichier pour un autre
client, et lui envoie le port alloué dans un message. C'est ce messag e
qui semble poser problème.

J'ai oublié de préciser que le problème que j'ai ne proviens pas si
on transforme les servers / clients SSL en servers/clients normaux,
d'où le fait que je pense que le problème vienne de SSL.

Ben alors je vois pas...


Peut être qu'il y a des problèmes avec l'implémentation de SSL, mem e si
ca parait peu probable...

A voir les forums de sun, peut être que c'est mentionné quelque part. ..
La liste des forum: http://forum.java.sun.com/index.jspa
le forum JSSE (extension SSL et TLS):
http://forum.java.sun.com/forum.jspa?forumID=2

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email

Avatar
John
alexandre cartapanis wrote:
Bonjour,

en fait il s'agit plus ou moins de ce qui est fait pour le moment.
Chaque client alloue un port pour le transfert de fichier pour un autre
client, et lui envoie le port alloué dans un message. C'est ce message
qui semble poser problème.

J'ai oublié de préciser que le problème que j'ai ne proviens pas si
on transforme les servers / clients SSL en servers/clients normaux,
d'où le fait que je pense que le problème vienne de SSL.

Ben alors je vois pas...


Peut être qu'il y a des problèmes avec l'implémentation de SSL, mem e si
ca parait peu probable...

A voir les forums de sun, peut être que c'est mentionné quelque part. ..
La liste des forum: http://forum.java.sun.com/index.jspa
le forum JSSE (extension SSL et TLS):
http://forum.java.sun.com/forum.jspa?forumID=2

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email


Je vais regarder sur ces forums,
merci.