Apache HttpClient: contexto SSL personalizado

Con Secure Socket Layer, puede establecer una conexión segura entre el cliente y el servidor. Ayuda a proteger información confidencial como números de tarjetas de crédito, nombres de usuario, contraseñas, pines, etc.

Puede hacer que las conexiones sean más seguras creando su propio contexto SSL utilizando el HttpClient biblioteca.

Siga los pasos que se indican a continuación para personalizar SSLContext utilizando la biblioteca HttpClient:

Paso 1: crear un objeto SSLContextBuilder

SSLContextBuilderes el constructor de los objetos SSLContext. Crea su objeto usando elcustom() método del SSLContexts clase.

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

Paso 2: carga el almacén de claves

En el camino Java_home_directory/jre/lib/security/, puede encontrar un archivo llamado cacerts. Guárdelo como su archivo de almacén de claves (con extensión .jks). Cargue el archivo del almacén de claves y su contraseña (que eschangeit por defecto) usando el loadTrustMaterial() método del SSLContextBuilder clase.

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

Paso 3: construye un objeto SSLContext

Un objeto SSLContext representa una implementación de protocolo de socket seguro. Construya un SSLContext usando elbuild() método.

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

Paso 4: creación del objeto SSLConnectionSocketFactory

SSLConnectionSocketFactoryes una fábrica de sockets en capas para conexiones TSL y SSL. Con esto, puede verificar el servidor Https usando una lista de certificados confiables y autenticar el servidor Https dado.

Puede crear esto de muchas formas. Dependiendo de la forma en que cree unSSLConnectionSocketFactory objeto, puede permitir todos los hosts, permitir solo certificados autofirmados, permitir solo protocolos particulares, etc.

To allow only particular protocols, crear SSLConnectionSocketFactory objeto pasando un objeto SSLContext, la matriz de cadenas que representa los protocolos debe ser compatible, la matriz de cadenas que representa los trajes de cifrado debe ser compatible y un objeto HostnameVerifier a su constructor.

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

To allow all hosts, crear SSLConnectionSocketFactory objeto pasando un objeto SSLContext y un NoopHostnameVerifier objeto.

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

Paso 5: crea un objeto HttpClientBuilder

Cree un objeto HttpClientBuilder usando el custom() método del HttpClients clase.

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

Paso 6: establece el objeto SSLConnectionSocketFactory

Establezca el objeto SSLConnectionSocketFactory en el HttpClientBuilder utilizando la setSSLSocketFactory() método.

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

Paso 7: compila el objeto CloseableHttpClient

Construye el CloseableHttpClient objeto llamando al build() método.

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

Paso 8: crea un objeto HttpGet

los HttpGet class representa la solicitud HTTP GET que recupera la información del servidor dado mediante un URI.

Cree una solicitud HTTP GET creando una instancia de la clase HttpGet pasando una cadena que represente el URI.

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

Paso 9: ejecutar la solicitud

Ejecute la solicitud usando el execute() método.

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

Ejemplo

El siguiente ejemplo demuestra la personalización de 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);
      } 
   }
}

Salida

Al ejecutarse, el programa anterior genera la siguiente salida.

HTTP/1.1 200 OK
1270