Apache HttpClient - Contexto SSL personalizado

Usando Secure Socket Layer, você pode estabelecer uma conexão segura entre o cliente e o servidor. Ajuda a proteger informações confidenciais, como números de cartão de crédito, nomes de usuário, senhas, pins, etc.

Você pode tornar as conexões mais seguras criando seu próprio contexto SSL usando o HttpClient biblioteca.

Siga as etapas fornecidas abaixo para personalizar SSLContext usando a biblioteca HttpClient -

Etapa 1 - Criar objeto SSLContextBuilder

SSLContextBuilderé o construtor dos objetos SSLContext. Crie seu objeto usando ocustom() método do SSLContexts classe.

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

Etapa 2 - Carregar o armazenamento de chaves

No caminho Java_home_directory/jre/lib/security/, você pode localizar um arquivo denominado cacerts. Salve-o como seu arquivo de armazenamento de chaves (com extensão .jks). Carregue o arquivo keystore e sua senha (que échangeit por padrão) usando o loadTrustMaterial() método do SSLContextBuilder classe.

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

Etapa 3 - construir um objeto SSLContext

Um objeto SSLContext representa uma implementação de protocolo de soquete seguro. Construa um SSLContext usando obuild() método.

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

Etapa 4 - Criação do objeto SSLConnectionSocketFactory

SSLConnectionSocketFactoryé uma fábrica de soquetes em camadas para conexões TSL e SSL. Usando isso, você pode verificar o servidor Https usando uma lista de certificados confiáveis ​​e autenticar o servidor Https fornecido.

Você pode criar isso de várias maneiras. Dependendo da maneira como você cria umSSLConnectionSocketFactory objeto, você pode permitir todos os hosts, permitir apenas certificados autoassinados, permitir apenas protocolos específicos, etc.

To allow only particular protocols, crio SSLConnectionSocketFactory passando um objeto SSLContext, a matriz de string que representa os protocolos precisa ser suportada, a matriz de string que representa os trajes de criptografia precisa ser suportada e um objeto HostnameVerifier para seu construtor.

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

To allow all hosts, crio SSLConnectionSocketFactory objeto passando um objeto SSLContext e um NoopHostnameVerifier objeto.

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

Etapa 5 - Criar um objeto HttpClientBuilder

Crie um objeto HttpClientBuilder usando o custom() método do HttpClients classe.

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

Etapa 6 - Definir o objeto SSLConnectionSocketFactory

Defina o objeto SSLConnectionSocketFactory para o HttpClientBuilder usando o setSSLSocketFactory() método.

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

Etapa 7 - Construir o objeto CloseableHttpClient

Construa o CloseableHttpClient objeto chamando o build() método.

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

Etapa 8 - Criar um objeto HttpGet

o HttpGet classe representa a solicitação HTTP GET que recupera as informações de um determinado servidor usando um URI.

Crie uma solicitação HTTP GET instanciando a classe HttpGet passando uma string que representa o URI.

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

Etapa 9 - Executar a solicitação

Execute a solicitação usando o execute() método.

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

Exemplo

O exemplo a seguir demonstra a personalização do 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);
      } 
   }
}

Resultado

Ao ser executado, o programa acima gera a seguinte saída.

HTTP/1.1 200 OK
1270