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