7 votes

Sécuriser les connexions TCP en Java

Je me demandais quelle était la meilleure façon de sécuriser une connexion TCP en Java. Je veux que les communications vers mon serveur ne proviennent que de clients authentifiés et, si possible, crypter les données transmises.

Quels types de problèmes vais-je devoir surveiller et couvrir, quelles technologies pourrais-je utiliser ?

Merci,

Tim.

3voto

Cratylus Points 21838

Java offre une extension des sockets qui est sécurisée. JSSE qui prend en charge SSLv3 et TLS.
Il est conçu de manière à ce que votre code soit similaire à la manipulation de sockets normaux.
Il suffit d'initialiser le SSLContext et de le configurer pour qu'il utilise les certificats à utiliser et divers paramètres, par exemple l'authentification du client, l'écouteur de poignée de main, etc. et le reste est géré de manière transparente.
Lisez le tutoriel pour vous y mettre.

2voto

Paŭlo Ebermann Points 35526

La méthode habituelle serait SSL, comme déjà dit. Il prend en charge l'authentification et le cryptage (obligatoires) du serveur par défaut, l'authentification du client étant facultative (par exemple, selon la configuration, le serveur peut s'assurer que les clients sont authentifiés).

En Java, vous pouvez utiliser SSLSocket (et SSLServerSocket) (ou les classes de fabrique respectives), ou le SSLEngine (si vous voulez faire des IO non bloquantes). Ou une API de plus haut niveau qui utilise ceci sous couvert.

Une autre option serait le SSH protocole. Cela permet une connexion cryptée et (normalement) authentifiée des deux côtés, sur laquelle on peut acheminer plusieurs canaux . Il est généralement utilisé pour l'exécution de commandes à distance ou le transfert de fichiers, mais il permet également le transfert de port.

En Java, cela serait mis en œuvre (du côté client) par exemple par JSch . Je ne connais pas d'implémentation Java côté serveur - mais vous pouvez utiliser un serveur OpenSSH normal et transférer les ports à votre processus de serveur Java.

0voto

Szocske Points 2371

SSL est vraiment bien supporté (il est utilisé dans HTTPS après tout). Basé sur Publik Key Infrastructure, il offre une variété de schémas de cryptage et d'authentification.

0voto

Nasko Points 616

Vous devez vous demander contre quoi vous vous protégez. Si vous voulez autoriser uniquement les clients authentiques, vous devez définir comment vous le déterminez. Si vous autorisez un trafic entièrement en clair, ce n'est pas sûr, car n'importe quel homme du milieu sera capable de modifier le trafic. Vous devez au moins protéger l'intégrité des données que vous échangez.

Je suis d'accord avec la plupart des gens pour dire que le SSL est probablement l'approche la plus simple pour ce faire. Vous devrez utiliser des certificats clients pour permettre l'authentification du côté client de la connexion. Vous avez deux approches pour utiliser les certificats clients :

  • créer un certificat auto-signé pour chaque client, puis conserver une base de données du mappage certificat->client et interroger la base de données au moment de la vérification du certificat du client.
  • Vous pouvez également créer votre propre certificat d'autorité de certification racine et émettre un certificat pour chaque client. Vous devrez ensuite vérifier que le certificat du client est correctement chaîné à votre certificat d'autorité de certification racine lors de la vérification du certificat du client.

Le choix de l'approche à adopter vous appartient entièrement et est tout aussi sûr. Choisissez la conception qui correspond le mieux à votre projet actuel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X