জাভাতে TCP প্রোটোকল ব্যবহার করে সিকিউর কমিউনিকেশন করার জন্য আমরা SSL/TLS এনক্রিপশন ব্যবহার করতে পারি, যা নেটওয়ার্কের মাধ্যমে নিরাপদ যোগাযোগ নিশ্চিত করে। নিচে দুটি অংশ দেওয়া হলো: সার্ভার এবং ক্লায়েন্ট। সার্ভার ইনকামিং ক্লায়েন্ট কানেকশন শোনে এবং SSL/TLS ব্যবহার করে ডেটা এনক্রিপ্ট করে পাঠায়, আর ক্লায়েন্ট সার্ভারের সাথে সিকিউর কানেকশনে যুক্ত হয়।
১. TCP সার্ভার (SSL সার্ভার)
এই সার্ভারটি ক্লায়েন্ট কানেকশন শোনে এবং SSL/TLS ব্যবহার করে সিকিউর কমিউনিকেশন স্থাপন করে।
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
public class SSLServer {
public static void main(String[] args) {
try {
// সার্ভারের প্রাইভেট কী এবং সার্টিফিকেট ধারণকারী KeyStore লোড করা হচ্ছে
KeyStore keyStore = KeyStore.getInstance("JKS");
FileInputStream keyStoreFile = new FileInputStream("server.keystore");
keyStore.load(keyStoreFile, "password".toCharArray());
// KeyManagerFactory তৈরি করা হচ্ছে
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, "password".toCharArray());
// SSLContext তৈরি করা হচ্ছে এবং এটি KeyManagerFactory দিয়ে ইনিশিয়ালাইজ করা হচ্ছে
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
// SSLServerSocketFactory তৈরি করা হচ্ছে
SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory();
// SSLServerSocket তৈরি করা হচ্ছে
SSLServerSocket serverSocket = (SSLServerSocket) serverSocketFactory.createServerSocket(1234);
System.out.println("সার্ভার শুরু হয়েছে এবং ক্লায়েন্ট কানেকশনের জন্য অপেক্ষা করছে...");
// ক্লায়েন্ট কানেকশন অ্যাকসেপ্ট করা হচ্ছে
SSLSocket sslSocket = (SSLSocket) serverSocket.accept();
System.out.println("ক্লায়েন্ট কানেক্টেড");
// কমিউনিকেশনের জন্য ইনপুট এবং আউটপুট স্ট্রিম সেটআপ করা হচ্ছে
BufferedReader reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
PrintWriter writer = new PrintWriter(sslSocket.getOutputStream(), true);
String clientMessage;
while ((clientMessage = reader.readLine()) != null) {
System.out.println("ক্লায়েন্ট: " + clientMessage);
writer.println("সার্ভার: " + clientMessage);
}
sslSocket.close();
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
২. TCP ক্লায়েন্ট (SSL ক্লায়েন্ট)
ক্লায়েন্ট সিকিউর SSL/TLS কানেকশন ব্যবহার করে সার্ভারের সাথে সংযুক্ত হয় এবং ডেটা পাঠায়।
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
public class SSLClient {
public static void main(String[] args) {
try {
// ক্লায়েন্টের সার্টিফিকেট (অপশনাল) ধারণকারী TrustStore লোড করা হচ্ছে
KeyStore trustStore = KeyStore.getInstance("JKS");
FileInputStream trustStoreFile = new FileInputStream("client.truststore");
trustStore.load(trustStoreFile, "password".toCharArray());
// TrustManagerFactory তৈরি করা হচ্ছে
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
// SSLContext তৈরি করা হচ্ছে এবং এটি TrustManagerFactory দিয়ে ইনিশিয়ালাইজ করা হচ্ছে
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
// SSLSocketFactory তৈরি করা হচ্ছে
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
// SSLSocket তৈরি করা হচ্ছে এবং সার্ভারের সাথে কানেক্ট করা হচ্ছে
SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket("localhost", 1234);
System.out.println("সার্ভারের সাথে সংযুক্ত হয়েছে");
// কমিউনিকেশনের জন্য ইনপুট এবং আউটপুট স্ট্রিম সেটআপ করা হচ্ছে
BufferedReader reader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream()));
PrintWriter writer = new PrintWriter(sslSocket.getOutputStream(), true);
// সার্ভারে ডেটা পাঠানো হচ্ছে
writer.println("হ্যালো সার্ভার! এটি একটি সিকিউর মেসেজ।");
// সার্ভারের প্রতিক্রিয়া পড়া হচ্ছে
String serverMessage;
while ((serverMessage = reader.readLine()) != null) {
System.out.println("সার্ভার: " + serverMessage);
}
sslSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
৩. KeyStore এবং TrustStore সেটআপ
এই উদাহরণটি কাজ করার জন্য আপনাকে Keystore এবং Truststore তৈরি করতে হবে।
- Keystore: এটি সার্ভারের প্রাইভেট কী এবং সার্টিফিকেট ধারণ করে।
- Truststore: এটি ক্লায়েন্টের ট্রাস্টেড সার্টিফিকেটগুলোর তালিকা ধারণ করে, যার মধ্যে সার্ভারের সার্টিফিকেটও থাকে।
Keystore তৈরি করুন (সার্ভারের জন্য)
keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -storetype JKS -keystore server.keystore -validity 3650
Truststore তৈরি করুন (ক্লায়েন্টের জন্য)
keytool -import -alias server -file server.crt -keystore client.truststore
৪. ব্যাখ্যা
- SSLServer: সার্ভার সাইড SSL সার্ভার সকেট (
SSLServerSocket) ব্যবহার করে সিকিউর কমিউনিকেশন স্থাপন করে। এটি ক্লায়েন্ট থেকে ডেটা পড়ে এবং একটি সিকিউর চ্যানেল ব্যবহার করে প্রতিক্রিয়া পাঠায়। - SSLClient: ক্লায়েন্ট SSL সকেট (
SSLSocket) ব্যবহার করে সার্ভারের সাথে সংযুক্ত হয়, একটি মেসেজ পাঠায় এবং সার্ভারের প্রতিক্রিয়া প্রিন্ট করে। - Keystore/Truststore: এইগুলি সার্টিফিকেট এবং কী ম্যানেজ করার জন্য ব্যবহৃত হয়। সার্ভার একটি keystore ব্যবহার করে তার প্রাইভেট কী এবং সার্টিফিকেট ধারণ করে, এবং ক্লায়েন্ট একটি truststore ব্যবহার করে সার্ভারের সার্টিফিকেট যাচাই করে।
এই উদাহরণটি TCP প্রোটোকল ব্যবহার করে SSL/TLS এনক্রিপশন সহ সিকিউর কমিউনিকেশন কিভাবে স্থাপন করা যায় তা প্রদর্শন করে।
Read more