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