Apache HttpClient - niestandardowy kontekst SSL

Korzystając z protokołu Secure Socket Layer, można ustanowić bezpieczne połączenie między klientem a serwerem. Pomaga chronić poufne informacje, takie jak numery kart kredytowych, nazwy użytkowników, hasła, szpilki itp.

Możesz zwiększyć bezpieczeństwo połączeń, tworząc własny kontekst SSL przy użyciu rozszerzenia HttpClient biblioteka.

Wykonaj kroki podane poniżej, aby dostosować SSLContext przy użyciu biblioteki HttpClient -

Krok 1 - Utwórz obiekt SSLContextBuilder

SSLContextBuilderjest konstruktorem obiektów SSLContext. Utwórz jego obiekt za pomocącustom() metoda SSLContexts klasa.

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

Krok 2 - Załaduj Keystore

Na ścieżce Java_home_directory/jre/lib/security/, możesz znaleźć plik o nazwie cacerts. Zapisz to jako plik magazynu kluczy (z rozszerzeniem .jks). Załaduj plik kluczy i jego hasło (czylichangeit domyślnie) przy użyciu loadTrustMaterial() metoda SSLContextBuilder klasa.

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

Krok 3 - zbuduj obiekt SSLContext

Obiekt SSLContext reprezentuje implementację protokołu bezpiecznego gniazda. Zbuduj SSLContext przy użyciubuild() metoda.

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

Krok 4 - Tworzenie obiektu SSLConnectionSocketFactory

SSLConnectionSocketFactoryto fabryka gniazd warstwowych dla połączeń TSL i SSL. Korzystając z tego, możesz zweryfikować serwer HTTPS przy użyciu listy zaufanych certyfikatów i uwierzytelnić dany serwer HTTPS.

Możesz to stworzyć na wiele sposobów. W zależności od sposobu tworzenia plikuSSLConnectionSocketFactory obiekt, możesz zezwolić na wszystkie hosty, zezwalać tylko na certyfikaty z podpisem własnym, zezwalać tylko na określone protokoły itp.

To allow only particular protocols, Stwórz SSLConnectionSocketFactory obiekt przez przekazanie obiektu SSLContext, tablica łańcuchowa reprezentująca protokoły musi być obsługiwana, tablica łańcuchowa reprezentująca kombinacje szyfrów musi być obsługiwana i obiekt HostnameVerifier do jego konstruktora.

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

To allow all hosts, Stwórz SSLConnectionSocketFactory obiekt, przekazując obiekt SSLContext i plik NoopHostnameVerifier obiekt.

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

Krok 5 - Utwórz obiekt HttpClientBuilder

Utwórz obiekt HttpClientBuilder przy użyciu custom() metoda HttpClients klasa.

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

Krok 6 - Ustaw obiekt SSLConnectionSocketFactory

Ustaw obiekt SSLConnectionSocketFactory na HttpClientBuilder używając setSSLSocketFactory() metoda.

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

Krok 7 - Zbuduj obiekt CloseableHttpClient

Zbuduj CloseableHttpClient obiekt, wywołując build() metoda.

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

Krok 8 - Utwórz obiekt HttpGet

Plik HttpGet klasa reprezentuje żądanie HTTP GET, które pobiera informacje z danego serwera przy użyciu identyfikatora URI.

Utwórz żądanie HTTP GET, tworząc wystąpienie klasy HttpGet, przekazując ciąg reprezentujący identyfikator URI.

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

Krok 9 - Wykonaj żądanie

Wykonaj żądanie przy użyciu execute() metoda.

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

Przykład

Poniższy przykład demonstruje dostosowanie 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);
      } 
   }
}

Wynik

Podczas wykonywania powyższy program generuje następujące dane wyjściowe.

HTTP/1.1 200 OK
1270