Apache HttpClient - Contesto SSL personalizzato

Utilizzando Secure Socket Layer, è possibile stabilire una connessione protetta tra il client e il server. Aiuta a salvaguardare informazioni sensibili come numeri di carte di credito, nomi utente, password, pin, ecc.

È possibile rendere le connessioni più sicure creando il proprio contesto SSL utilizzando il HttpClient biblioteca.

Seguire i passaggi indicati di seguito per personalizzare SSLContext utilizzando la libreria HttpClient -

Passaggio 1: creare l'oggetto SSLContextBuilder

SSLContextBuilderè il generatore per gli oggetti SSLContext. Crea il suo oggetto usando ilcustom() metodo del SSLContexts classe.

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

Passaggio 2: caricare il keystore

Nel percorso Java_home_directory/jre/lib/security/, puoi trovare un file denominato cacerts. Salvalo come file di archivio chiavi (con estensione .jks). Carica il file keystore e la sua password (che èchangeit per impostazione predefinita) utilizzando il loadTrustMaterial() metodo del SSLContextBuilder classe.

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

Passaggio 3: crea un oggetto SSLContext

Un oggetto SSLContext rappresenta un'implementazione del protocollo socket sicuro. Crea un SSLContext usandobuild() metodo.

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

Passaggio 4: creazione dell'oggetto SSLConnectionSocketFactory

SSLConnectionSocketFactoryè una fabbrica di socket a più livelli per connessioni TSL e SSL. In questo modo, puoi verificare il server Https utilizzando un elenco di certificati attendibili e autenticare il server Https specificato.

Puoi crearlo in molti modi. A seconda del modo in cui crei un fileSSLConnectionSocketFactory oggetto, puoi consentire tutti gli host, consentire solo certificati autofirmati, consentire solo protocolli particolari, ecc.

To allow only particular protocols, creare SSLConnectionSocketFactory passando un oggetto SSLContext, la matrice di stringhe che rappresenta i protocolli deve essere supportata, la matrice di stringhe che rappresenta i semi di cifratura deve essere supportata e un oggetto HostnameVerifier al suo costruttore.

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

To allow all hosts, creare SSLConnectionSocketFactory oggetto passando un oggetto SSLContext e un file NoopHostnameVerifier oggetto.

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

Passaggio 5: creare un oggetto HttpClientBuilder

Crea un oggetto HttpClientBuilder usando il custom() metodo del HttpClients classe.

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

Passaggio 6: impostare l'oggetto SSLConnectionSocketFactory

Impostare l'oggetto SSLConnectionSocketFactory su HttpClientBuilder usando il setSSLSocketFactory() metodo.

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

Passaggio 7: creare l'oggetto CloseableHttpClient

Costruisci il file CloseableHttpClient oggetto chiamando il build() metodo.

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

Passaggio 8: creare un oggetto HttpGet

Il HttpGet class rappresenta la richiesta HTTP GET che recupera le informazioni del server dato utilizzando un URI.

Creare una richiesta HTTP GET istanziando la classe HttpGet passando una stringa che rappresenta l'URI.

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

Passaggio 9: eseguire la richiesta

Eseguire la richiesta utilizzando il execute() metodo.

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

Esempio

L'esempio seguente mostra la personalizzazione di 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);
      } 
   }
}

Produzione

All'esecuzione, il programma precedente genera il seguente output.

HTTP/1.1 200 OK
1270