Introduction à SSL en Java

Introduction à SSL en Java

1. Vue d'ensemble

Dans ce tutoriel, nous allons présenter SSL et découvrir comment nous pouvons l'utiliser en Java à l'aide de l'API JSSE (Java Secure Socket Extension).

2. introduction

En termes simples, lesSecured Socket Layer (SSL) enables a secured connection between two parties, généralement des clients et des serveurs.

SSL fournit un canal sécurisé entre deux périphériques fonctionnant via une connexion réseau. Un exemple habituel de SSL consiste à activer les communications sécurisées entre les navigateurs Web et les serveurs Web.

Dans ce cas particulier, 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:

  • Encryption: protéger les transmissions de données entre les parties

  • Authentication: assurez-vous que le serveur auquel nous nous connectons est bien le bon serveur

  • Data integrity: garantir que les données demandées sont ce qui est effectivement livré

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 crypté:

  • 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 deFactory.

En fait, tout est instancié à l’aide d’une usine JSSE.

3.1. SSLSocketFactory

Lejavax.net.ssl.SSLSocketFactory est utilisé pour créer des objetsSSLSocket.

Cette classe contient trois groupes d'API.

Le premier groupe se compose d'une seule méthode statiquegetDefault() 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 qui peuvent être utilisées pour créer des instancesSSLSocket:

  • 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 objetjavax.net.ssl.SSLContext qui contient des méthodes pour obtenir une instanceSSLSocketFactory.

3.2. SSLSocket

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

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

Les instances deSSLSocket 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 classeSSLServerSocketFactory est assez similaire àSSLSocketFactory à la différence qu'elle crée des instancesSSLServerSocket à la place des instancesSSLSocket.

Par similitude, les méthodes sont appeléescreateServerSocket comme analogues à la classeSSLSocketFactory.

3.4. SSLServerSocket

La classeSSLServerSocket est analogue à la classeSSLSocket. Les méthodes de la classe SSLServerSocket sont un sous-ensemble des méthodes de classeSSLSocket. 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: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target while establishing the SSL connection”,it indicates that we don’t have the public certificate of the server which we’re trying to connect in the Java truststore.

Le fichier de clés certifiées est le fichier contenant les certificats sécurisés utilisés par Java pour valider les connexions sécurisées.

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

  • ajoutez le certificat public du serveur auxcacerts truststore par défaut utilisés par Java. lors de l'établissement de la connexion SSL

  • Définissez la variable d'environnementjavax.net.ssl.trustStore pour qu'elle pointe 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 pour installer un nouveau certificat dans le fichier de clés certifiées 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 pouvoir réexécuter l'exemple et obtenir le messageSecured connection performed successfully.

5. Conclusion

Dans cet article, nous avons présenté les API SSL et JSSE, qui implémentent 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 disponibleover on Github.