Introduction à SSL en Java

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dans ce didacticiel, nous présenterons SSL et explorerons comment nous pouvons l'utiliser en Java à l'aide de l'API JSSE (Java Secure Socket Extension).

2. Présentation

En termes simples, le Secure Socket Layer (SSL) permet une connexion sécurisée entre deux parties , généralement des clients et des serveurs.

SSL fournit un canal sécurisé entre deux appareils fonctionnant via une connexion réseau. Un exemple habituel de SSL est de permettre des communications sécurisées entre les navigateurs Web et les serveurs Web.

Dans ce cas précis, les navigateurs Web utiliseront des connexions HTTPS (S pour Secured) pour accéder aux ressources fournies par des serveurs Web distincts.

SSL est nécessaire pour prendre en charge les trois principaux principes de sécurité des informations:

  • Cryptage : protégez les transmissions de données entre les parties
  • Authentification : assurez-vous que le serveur auquel nous nous connectons est bien le bon serveur
  • Intégrité des données : garantir que les données demandées sont celles qui sont effectivement livrées

Java fournit plusieurs API basées sur la sécurité qui aident les développeurs à établir des connexions sécurisées avec le client pour recevoir et envoyer des messages dans un format chiffré:

  • Extension Java Secured-Socket (JSSE)
  • Architecture de cryptographie Java (JCA)
  • Extension cryptographique Java (JCE)

Dans les sections suivantes, nous présenterons l'extension Secure Socket que Java utilise pour permettre une communication sécurisée.

3. API JSSE

Les API de sécurité Java utilisent largement le modèle de conception Factory .

En fait, tout est instancié à l'aide d'une fabrique en JSSE.

3.1. SSLSocketFactory

Le javax.net.ssl.SSLSocketFactory est utilisé pour créer des SSLSocket objets.

Cette classe contient trois groupes d'API.

Le premier groupe se compose d'une seule méthode statique getDefault () utilisée pour récupérer l'instance par défaut qui, à son tour, peut créer des instances SSLSocket .

Le deuxième groupe se compose de cinq méthodes pouvant être utilisées pour créer des instances SSLSocket :

  • Socket createSocket (hôte de chaîne, port int)
  • Socket createSocket (chaîne hôte, port int, InetAddress clientHost, int clientPort)
  • Socket createSocket (hôte InetAddress, port int)
  • Socket createSocket (hôte InetAddress, port int, InetAddress clientHost, int clientPort)
  • Socket createSocket (socket de socket, hôte de chaîne, port int, booléen autoClose)

Nous pouvons utiliser cette classe directement en obtenant l'instance par défaut ou en utilisant un javax.net.ssl. Objet SSLContext qui contient des méthodes pour obtenir une instance SSLSocketFactory .

3.2. SSLSocket

Cette classe étend la classe Socket et fournit un socket sécurisé. Ces sockets sont des sockets de flux normaux.

En outre, ils ajoutent une couche de protections de sécurité sur le protocole de transport réseau sous-jacent.

Les instances SSLSocket construisent une connexion SSL vers un hôte nommé sur un port spécifié.

Cela permet de lier le côté client de la connexion à une adresse et un port donnés.

3.3. SSLServerSocketFactory

La classe SSLServerSocketFactory est assez similaire à SSLSocketFactory à la différence qu'elle crée des instances SSLServerSocket à la place des instances SSLSocket .

Par similitude, les méthodes sont appelées createServerSocket comme analogues à la classe SSLSocketFactory .

3.4. SSLServerSocket

La classe SSLServerSocket est analogue à la classe SSLSocket . Les méthodes de la classe SSLServerSocket sont un sous-ensemble des méthodes de classe SSLSocket . Ils agissent de l'autre côté d'une connexion SSL

4. Exemple SSL

Prenons un exemple de la façon dont nous pouvons créer une connexion sécurisée à un serveur:

String host = getHost(...); Integer port = getPort(...); SSLSocketFactory sslsocketfactory = SSLSocketFactory.getDefault(); SSLSocket sslsocket = (SSLSocket) sslsocketfactory .createSocket(host, port); InputStream in = sslsocket.getInputStream(); OutputStream out = sslsocket.getOutputStream(); out.write(1); while (in.available() > 0) { System.out.print(in.read()); } System.out.println("Secured connection performed successfully"); 

Au cas où nous obtiendrions l'erreur «javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: la création du chemin PKIX a échoué: sun.security.provider.certpath.SunCertPathBuilderException: impossible de trouver un chemin de certification valide vers la cible demandée lors de l'établissement du Connexion SSL » , cela indique que nous n'avons pas le certificat public du serveur que nous essayons de connecter dans le truststore Java.

Le truststore est le fichier contenant les certificats approuvés que Java utilise pour valider les connexions sécurisées.

Afin de résoudre ce problème, nous avons plusieurs options:

  • ajoutez le certificat public du serveur au truststore cacerts par défaut utilisé par Java. lors du lancement de la connexion SSL
  • Définissez le fichier javax.net. ssl . La variable d'environnement trustStore pour pointer vers le fichier truststore afin que l'application puisse récupérer ce fichier qui contient le certificat public du serveur auquel nous nous connectons.

Les étapes d'installation d'un nouveau certificat dans le magasin de clés de confiance par défaut Java sont les suivantes:

  1. extraire le certificat du serveur: openssl s_client -connect server: 443
  2. importer le certificat dans le truststore à l'aide de keytool: keytool -import -alias alias.server.com -keystore $ JAVA_HOME / jre / lib / security / cacerts

Une fois que nous avons fait cela, nous devrions être en mesure d'exécuter à nouveau l'exemple et d'obtenir le message de connexion sécurisée effectuée avec succès .

5. Conclusion

Dans cet article, nous avons présenté l'API SSL et JSSE, qui implémente SSL pour Java. En utilisant SSL et JSSE, nous pouvons rendre nos applications Java et les communications entre les applications et à l'intérieur de l'application plus sûres.

Comme toujours, le code présenté dans cet article est disponible à l'adresse over sur Github.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS