> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/security/ssl-and-tls.md).

# SSL and TLS

### SSL/TLS Handshake কী এবং এটি কীভাবে কাজ করে?

আপনি যখন কোনো ওয়েবসাইটে প্রবেশ করেন, বিশেষ করে **HTTPS** ওয়েবসাইটে, তখন আপনার ব্রাউজার এবং সার্ভার একে অপরের সাথে নিরাপদে যোগাযোগ স্থাপনের জন্য **SSL/TLS Handshake** সম্পন্ন করে। এই Handshake প্রক্রিয়াটি নিশ্চিত করে যে **ডাটা এনক্রিপ্টেড** থাকবে, কেউ Man-in-the-Middle (MITM) অ্যাটাক করতে পারবে না এবং সার্ভারের পরিচয় যাচাই করা যাবে।

এখন প্রশ্ন হচ্ছে, **SSL/TLS Handshake আসলে কীভাবে কাজ করে?** 🤔 আসুন, সহজ ভাষায় বুঝে নেই!

***

### 🔹 SSL/TLS Handshake-এর ধাপসমূহ

SSL/TLS Handshake মোটামুটি **তিনটি প্রধান ধাপে** সম্পন্ন হয়:

1. **Client Hello & Server Hello** 🖐
2. **Certificate Exchange & Authentication** 🔑
3. **Session Key Generation & Secure Communication** 🔐

প্রতিটি ধাপ বিস্তারিতভাবে দেখে নেওয়া যাক!

***

#### ১️) Client Hello & Server Hello 🖐

প্রথমেই, ক্লায়েন্ট (যেমন: আপনার ব্রাউজার) সার্ভারের সাথে একটি সংযোগ স্থাপনের চেষ্টা করে এবং বলে—\
*"Hey! আমি তোমার সাথে নিরাপদে যোগাযোগ করতে চাই!"*

এটি করতে **Client Hello** ম্যাসেজ পাঠানো হয়, যেখানে থাকে:

✅ ক্লায়েন্টের সমর্থিত **TLS versions** (যেমন: TLS 1.2, TLS 1.3)\
✅ সমর্থিত **Cipher Suites** (যেমন: AES, RSA, ECDHE)\
✅ একটি **Random Value** (Session Key তৈরির জন্য)

সার্ভার যখন এই ম্যাসেজ পায়, তখন সে তার **Server Hello** ম্যাসেজ পাঠায় যেখানে উল্লেখ থাকে:

✅ সার্ভারের নির্বাচিত **TLS version**\
✅ নির্বাচিত **Cipher Suite**\
✅ সার্ভারের **Random Value**

এই পর্যায়ে, ক্লায়েন্ট এবং সার্ভার ঠিক করে নিচ্ছে **কোন এনক্রিপশন মেথড** এবং **কোন প্রোটোকল** ব্যবহার করা হবে।

***

#### ২️) Certificate Exchange & Authentication 🔑

এখন সার্ভার নিশ্চিত করতে চায় যে, ক্লায়েন্টের কাছে এটি **বিশ্বাসযোগ্য** কিনা। এজন্য, সার্ভার তার **SSL Certificate** ক্লায়েন্টের কাছে পাঠায়।

এই সার্টিফিকেটে থাকে:

✅ সার্ভারের **Public Key**\
✅ সার্ভারের আইডেন্টিটি (ডোমেইন, কোম্পানি ইত্যাদি)\
✅ **Certificate Authority (CA)** দ্বারা স্বাক্ষরিত তথ্য

এরপর ক্লায়েন্ট চেক করে দেখে, সার্টিফিকেটটি কি **বৈধ** নাকি? যদি বৈধ হয়, তাহলে ক্লায়েন্ট সেটিকে গ্রহণ করে।

> 🎯 **Example:**\
> ভাবুন, আপনি একটি অফিসে প্রবেশ করতে চান। দরজার সামনে **গার্ড** আপনাকে একটি পরিচয়পত্র দেখাতে বলবে। আপনি যদি বৈধ পরিচয়পত্র দেখান এবং গার্ড যদি সেটিকে স্বীকৃতি দেয়, তাহলে আপনি প্রবেশ করতে পারবেন। এখানে **গার্ড = ক্লায়েন্ট** এবং **আপনার পরিচয়পত্র = SSL Certificate**

***

#### ৩️) Session Key Generation & Secure Communication 🔐

এখন আসল কাজ শুরু হবে! ক্লায়েন্ট এবং সার্ভার **একটি গোপন কী (Session Key)** তৈরি করে, যা এনক্রিপশন ও ডিক্রিপশনের জন্য ব্যবহৃত হবে।

এই প্রক্রিয়া সম্পন্ন করতে **Key Exchange Algorithm** (যেমন: Diffie-Hellman, RSA, ECDHE) ব্যবহার করা হয়।

একবার এই কী তৈরি হয়ে গেলে, **ক্লায়েন্ট এবং সার্ভার এনক্রিপ্টেড কমিউনিকেশন শুরু করে** ✅

***

### SSL/TLS Handshake-এর বাস্তব প্রয়োগ (Python কোড)

আমরা Python-এ **ssl** মডিউল ব্যবহার করে দেখি কিভাবে ক্লায়েন্ট এবং সার্ভারের মধ্যে SSL সংযোগ হয়:

#### ✅ **SSL Server (Python)**

```python
import ssl
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 8443))
server_socket.listen(5)

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile="server.crt", keyfile="server.key")

print("🔒 SSL Server is running...")

while True:
    conn, addr = server_socket.accept()
    secure_conn = context.wrap_socket(conn, server_side=True)
    print(f"🔹 Connection established with {addr}")
    secure_conn.send(b"Hello, Secure World!")
    secure_conn.close()
```

#### ✅ **SSL Client (Python)**

```python
import ssl
import socket

context = ssl.create_default_context()

with socket.create_connection(('localhost', 8443)) as client_socket:
    with context.wrap_socket(client_socket, server_hostname="localhost") as secure_client:
        print("🔐 Secure connection established!")
        print(secure_client.recv(1024).decode())
```

> 🎯 এই কোডে সার্ভার **SSL Certificate** ব্যবহার করে একটি এনক্রিপ্টেড সংযোগ তৈরি করছে, এবং ক্লায়েন্ট সেটির সাথে নিরাপদে যোগাযোগ করছে।

***

### কেন SSL/TLS Handshake গুরুত্বপূর্ণ?

✅ **ডাটা এনক্রিপশন**: আপনার ব্যক্তিগত তথ্য সুরক্ষিত থাকবে।\
✅ **অথেনটিকেশন**: সার্ভারের পরিচয় যাচাই করা যায়।\
✅ **ইন্টিগ্রিটি**: কেউ ডাটা পরিবর্তন করতে পারবে না।

এখন থেকে যখনই আপনি কোনো **HTTPS ওয়েবসাইটে প্রবেশ করবেন**, বুঝতে পারবেন ব্যাকগ্রাউন্ডে **SSL/TLS Handshake** ঠিক কীভাবে কাজ করছে! 😃💡

***

### সংক্ষেপে SSL/TLS Handshake

1️⃣ **Client Hello** (TLS Version, Cipher Suites)\
2️⃣ **Server Hello** (TLS Version, Cipher Selection)\
3️⃣ **Certificate Exchange** (SSL Certificate পাঠানো)\
4️⃣ **Session Key Generation** (এনক্রিপ্টেড কী তৈরি)\
5️⃣ **Secure Communication শুরু!** 🔒
