Apache HttpClient - Ngữ cảnh SSL tùy chỉnh

Sử dụng Lớp cổng bảo mật, bạn có thể thiết lập kết nối an toàn giữa máy khách và máy chủ. Nó giúp bảo vệ thông tin nhạy cảm như số thẻ tín dụng, tên người dùng, mật khẩu, ghim, v.v.

Bạn có thể làm cho các kết nối an toàn hơn bằng cách tạo ngữ cảnh SSL của riêng bạn bằng cách sử dụng HttpClient thư viện.

Làm theo các bước dưới đây để tùy chỉnh SSLContext bằng thư viện HttpClient -

Bước 1 - Tạo đối tượng SSLContextBuilder

SSLContextBuilderlà trình xây dựng cho các đối tượng SSLContext. Tạo đối tượng của nó bằng cách sử dụngcustom() phương pháp của SSLContexts lớp học.

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

Bước 2 - Tải Keystore

Trong đường dẫn Java_home_directory/jre/lib/security/, bạn có thể tìm thấy một tệp có tên cacerts. Lưu tệp này dưới dạng tệp lưu trữ khóa của bạn (với phần mở rộng .jks). Tải tệp kho khóa và mật khẩu của nó (làchangeit theo mặc định) bằng cách sử dụng loadTrustMaterial() phương pháp của SSLContextBuilder lớp học.

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

Bước 3 - xây dựng một đối tượng SSLContext

Đối tượng SSLContext đại diện cho việc triển khai giao thức ổ cắm an toàn. Xây dựng một văn bản SSLC bằng cách sử dụngbuild() phương pháp.

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

Bước 4 - Tạo đối tượng SSLConnectionSocketFactory

SSLConnectionSocketFactorylà một nhà máy sản xuất socket phân lớp cho các kết nối TSL và SSL. Sử dụng điều này, bạn có thể xác minh máy chủ Https bằng danh sách các chứng chỉ đáng tin cậy và xác thực máy chủ Https đã cho.

Bạn có thể tạo điều này bằng nhiều cách. Tùy thuộc vào cách bạn tạoSSLConnectionSocketFactory đối tượng, bạn có thể cho phép tất cả các máy chủ, chỉ cho phép các chứng chỉ tự ký, chỉ cho phép các giao thức cụ thể, v.v.

To allow only particular protocols, tạo nên SSLConnectionSocketFactory đối tượng bằng cách truyền một đối tượng SSLContext, mảng chuỗi đại diện cho các giao thức cần được hỗ trợ, mảng chuỗi đại diện cho các bộ mật mã cần được hỗ trợ và một đối tượng HostnameVerifier tới phương thức khởi tạo của nó.

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

To allow all hosts, tạo nên SSLConnectionSocketFactory đối tượng bằng cách chuyển một đối tượng SSLContext và một NoopHostnameVerifier vật.

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

Bước 5 - Tạo một đối tượng HttpClientBuilder

Tạo một đối tượng HttpClientBuilder bằng cách sử dụng custom() phương pháp của HttpClients lớp học.

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

Bước 6 - Đặt đối tượng SSLConnectionSocketFactory

Đặt đối tượng SSLConnectionSocketFactory thành HttpClientBuilder sử dụng setSSLSocketFactory() phương pháp.

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

Bước 7 - Xây dựng đối tượng ClosableHttpClient

Xây dựng CloseableHttpClient đối tượng bằng cách gọi build() phương pháp.

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

Bước 8 - Tạo một đối tượng HttpGet

Các HttpGet lớp đại diện cho yêu cầu HTTP GET lấy thông tin của máy chủ đã cho bằng cách sử dụng URI.

Tạo một yêu cầu HTTP GET bằng cách khởi tạo lớp HttpGet bằng cách chuyển một chuỗi đại diện cho URI.

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

Bước 9 - Thực hiện yêu cầu

Thực hiện yêu cầu bằng cách sử dụng execute() phương pháp.

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

Thí dụ

Ví dụ sau minh họa sự tùy chỉnh của 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);
      } 
   }
}

Đầu ra

Khi thực thi, chương trình trên tạo ra kết quả sau.

HTTP/1.1 200 OK
1270