2013-01-05 4 views
2

J'ai un programme serveur simple qui collecte des données à partir de nombreux périphériques matériels sur un réseau sans fil ouvert. Je veux m'assurer que quiconque se connecte à mon port ne peut pas envoyer de commandes ou écouter mon trafic, j'ai donc besoin du serveur pour valider le client. J'ai trouvé quelques exemples mais la plupart semblent prendre l'approche de la validation du serveur du côté client. Je suis nouveau à la programmation SSL et Socket.Authentification client Java Sockets SSL

À partir du client je

KeyStore keystore = KeyStore.getInstance("JKS"); 
keystore.load(new FileInputStream("KeyStore"), "password".toCharArray()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
tmf.init(keystore); 

SSLContext context = SSLContext.getInstance("TLS"); 
TrustManager[] trustManagers = tmf.getTrustManagers(); 

context.init(null, trustManagers, null); 

SSLSocketFactory sf = context.getSocketFactory(); 
return (SSLSocket) sf.createSocket(host, port); 

Et sur le serveur je

KeyStore ks = KeyStore.getInstance("JKS"); 
ks.load(newFileInputStream("server"),"password".toCharArray()); 
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
kmf.init(ks, "password".toCharArray()); 
SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(kmf.getKeyManagers(), null, null); 
SSLServerSocketFactory ssf = sc.getServerSocketFactory(); 
server = (SSLServerSocket) ssf.createServerSocket(this.port); 

Je ne suis pas sûr de ce que tout est fait, mais l'exemple je l'ai trouvé est à 2 voies authentification, donc une certaine exagération. Je pense que j'ai juste besoin d'un de ces morceaux de code, mais je ne comprends pas assez bien le SSL pour savoir lequel. De quel côté a besoin du fichier de clés? Qui a besoin de clés et de certificats? Merci

+1

L'authentification bidirectionnelle n'est pas une «overkill», c'est l'authentification du serveur et l'authentification du client, ce dont vous avez besoin si vous ne voulez pas que les autres écoutent votre trafic. Si le serveur doit faire confiance aux périphériques, les périphériques doivent également faire confiance au serveur sûrement? – EJP

+0

Merci pour la réponse. La chose qui me préoccupe le plus est quelqu'un qui se connecte à mon port et qui tente d'envoyer des commandes au serveur. Je ne suis pas si préoccupé par l'authentification du serveur, car ces appareils maintiendront les connexions au serveur pendant de longues périodes. Je pensais que je réduirais l'entretien et la complexité en le gardant à sens unique. – Shoe

Répondre

2

Si vous voulez juste d'ajouter l'authentification du client à l'authentification de votre serveur existant, ajoutez cette ligne à la fin de votre code serveur:

server.setNeedClientAuth(true); 

Si vous souhaitez que le serveur d'autoriser le client et non vice inversement, appelez server.setUseClientMode(true) sur le serveur et setUseClientMode(false) sur le SSLSocket que vous créez sur le client avant de le renvoyer. Notez que cette option signifie que les machines clientes peuvent se connecter au serveur de quelqu'un d'autre et n'auraient aucun moyen de le savoir.

Dans les deux cas, le serveur aura besoin d'un fichier de clés certifiées - qui peut être identique à son fichier de clés - avec une copie du ou des certificats que les clients présentent. Les clients auront besoin de paires de clés qui présentent ce (s) certificat (s).

+0

Vous n'êtes pas sûr de devoir mentionner 'server.setUseClientMode (true)', cela rend la réponse plus compliquée que nécessaire. Cela fait également du serveur TCP le client SSL/TLS et vice versa, donc ce n'est plus vraiment une authentification client-certificat. – Bruno

+1

Cette partie a été incluse car le demandeur semblait vouloir uniquement l'authentification du client - où "client" signifie "client TCP", pas "client SSL/TLS". Je suis d'accord que ce n'est pas le cas d'utilisation normal, mais je voulais répondre à la question complètement. –