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