Apache HttpClient - Konteks SSL Kustom
Dengan menggunakan Secure Socket Layer, Anda dapat membuat sambungan aman antara klien dan server. Ini membantu untuk melindungi informasi sensitif seperti nomor kartu kredit, nama pengguna, kata sandi, pin, dll.
Anda dapat membuat koneksi lebih aman dengan membuat konteks SSL Anda sendiri menggunakan HttpClient Perpustakaan.
Ikuti langkah-langkah yang diberikan di bawah ini untuk menyesuaikan SSLContext menggunakan perpustakaan HttpClient -
Langkah 1 - Buat objek SSLContextBuilder
SSLContextBuilderadalah pembangun untuk objek SSLContext. Buat objeknya menggunakancustom() metode dari SSLContexts kelas.
//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();
Langkah 2 - Muat Keystore
Di jalan Java_home_directory/jre/lib/security/, Anda dapat menemukan file bernama cacerts. Simpan ini sebagai file penyimpanan kunci Anda (dengan ekstensi .jks). Muat file keystore dan kata sandinya (yaituchangeit secara default) menggunakan loadTrustMaterial() metode dari SSLContextBuilder kelas.
//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());
Langkah 3 - membangun objek SSLContext
Objek SSLContext mewakili implementasi protokol soket aman. Bangun SSLContext menggunakanbuild() metode.
//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();
Langkah 4 - Membuat objek SSLConnectionSocketFactory
SSLConnectionSocketFactoryadalah pabrik soket berlapis untuk koneksi TSL dan SSL. Dengan menggunakan ini, Anda dapat memverifikasi server Https menggunakan daftar sertifikat tepercaya dan mengautentikasi server Https yang diberikan.
Anda dapat membuatnya dengan banyak cara. Bergantung pada cara Anda membuat fileSSLConnectionSocketFactory objek, Anda dapat mengizinkan semua host, hanya mengizinkan sertifikat yang ditandatangani sendiri, hanya mengizinkan protokol tertentu, dll.
To allow only particular protocols, buat SSLConnectionSocketFactory objek dengan melewatkan objek SSLContext, larik string yang mewakili protokol perlu didukung, larik string yang mewakili setelan sandi perlu didukung dan objek HostnameVerifier ke konstruktornya.
new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
To allow all hosts, membuat SSLConnectionSocketFactory objek dengan melewatkan objek SSLContext dan a NoopHostnameVerifier obyek.
//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
Langkah 5 - Buat objek HttpClientBuilder
Buat objek HttpClientBuilder menggunakan custom() metode dari HttpClients kelas.
//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();
Langkah 6 - Setel objek SSLConnectionSocketFactory
Setel objek SSLConnectionSocketFactory ke HttpClientBuilder menggunakan setSSLSocketFactory() metode.
//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);
Langkah 7 - Bangun objek CloseableHttpClient
Bangun CloseableHttpClient objek dengan memanggil build() metode.
//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();
Langkah 8 - Buat objek HttpGet
Itu HttpGet class mewakili permintaan HTTP GET yang mengambil informasi dari server yang diberikan menggunakan URI.
Buat permintaan HTTP GET dengan membuat instance kelas HttpGet dengan meneruskan string yang mewakili URI.
//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");
Langkah 9 - Jalankan permintaan
Jalankan permintaan menggunakan execute() metode.
//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);
Contoh
Contoh berikut menunjukkan penyesuaian 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);
}
}
}
Keluaran
Saat menjalankan, program di atas menghasilkan keluaran sebagai berikut.
HTTP/1.1 200 OK
1270