অ্যাপাচি HTTP ক্লায়েন্ট (Apache HTTP Client) ব্যবহার করে Certificate Validation এবং Self-signed Certificates বাইপাস করা একটি গুরুত্বপূর্ণ বিষয়, বিশেষ করে নিরাপদ (HTTPS) যোগাযোগের ক্ষেত্রে। স্বাক্ষরিত সার্টিফিকেটের মাধ্যমে HTTPS সংযোগ নিরাপদ করা হয়, কিন্তু কিছু সময়ে ডেভেলপমেন্ট পরিবেশে বা অন্যান্য পরিস্থিতিতে Self-signed certificates (যেগুলি ট্রাস্টেড সার্টিফিকেট অথরিটি দ্বারা সই করা হয় না) ব্যবহার করা হয়। এই সার্টিফিকেটগুলি সাধারণত নিরাপত্তা সতর্কতা সৃষ্টি করে।
এই ধরনের পরিস্থিতিতে Certificate Validation এবং Bypassing Self-signed Certificates করতে হয়, যা HTTP ক্লায়েন্টের জন্য কাস্টম SSLContext কনফিগারেশন প্রয়োজন।
সাধারণভাবে, HTTPS সংযোগ স্থাপন করার সময় সার্ভারের সার্টিফিকেট যাচাই করা হয়। HttpClient
সার্টিফিকেট যাচাইয়ের জন্য ডিফল্টভাবে Java keystore (JKS) বা প্ল্যাটফর্মের ট্রাস্টস্টোর ব্যবহার করে।
Self-signed certificates বাইপাস করার জন্য, SSLContext কনফিগার করতে হয় যাতে সার্টিফিকেট যাচাই করা না হয়।
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
public class ApacheHttpClientCertificateValidation {
public static void main(String[] args) {
try {
// SSLContext কাস্টমাইজ করা (Self-signed সার্টিফিকেট বাইপাস)
TrustManager[] trustAllCertificates = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// SSLContext তৈরি করুন এবং TrustManager যোগ করুন
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());
// HttpClient তৈরি করুন, SSLContext ও HostnameVerifier বাইপাস করুন
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build();
// GET অনুরোধ তৈরি করুন
HttpGet httpGet = new HttpGet("https://self-signed.badssl.com/");
// অনুরোধ পাঠান এবং প্রতিক্রিয়া সংগ্রহ করুন
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
// প্রতিক্রিয়া স্ট্যাটাস কোড পড়ুন
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("Response Status Code: " + statusCode);
// HttpEntity থেকে ডেটা পড়ুন
HttpEntity entity = response.getEntity();
if (entity != null) {
String responseBody = EntityUtils.toString(entity);
System.out.println("Response Content: " + responseBody);
}
} finally {
response.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SSLContext কনফিগার করা
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCertificates, new java.security.SecureRandom());
SSLContext.getInstance("TLS")
ব্যবহার করে একটি SSLContext অবজেক্ট তৈরি করা হয়।TrustManager
কাস্টম তৈরি করা হয়েছে, যা সার্টিফিকেট যাচাই করে না এবং সব সার্টিফিকেটকেই গ্রহণ করে।TrustManager
TrustManager[] trustAllCertificates = new TrustManager[]{
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
X509TrustManager
কাস্টমাইজ করা হয়েছে যাতে সার্টিফিকেট যাচাইয়ের কোনো কাজ না করে এবং সমস্ত সার্টিফিকেটকে গ্রহণ করে।HostnameVerifier বাইপাস
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
NoopHostnameVerifier.INSTANCE
ব্যবহার করে হোস্টনেম যাচাই বাইপাস করা হয়েছে, যার ফলে হোস্টনেমের সাথে সম্পর্কিত কোনো সতর্কতা বা ত্রুটি প্রদর্শিত হবে না।HttpClient তৈরি করা
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build();
httpClient.execute(httpGet)
ব্যবহার করে GET অনুরোধ পাঠানো হয়েছে এবং সার্ভারের প্রতিক্রিয়া পাওয়া হয়েছে।যদিও self-signed certificates বা সার্টিফিকেট যাচাই বাইপাস করার কৌশলগুলি ডেভেলপমেন্ট বা পরীক্ষার সময় কার্যকর হতে পারে, তা বাস্তব প্রোডাকশন পরিবেশে নিরাপত্তা ঝুঁকি তৈরি করতে পারে। এটি SSL/TLS সংযোগের নিরাপত্তাকে দুর্বল করে ফেলে, কারণ আপনি সার্ভারের সার্টিফিকেট যাচাই করছেন না। এর ফলে Man-in-the-Middle (MITM) আক্রমণ হতে পারে, যেখানে আক্রমণকারী সংযোগে হস্তক্ষেপ করতে পারে।
Self-signed certificates বাইপাস করা এবং Certificate Validation কাস্টমাইজ করা Apache HTTP Client এর মাধ্যমে সহজেই সম্ভব, তবে এটি শুধুমাত্র ডেভেলপমেন্ট বা পরীক্ষার ক্ষেত্রে ব্যবহার করা উচিত। প্রোডাকশন পরিবেশে ট্রাস্টেড সার্টিফিকেট অথরিটি দ্বারা স্বাক্ষরিত সার্টিফিকেট ব্যবহার করা উচিৎ।
common.read_more