Apache HttpClient - Contexte SSL personnalisé

À l'aide de Secure Socket Layer, vous pouvez établir une connexion sécurisée entre le client et le serveur. Il aide à protéger les informations sensibles telles que les numéros de carte de crédit, les noms d'utilisateur, les mots de passe, les broches, etc.

Vous pouvez rendre les connexions plus sécurisées en créant votre propre contexte SSL à l'aide du HttpClient bibliothèque.

Suivez les étapes ci-dessous pour personnaliser SSLContext à l'aide de la bibliothèque HttpClient -

Étape 1 - Créer un objet SSLContextBuilder

SSLContextBuilderest le générateur des objets SSLContext. Créez son objet à l'aide ducustom() méthode de la SSLContexts classe.

//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();

Étape 2 - Charger le keystore

Sur le chemin Java_home_directory/jre/lib/security/, vous pouvez trouver un fichier nommé cacerts. Enregistrez-le en tant que fichier de stockage de clés (avec l'extension .jks). Chargez le fichier keystore et son mot de passe (qui estchangeit par défaut) en utilisant le loadTrustMaterial() méthode de la SSLContextBuilder classe.

//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());

Étape 3 - Créer un objet SSLContext

Un objet SSLContext représente une implémentation de protocole de socket sécurisé. Créez un SSLContext à l'aide debuild() méthode.

//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();

Étape 4 - Création de l'objet SSLConnectionSocketFactory

SSLConnectionSocketFactoryest une fabrique de sockets en couches pour les connexions TSL et SSL. Grâce à cela, vous pouvez vérifier le serveur Https à l'aide d'une liste de certificats de confiance et authentifier le serveur Https donné.

Vous pouvez créer cela de plusieurs manières. Selon la façon dont vous créez unSSLConnectionSocketFactory objet, vous pouvez autoriser tous les hôtes, autoriser uniquement les certificats auto-signés, autoriser uniquement des protocoles particuliers, etc.

To allow only particular protocols, créer SSLConnectionSocketFactory objet en passant un objet SSLContext, un tableau de chaînes représentant les protocoles doit être pris en charge, un tableau de chaînes représentant les combinaisons de chiffrement doit être pris en charge et un objet HostnameVerifier à son constructeur.

new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,    
   SSLConnectionSocketFactory.getDefaultHostnameVerifier());

To allow all hosts, créer SSLConnectionSocketFactory objet en passant un objet SSLContext et un NoopHostnameVerifier objet.

//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());

Étape 5 - Créez un objet HttpClientBuilder

Créez un objet HttpClientBuilder à l'aide du custom() méthode de la HttpClients classe.

//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Étape 6 - Définissez l'objet SSLConnectionSocketFactory

Définissez l'objet SSLConnectionSocketFactory sur HttpClientBuilder en utilisant le setSSLSocketFactory() méthode.

//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

Étape 7 - Créer l'objet CloseableHttpClient

Construisez le CloseableHttpClient objet en appelant le build() méthode.

//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();

Étape 8 - Créer un objet HttpGet

le HttpGet La classe représente la requête HTTP GET qui récupère les informations du serveur donné à l'aide d'un URI.

Créez une requête HTTP GET en instanciant la classe HttpGet en passant une chaîne représentant l'URI.

//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");

Étape 9 - Exécutez la demande

Exécutez la requête à l'aide du execute() méthode.

//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);

Exemple

L'exemple suivant montre la personnalisation du SSLContrext -

import java.io.File;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

public class ClientCustomSSL {
   
   public final static void main(String[] args) throws Exception {

      //Creating SSLContextBuilder object
      SSLContextBuilder SSLBuilder = SSLContexts.custom();
  
      //Loading the Keystore file
      File file = new File("mykeystore.jks");
      SSLBuilder = SSLBuilder.loadTrustMaterial(file,
         "changeit".toCharArray());

      //Building the SSLContext usiong the build() method
      SSLContext sslcontext = SSLBuilder.build();
 
      //Creating SSLConnectionSocketFactory object
      SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
 
      //Creating HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the SSLConnectionSocketFactory
      clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

      //Building the CloseableHttpClient
      CloseableHttpClient httpclient = clientbuilder.build();
      
      //Creating the HttpGet request
      HttpGet httpget = new HttpGet("https://example.com/");
 
      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //printing the status line
      System.out.println(httpresponse.getStatusLine());

      //Retrieving the HttpEntity and displaying the no.of bytes read
      HttpEntity entity = httpresponse.getEntity();
      if (entity != null) {
         System.out.println(EntityUtils.toByteArray(entity).length);
      } 
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante.

HTTP/1.1 200 OK
1270