এই পর্বে যা শিখবেন
- TLS 1.3 handshake-এর কোন ধাপে অপারেটরের কী ভুল ধরা পড়ে, আর TLS 1.2 থেকে কী বদলেছে
- কোন version আর cipher রাখবেন, কোনটি ছাঁটবেন, আর forward secrecy কেন লাগে
- নিজের server-এ ভালো configuration, HSTS আর preload নিরাপদে চালু করা, আর
opensslদিয়ে যাচাই - Certificate-এর পুরো জীবনচক্র: automation, মেয়াদের monitoring আর নবায়ন ব্যর্থ হলে সাড়া
- mTLS, TLS termination, TLS inspection, ECH-এর লাভ-ক্ষতি, আর Heartbleed ও POODLE-এর শিক্ষা
১ · Handshake জানা আর TLS চালানো — দুটি আলাদা কাজ
একটি কাল্পনিক অনলাইন বাজারের কথা ভাবুন। এক শুক্রবার সকালে হঠাৎ অর্ডার শূন্য। ব্রাউজারে লাল সতর্কবার্তা, মোবাইল অ্যাপে শুধু “সংযোগ ব্যর্থ”. কোনো হ্যাকার আসেনি, কোনো cipher ভাঙেনি। একটি certificate-এর মেয়াদ রাত ১২টায় শেষ হয়েছে, আর যিনি এটি নবায়ন করতেন তিনি ছয় মাস আগে চাকরি ছেড়েছেন।
TLS নিয়ে বাস্তবের বেশিরভাগ সমস্যা এমনই। গণিত প্রায় কখনো ভাঙে না, ভাঙে কাজের প্রক্রিয়া। এই পর্ব তাই অপারেটরের চোখে লেখা: যিনি server চালান, যাঁর ফোনে রাত ৩টায় alert আসে।
TLS হলো ব্যাংকের লকার ঘরের মতো। তালাটি খুব মজবুত, সেটি নকশাকারীর কৃতিত্ব। কিন্তু চাবি কে রাখবেন, দারোয়ানের পরিচয়পত্রের মেয়াদ কবে শেষ, পেছনের দরজা খোলা থাকে কি না, রেজিস্টার খাতায় কী লেখা হয়, এগুলো ব্যবস্থাপকের কাজ। এই পর্ব সেই ব্যবস্থাপকের কাজ নিয়ে।
Handshake-এর বার্তা, key schedule আর X.509-এর খুঁটিনাটি এখানে আবার শেখানো হবে না। সেগুলো পাবেন কম্পিউটার নেটওয়ার্ক কোর্সের TLS আর HTTPS পর্বে। Key exchange দেখুন পর্ব ১০-এ, certificate আর বিশ্বাসের শিকল পর্ব ১১-এ। এখানে শুধু এক লাইনের স্মরণিকা: HTTPS মানে TLS-এর ভেতর দিয়ে HTTP, আর TLS দেয় গোপনীয়তা, অখণ্ডতা আর server-এর পরিচয়। প্রথম দুটির কথা আপনি পর্ব ০২-এর CIA triad-এ দেখেছেন।
| TLS যা ঠেকায় | TLS যা ঠেকায় না |
|---|---|
| পথে আড়ি পাতা (Wi-Fi, ISP, router) | Server বা ব্যবহারকারীর যন্ত্র আক্রান্ত হলে সেখান থেকে ডেটা চুরি |
| পথে ডেটা বদলানো | আপনার কোডের injection বা অনুমতির ভুল |
| নকল server (MITM), যদি client যাচাই করে | নকল নামের phishing সাইট, যার নিজের বৈধ certificate আছে |
| পুরোনো রেকর্ড পরে খোলা, যদি forward secrecy থাকে | Log-এ, proxy-র পেছনে বা database-এ খোলা ডেটা |
আইনের সীমা: এই পর্বের সব কমান্ড শুধু নিজের server বা লিখিত অনুমতি থাকা server-এ চালাবেন। অন্যের সিস্টেম পরীক্ষা করতে লিখিত অনুমতি লাগে, আর অনুমতি ছাড়া প্রবেশ অপরাধ হতে পারে। বিস্তারিত পর্ব ০৬-এ।
২ · TLS 1.3 handshake — অপারেটরের চোখে
TLS 1.3 প্রথম আসে RFC 8446-এ (২০১৮). জুলাই ২০২৬-এ RFC 9846 সেটিকে প্রতিস্থাপন করেছে, তবে version একই আছে, বদল ছোট আর পুরোনোর সাথে মানানসই. নিচের ডায়াগ্রামে প্রতিটি ধাপে দেখুন কে কী দেখতে পাচ্ছে, আর অপারেটর হিসেবে সেখানে আপনার কী খেয়াল রাখা দরকার। উদাহরণের সাইট shop.example.com.
- ClientHello
key_share, SNIখোলা - ServerHello
key_shareখোলা - Certificate…
chain, signatureএনক্রিপ্টেড - Finished
১ RTTযাচাই শেষ - HTTP ডেটা
AEADএনক্রিপ্টেড
| সময় | |
| বার্তা | |
| পথের লোক দেখে | |
| অপারেটরের নোট |
- ClientHello. Client version, cipher,
key_shareআর SNI (shop.example.com) পাঠায়। এই নাম দেখেই server ঠিক করে কোন certificate দেবে। নাম না মিললে default block-এর ভুল certificate চলে যেতে পারে, যা “hostname mismatch” ত্রুটির একটি সাধারণ কারণ। - ServerHello. Server একটি cipher suite বেছে নিয়ে নিজের key share দেয়। দুই পক্ষ এখন একই গোপন মান হিসাব করতে পারে। Client-এর পাঠানো key share server-এর পছন্দ না হলে HelloRetryRequest আসে, তাতে এক RTT বাড়ে। Log-এ কোন version আর cipher চলছে রাখলে পুরোনো client চেনা সহজ হয়।
- Certificate. এখন থেকে সব এনক্রিপ্টেড। Server তার certificate আর intermediate পাঠায়। Chain অসম্পূর্ণ হলে কোনো ব্রাউজার তবু চালিয়ে নিতে পারে, কিন্তু অ্যাপ বা
curlব্যর্থ হয়। তাই শুধু একটি ব্রাউজারে দেখে নিশ্চিত হবেন না। - CertificateVerify. Server এতক্ষণের কথাবার্তার ওপর private key দিয়ে স্বাক্ষর করে। এটিই প্রমাণ যে key তার হাতেই আছে। অর্থাৎ যে যন্ত্র TLS খোলে, private key-র ঝুঁকিও সেই যন্ত্রের।
- Server Finished. পুরো handshake-এর ওপর একটি যাচাই-ট্যাগ। পথে কেউ কিছু বদলালে এখানে মিলবে না, তাই সংযোগকে দুর্বল বিকল্পে নামানো (downgrade) কঠিন হয়।
- Client যাচাই আর Finished. Client chain, মেয়াদ, নাম আর স্বাক্ষর দেখে। ব্যর্থ হলে alert পাঠায়, যেমন
certificate_expiredবাunknown_ca. Server log-এ এই alert-গুলোর হঠাৎ বৃদ্ধি একটি ভালো সতর্কসংকেত। এখানে এক RTT শেষ। - ডেটা. এবার HTTP চলে AEAD দিয়ে এনক্রিপ্টেড হয়ে। Server একটি session ticket-ও দিতে পারে, যা দিয়ে পরের সংযোগ দ্রুত হয়। টিকিটের চাবি বদলানো অপারেটরের কাজ, সে কথা পরের অংশে।
TLS 1.2 থেকে কী বদলেছে
| বিষয় | TLS 1.2 | TLS 1.3 | অপারেটরের লাভ |
|---|---|---|---|
| নতুন সংযোগে RTT | ২ | ১ | প্রথম সংযোগ দ্রুত, মোবাইলে টের পাওয়া যায় |
| Key exchange | RSA, DHE বা ECDHE | শুধু অস্থায়ী (EC)DHE, বা PSK-এর সাথে | Forward secrecy নিয়ে আলাদা ভাবতে হয় না |
| Cipher | অনেক, দুর্বলও আছে | অল্প কয়েকটি AEAD | ভুল বাছাইয়ের সুযোগ কম |
| Certificate | খোলা অবস্থায় | এনক্রিপ্টেড | পথের লোক certificate দেখতে পায় না |
| Compression, renegotiation | ছিল | বাদ | পুরোনো একগুচ্ছ দুর্বলতার পথ বন্ধ |
| Passive decrypt | RSA key থাকলে সম্ভব ছিল | সম্ভব নয় | পুরোনো monitoring যন্ত্র ভেঙে যেতে পারে (অংশ ৭) |
৩ · Version, cipher আর forward secrecy — কী রাখবেন, কী ছাঁটবেন
পুরোনো জামা আলমারিতে জমিয়ে রাখলে ক্ষতি নেই, কিন্তু পুরোনো cipher জমিয়ে রাখলে ক্ষতি আছে। Server-এ একটি দুর্বল বিকল্প চালু থাকলে পথের আক্রমণকারী সংযোগকে সেদিকে ঠেলে দেওয়ার চেষ্টা করতে পারে। তাই নিয়মটি পর্ব ০৩-এর attack surface কমানোর নীতি: যা দরকার নেই, তা বন্ধ।
যা অবসরে গেছে
| জিনিস | অবস্থা | কেন |
|---|---|---|
| SSL 2.0, SSL 3.0 | নিষিদ্ধ (RFC 6176, RFC 7568) | নকশাগত ত্রুটি |
| TLS 1.0, TLS 1.1 | বাতিল (RFC 8996, ২০২১) | পুরোনো hash আর নকশা |
| RC4 | নিষিদ্ধ (RFC 7465, ২০১৫) | Output-এ পরিসংখ্যানগত পক্ষপাত |
| 3DES | ছেড়ে দেওয়া হয়েছে | ৬৪-bit block, লম্বা সংযোগে ঝুঁকি (Sweet32, ২০১৬) |
| CBC-ভিত্তিক TLS cipher | নতুন configuration-এ বাদ | Padding-সংক্রান্ত দুর্বলতার ইতিহাস; AEAD ভালো বিকল্প |
| Static RSA key exchange | TLS 1.3-এ নেই; 1.2-তে বন্ধ রাখুন | Forward secrecy নেই |
| Export, NULL, anonymous cipher | কখনোই নয় | দুর্বল চাবি, এনক্রিপশন নেই বা পরিচয় নেই |
সুপারিশকৃত ভিত্তি
নিজে বাছাই না করে পরিচিত নির্দেশিকা অনুসরণ করাই নিরাপদ। তিনটি উৎস মিলিয়ে দেখুন, আর ব্যবহারের আগে সর্বশেষ সংস্করণ যাচাই করুন:
- Mozilla-র SSL Configuration Guidelines: এই পর্ব লেখার সময় version 6.0 দেখা গেছে। “Modern” প্রোফাইল শুধু TLS 1.3, আর “Intermediate” প্রোফাইল TLS 1.2 ও 1.3, যেখানে TLS 1.2-তে শুধু ECDHE-র সাথে AES-GCM বা ChaCha20-Poly1305 (পর্ব ০৮-এর AEAD). সাধারণ ওয়েবসাইটের জন্য Intermediate-ই প্রচলিত শুরু। নির্দেশিকার পুরোনো wiki পাতাটি সরে গেছে, তাই
ssl-config.mozilla.org-এর generator থেকে নিজের software version অনুযায়ী মিলিয়ে নিন। - NIST SP 800-52 Rev. 2 (২০১৯): মার্কিন সরকারি ব্যবস্থার নির্দেশিকা। সব সরকারি TLS server আর client-এ TLS 1.2 সমর্থন চায়, আর ২০২৪ সালের ১ জানুয়ারির মধ্যে TLS 1.3 সমর্থনের পরিকল্পনার কথা বলে। ২০২৬ সালে NIST এটি পর্যালোচনায় মতামত চেয়েছে আর সংশোধনের কথা জানিয়েছে, তাই নতুন সংস্করণ এসেছে কি না দেখে নিন। বাংলাদেশে এটি বাধ্যতামূলক নয়, তবে ভালো মানদণ্ড।
- RFC 9325 (BCP 195, ২০২২): IETF-এর TLS ব্যবহারের সুপারিশ।
সাধারণ ভিত্তি: TLS 1.3 চালু, TLS 1.2 শুধু ECDHE + AEAD, বাকি সব বন্ধ। খুব পুরোনো client সমর্থন করতে হলে সেটি একটি ঝুঁকির সিদ্ধান্ত: risk register-এ লিখুন, একজন risk owner ঠিক করুন, আর সেই সার্ভিস আলাদা করুন।
Forward secrecy — আজকের রেকর্ড কাল খোলা যাবে না
ধরুন কেউ আজ আপনার সব এনক্রিপ্টেড ট্রাফিক রেকর্ড করে রাখছে। দুই বছর পরে আপনার server-এর পুরোনো backup থেকে private key পাওয়া গেল। Static RSA-তে session-এর গোপন মান ওই key দিয়েই এনক্রিপ্ট হয়ে পথে গিয়েছিল, তাই পুরোনো সব রেকর্ড খুলে যায়। ECDHE-তে প্রতিটি সংযোগের জন্য অস্থায়ী চাবি তৈরি হয় আর কাজ শেষে মুছে যায়; certificate-এর key শুধু পরিচয় প্রমাণে স্বাক্ষর করে। তাই key চুরি গেলে ভবিষ্যতে নকল server সাজা সম্ভব হলেও পুরোনো রেকর্ড খোলে না।
একটি অফিসের কথা ভাবুন, যেখানে সব চিঠি একই তালা-চাবির বাক্সে যায়। চাবি হারালে দশ বছরের সব চিঠি উন্মুক্ত, এটি static RSA. আরেকটি অফিসে প্রতিটি চিঠির জন্য আলাদা নতুন তালা, পড়া শেষে চাবি ধ্বংস। অফিসের সিলমোহর চুরি গেলেও পুরোনো চিঠি খোলে না; সিলমোহর শুধু পরিচয়ের প্রমাণ।
দুটি ফাঁক মনে রাখুন:
- Session ticket-এর চাবি: এই চাবি দীর্ঘদিন একই থাকলে এবং চুরি গেলে, সেই চাবিনির্ভর পুরোনো session ঝুঁকিতে পড়তে পারে। বিশেষ করে TLS 1.2-তে এটি গুরুত্বপূর্ণ। হয় ticket বন্ধ রাখুন, নয় চাবি নিয়মিত ঘোরান।
- 0-RTT: এই early data-র forward secrecy দুর্বল আর এটি replay হতে পারে। তাই না বুঝে চালু করবেন না, আর চালু করলে শুধু নিরাপদে পুনরাবৃত্তিযোগ্য অনুরোধে সীমিত রাখুন।
৪ · ভালো configuration — nginx, HSTS আর নিজের server যাচাই
নিচের উদাহরণটি Mozilla-র Intermediate ধারণা অনুসরণ করে লেখা একটি nginx block. nginx শুধু একটি উদাহরণ; Apache, HAProxy বা আপনার load balancer-এ একই ধারণা অন্য নামে পাবেন। Path আর নাম আপনার নিজের মতো বদলে নিন।
# উদাহরণ: নিজের server-এর জন্য। সরাসরি কপি না করে আপনার nginx
# আর OpenSSL version অনুযায়ী generator থেকে মিলিয়ে নিন।
server {
listen 80;
listen [::]:80;
server_name shop.example.com;
# ACME http-01 ব্যবহার করলে এই path খোলা রাখতে হবে
location /.well-known/acme-challenge/ { root /var/www/acme; }
location / { return 301 https://shop.example.com$request_uri; }
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on; # nginx 1.25.1 বা নতুন
server_name shop.example.com;
ssl_certificate /etc/ssl/shop/fullchain.pem; # intermediate-সহ
ssl_certificate_key /etc/ssl/shop/privkey.pem; # শুধু root পড়বে
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off; # চাবি ঘোরানোর ব্যবস্থা না থাকলে বন্ধ
# শুরুতে ছোট max-age; সব sub-domain HTTPS হলে তবে বাড়ান
add_header Strict-Transport-Security "max-age=300" always;
# আপনার CA OCSP দিলে তবেই:
# ssl_stapling on;
# ssl_stapling_verify on;
# hybrid post-quantum key exchange, OpenSSL 3.5 বা নতুন লাগে:
# ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1;
}TLS 1.3-এর cipher নিয়ে এখানে কিছু লেখা নেই, কারণ ssl_ciphers শুধু TLS 1.2 পর্যন্ত নিয়ন্ত্রণ করে; TLS 1.3-এর suite নিরাপদ default হিসেবেই আসে। ssl_prefer_server_ciphers off client-কে নিজের পছন্দ বাছতে দেয়, কারণ তালিকার সব বিকল্পই শক্ত, আর AES হার্ডওয়্যার ছাড়া ফোন ChaCha20 বেছে নিতে পারে। বদলানোর পরে sudo nginx -t দিয়ে পরীক্ষা, তারপর sudo systemctl reload nginx.
nginx-এর দুটি ফাঁদ। (১) কোনো location-এ নিজের add_header থাকলে server-স্তরের header সেখানে আর আসে না, HSTS-ও হারাতে পারে। (২) একই IP আর port-এ একাধিক server block থাকলে default block-এর কিছু TLS সেটিং সবার ওপর প্রভাব ফেলতে পারে। দুটোই বাইরে থেকে যাচাই করে দেখুন।
HSTS আর preload — ধাপে ধাপে
HSTS (RFC 6797, ২০১২) ব্রাউজারকে বলে, এই সাইটে এতদিন শুধু HTTPS. ধারণাটি নেটওয়ার্ক কোর্সে আছে, এখানে আছে চালু করার ক্রম, কারণ ভুল করলে পুরোনো sub-domain বন্ধ হয়ে যেতে পারে।
- সব domain আর sub-domain-এর তালিকা বানান, ভেতরের যন্ত্রসহ। Mixed content দূর করুন।
max-age=300(৫ মিনিট) দিয়ে শুরু করে কিছুদিন দেখুন।- এক সপ্তাহ (৬০৪৮০০), তারপর এক মাস (২৫৯২০০০), তারপর এক বছর (৩১৫৩৬০০০) করুন। Mozilla-র নির্দেশিকা দুই বছর (৬৩০৭২০০০) বলে।
- প্রস্তুত হলে
includeSubDomainsযোগ করুন। - দীর্ঘমেয়াদে নিশ্চিত হলে তবেই preload ভাবুন।
hstspreload.org-এর বর্তমান শর্ত অনুযায়ী বৈধ certificate, HTTP থেকে HTTPS-এ redirect, সব sub-domain-এ HTTPS, আর base domain-এর header-এ অন্তত এক বছরের max-age, includeSubDomains ও preload থাকতে হয়। সেখানে স্পষ্ট বলা আছে, তালিকা থেকে বের হওয়া সহজ নয়: বদল পৌঁছাতে মাসের পর মাস লাগতে পারে। সিদ্ধান্তটি তাই দরজায় স্থায়ী তালা লাগানোর মতো ভেবে নিন।
নিজের server যাচাই — openssl s_client
Configuration ফাইল যা বলে আর client যা পায়, দুটো এক নাও হতে পারে। তাই নিজের server-এ বাইরে থেকে দেখুন। নিচের কমান্ডগুলো শুধু নিজের domain-এ বা নিজের অনুমোদিত সিস্টেমে চালাবেন।
# উদাহরণ: shop.example.com-এর জায়গায় আপনার নিজের domain বসান।
# ১. সংক্ষেপে: version, cipher আর যাচাইয়ের ফল
openssl s_client -connect shop.example.com:443 -servername shop.example.com \
-verify_hostname shop.example.com -verify_return_error -brief </dev/null
# ২. পাঠানো certificate-এর নাম আর মেয়াদ
openssl s_client -connect shop.example.com:443 -servername shop.example.com \
</dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -enddate
# ৩. ৩০ দিনের (2592000 সেকেন্ড) মধ্যে মেয়াদ শেষ হবে কি না
openssl x509 -in fullchain.pem -noout -checkend 2592000নমুনা আউটপুট — version-ভেদে আলাদা হতে পারে (কমান্ড ১, হাতে সাজানো; কোনো আসল সাইটের নয়):
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN = shop.example.com
Hash used: SHA256
Signature type: ecdsa_secp256r1_sha256
Verification: OK
Verified peername: shop.example.com
Peer Temp Key: X25519, 253 bits
DONE
কমান্ড ৩ এই পর্ব লেখার সময় একটি পরীক্ষার ফোল্ডারে বানানো self-signed certificate-এ (মেয়াদ ৯০ দিন) চালিয়ে দেখা হয়েছে। ৩০ দিনের সীমায় আউটপুট Certificate will not expire, exit code 0. ১০০ দিনের সীমায় (-checkend 8640000) আউটপুট Certificate will expire, exit code 1. এই exit code-ই script বা monitoring-এ কাজে লাগে।
খেলনা auditor — grade আর কারণ
আসল scanner অন্য সিস্টেমে যোগাযোগ করে, তাই এখানে তা নেই। নিচের auditor শুধু memory-র ভেতরের খেলনা config object পড়ে। নম্বরগুলো শেখার জন্য বানানো, কোনো মান নয়। নিয়ম বদলে দেখুন grade কীভাবে বদলায়।
// খেলনা config object, কোনো real server-এ যোগাযোগ নেই (শুধু ধারণার জন্য)
const sites = [
{ name: 'shop.example.com', versions: ['TLSv1.2', 'TLSv1.3'],
ciphers: ['ECDHE-RSA-AES128-GCM-SHA256'], hsts: 63072000, chainOk: true },
{ name: 'portal.example.com', versions: ['TLSv1.0', 'TLSv1.2'],
ciphers: ['ECDHE-RSA-AES128-GCM-SHA256', 'AES128-SHA'], hsts: 0, chainOk: true },
{ name: 'legacy.example.com', versions: ['SSLv3', 'TLSv1.2'],
ciphers: ['RC4-SHA'], hsts: 86400, chainOk: false },
];
// প্রতিটি নিয়ম: bad(site) সত্য হলে কত নম্বর কাটা যাবে আর কেন
const rules = [
{ cost: 60, why: 'SSLv3 on (retired, RFC 7568)', bad: s => s.versions.includes('SSLv3') },
{ cost: 25, why: 'TLS 1.0/1.1 on (retired, RFC 8996)',
bad: s => s.versions.some(v => v === 'TLSv1.0' || v === 'TLSv1.1') },
{ cost: 10, why: 'TLS 1.3 off', bad: s => !s.versions.includes('TLSv1.3') },
{ cost: 40, why: 'RC4 cipher on', bad: s => s.ciphers.some(c => c.includes('RC4')) },
{ cost: 20, why: 'cipher without forward secrecy',
bad: s => s.ciphers.some(c => !c.startsWith('ECDHE-') && !c.startsWith('DHE-')) },
{ cost: 40, why: 'incomplete certificate chain', bad: s => !s.chainOk },
{ cost: 10, why: 'HSTS missing or under 1 year', bad: s => s.hsts < 31536000 },
];
const grade = p => p >= 90 ? 'A' : p >= 70 ? 'B' : p >= 50 ? 'C' : 'F';
for (const s of sites) {
const hits = rules.filter(r => r.bad(s));
const points = Math.max(0, 100 - hits.reduce((sum, r) => sum + r.cost, 0));
console.log(`${s.name}: ${points}/100, grade ${grade(points)}`);
for (const r of hits) console.log(` -${r.cost} ${r.why}`);
}আউটপুট: shop.example.com: 100/100, grade A, portal.example.com: 35/100, grade F, legacy.example.com: 0/100, grade F. Portal-এর হিসাব: ১০০ − ২৫ − ১০ − ২০ − ১০ = ৩৫. AES128-SHA নামে ECDHE নেই, তাই “cipher without forward secrecy” ধরা পড়েছে। Legacy-তে মোট কাটা ১৮০, কিন্তু Math.max নম্বরকে ০-তে আটকে রাখে। শিক্ষাটি grade-এ নয়, কারণের তালিকায়: একটি grade লুকিয়ে ফেলে কোন কাজটি আগে করতে হবে, আর কারণ সেটি বলে দেয়।
৫ · Certificate সামলানো — automation, monitoring আর মেয়াদ শেষের বিভ্রাট
Certificate দারোয়ানের পরিচয়পত্রের মতো: মেয়াদ শেষ হলে লোকটি সৎ থাকলেও গেট দিয়ে ঢুকতে দেওয়া হবে না। প্রকৌশলে এই ব্যর্থতা অদ্ভুত, কারণ সময়টি আগে থেকেই জানা, তবু প্রতি বছর বড় বড় বিভ্রাট ঘটে।
Certificate-এর জীবনচক্র
একবারের কাজ নয়, ঘুরে ঘুরে চলা একটি চাকা
- তালিকা
inventoryকী কোথায়, মালিক কে - নেওয়া
ACME / private CAনতুন key - বসানো
deploy + reloadসব যন্ত্রে - দেখা
monitorবাইরে থেকে - নবায়ন
renew / revokeআবার শুরু
মেয়াদ ছোট হচ্ছে
CA/Browser Forum ২০২৫ সালের এপ্রিলে ballot SC-081 গ্রহণ করে। Baseline Requirements-এ এখন যে সূচি দেখা যায় (অক্টোবর ২০২৬-এ মিলিয়ে দেখা):
| যে তারিখ থেকে ইস্যু | সর্বোচ্চ মেয়াদ | Domain যাচাই পুনর্ব্যবহার |
|---|---|---|
| ১৫ মার্চ ২০২৬ (এখন কার্যকর) | ২০০ দিন | ২০০ দিন |
| ১৫ মার্চ ২০২৭ | ১০০ দিন | ১০০ দিন |
| ১৫ মার্চ ২০২৯ | ৪৭ দিন | ১০ দিন |
এই সূচি সর্বজনীনভাবে বিশ্বস্ত TLS certificate-এর জন্য; নিজের private CA-তে আপনার নিজের নীতি চলে। সূচি বদলাতে পারে, তাই পরিকল্পনার আগে সর্বশেষ Baseline Requirements দেখে নিন। কিছু CA নিজেরাও আরও ছোট মেয়াদের পরিকল্পনা জানিয়েছে; নিজের CA-র ঘোষণা পড়ুন। মেয়াদ ছোট করার একটি কারণ revocation-এর দুর্বলতা: বাতিলের খবর সবার কাছে না পৌঁছালেও চুরি যাওয়া key-র ক্ষতি কম সময়ে থামে। কিছু CA এখন OCSP ছেড়ে CRL-এ গেছে, তাই stapling সেটিং আপনার CA অনুযায়ী দেখে নিন।
Automation-এর হিসাব
ধরা যাক ১২০টি certificate, হাতে প্রতিবার ৩০ মিনিট, আর মেয়াদের ২/৩ পার হলে নবায়ন। প্রতি ১০০ বার হাতের কাজে ২ বার ভুল হয়, এটি শেখার জন্য ধরে নেওয়া সংখ্যা, কোনো পরিমাপ নয়।
// ধরে নেওয়া সংখ্যা: 120 certificate, হাতে প্রতিবার 30 মিনিট,
// প্রতি 100 বার হাতের নবায়নে 2 বার কিছু ভুল হয়। মেয়াদের 2/3 পার হলে নবায়ন।
const CERTS = 120, MINUTES = 30, MISS_RATE = 0.02;
const lifetimes = [398, 200, 100, 47];
console.log('max_days renew_every per_year hours/yr expected_misses');
for (const days of lifetimes) {
const every = days * 2 / 3;
const perYear = 365 / every;
const total = perYear * CERTS;
const hours = total * MINUTES / 60;
const misses = total * MISS_RATE;
console.log(
String(days).padStart(8) + every.toFixed(1).padStart(13) +
perYear.toFixed(2).padStart(10) + hours.toFixed(0).padStart(10) +
misses.toFixed(1).padStart(17));
}৪৭ দিনের সারিটি হাতে মিলিয়ে নিন: ৪৭ × ২/৩ = ৩১.৩ দিন পরপর নবায়ন; ৩৬৫ ÷ ৩১.৩ ≈ ১১.৬৫ বার; ১১.৬৫ × ১২০ ≈ ১,৩৯৮টি নবায়ন; অর্ধেক ঘণ্টা করে ≈ ৬৯৯ ঘণ্টা; ২% ভুল ধরলে ≈ ২৮.০ বার। আউটপুটেও তাই: 47 31.3 11.65 699 28.0. আর ৩৯৮ দিনের সারিতে ৮৩ ঘণ্টা আর ৩.৩ বার। কাজ প্রায় আট গুণ, অথচ বদলেছে শুধু মেয়াদ। হাতের কাজে এই হিসাব মেলে না, তাই ACME (RFC 8555) বা আপনার CA-র automation দরকার। নির্দিষ্ট “৬০ দিন পরপর” না লিখে মেয়াদের অনুপাতে, বা ARI অনুযায়ী, নবায়ন করা ভালো।
কেন ভোলা certificate-ই বিভ্রাট ঘটায়
- মালিক নেই: যিনি জানতেন তিনি চলে গেছেন, alert যায় পুরোনো mailbox-এ।
- তালিকার বাইরে: load balancer, VPN, firewall, ভেতরের API, ক্যামেরা, বা অ্যাপে বসানো certificate. Certificate Transparency log আর নিয়মিত নিজের সিস্টেমের তালিকা মেলানো এখানে সাহায্য করে।
- নবায়ন হলো, বসল না: নতুন ফাইল disk-এ আছে, কিন্তু server reload হয়নি।
- Automation নিজেই থেমে গেছে: firewall বা WAF নিয়ম বদলে ACME-র যাচাই আটকে যায়।
- সতর্কতা শুধু মেয়াদের ওপর: নবায়ন ব্যর্থতার alert নেই, তাই সমস্যা জানা যায় অনেক দেরিতে।
প্রকাশিত দুটি উদাহরণ দেখুন। ডিসেম্বর ২০১৮-তে Ericsson-এর network software-এর একটি মেয়াদোত্তীর্ণ certificate কয়েক দেশের মোবাইল সেবায় বিঘ্ন ঘটিয়েছিল বলে প্রতিষ্ঠানটির প্রাথমিক বিশ্লেষণ ও সংবাদে জানা যায়। Equifax (২০১৭) নিয়ে অংশ ৭-এ আসছি। নিচের ঘটনাটি কাল্পনিক, কিন্তু এমন ঘটনা বাস্তবে ঘটে।
- নীরব ব্যর্থতা
৩০ দিন বাকিকেউ দেখেনি - Alert
৭ দিন বাকিon-call - কারণ
challenge 403WAF নিয়ম - সমাধান
renew + reloadবাইরে থেকে যাচাই - শিক্ষা
post-incidentদোষ নয়, ব্যবস্থা
| তারিখ | |
| দিন বাকি (client-এর চোখে) | |
| Disk-এ মেয়াদ শেষ | |
| Client যা পায় | |
| অবস্থা |
- নীরব ব্যর্থতা। ৩০ দিন বাকি থাকতে ACME client নবায়নের চেষ্টা করে ব্যর্থ হয়। কেউ এক সপ্তাহ আগে WAF-এ একটি নতুন নিয়ম বসিয়েছিলেন। ব্যর্থতার খবর শুধু একটি log ফাইলে, কেউ পড়ে না।
- ভুল জায়গায় alert. ১৪ দিন বাকি। বাইরের monitor WARNING পাঠায় একটি পুরোনো দলীয় mailbox-এ। এই ঠিকানা কেউ দেখে না। আগের দুই সপ্তাহ আর এই সতর্কতা দুটোই হারিয়ে গেল।
- Alert মানুষের কাছে। ৭ দিন বাকি। CRITICAL যায় on-call প্রকৌশলীর ফোনে। তিনি প্রথমে বাইরে থেকে
openssl s_clientদিয়ে দেখেন, alert সত্যি: মেয়াদ ২০ ডিসেম্বরেই শেষ। গ্রাহকের ক্ষতি এখনো হয়নি, তাই শান্তভাবে কাজ করার সময় আছে। - কারণ খোঁজা। ACME client-এর log বলছে
/.well-known/-এ 403. অর্থাৎ CA যাচাই-ফাইল পড়তে পারছে না। নতুন WAF নিয়মের সময়ের সাথে প্রথম ব্যর্থতার সময় মিলে গেল। Log-এ সময় মেলানোই আসল কাজ।acme-challenge/ - পথ খুলে নবায়ন। ওই একটি path-এ WAF ছাড় পেল, আর কিছু নয়। প্রথমে পরীক্ষামূলক (dry run) চালিয়ে, তারপর আসল নবায়ন। Disk-এ এখন ৯০ দিনের নতুন certificate, মেয়াদ ১৩ মার্চ ২০২৭. অনেকে এখানেই থেমে যান।
- বাইরে থেকে যাচাই ধরল ফাঁক। আবার
s_client: client এখনো ২০ ডিসেম্বরের পুরোনো certificate পাচ্ছে! nginx চলমান অবস্থায় ফাইল নিজে থেকে নতুন করে পড়ে না। “ফাইল বদলেছে” আর “client নতুন পাচ্ছে” এক কথা নয়। - Reload আর পুনরায় যাচাই।
nginx -t, তারপর reload. বাইরে থেকে দেখা গেল নতুন তারিখ, পুরো chain আর সঠিক নাম। একাধিক server থাকলে প্রতিটি থেকে যাচাই করতে হয়। এবার client-ও ৯০ দিন দেখছে। - দোষ নয়, ব্যবস্থা বদলানো। নবায়ন ব্যর্থতায় প্রথম দিনেই alert, ACME-র deploy hook দিয়ে স্বয়ংক্রিয় reload, প্রতিটি certificate-এ বর্তমান মালিক, আর WAF বদলের checklist-এ ACME path. কাউকে দোষ না দিয়ে প্রক্রিয়া ঠিক করা হলো (পর্ব ৬১-এ incident response).
Monitoring — simulated তারিখে
ভালো monitoring তিনটি কাজ করে: মেয়াদ দেখে, নবায়ন ব্যর্থতা দেখে, আর মালিকহীন certificate ধরে। নিচের monitor একটি নির্দিষ্ট তালিকা আর একটি কাল্পনিক “আজ” (১৩ ডিসেম্বর ২০২৬) ধরে চলে; আসল সময় বা network ব্যবহার করে না।
// simulated clock: আসল তারিখ ব্যবহার হয় না। তালিকাটিও খেলনা।
const TODAY = Date.UTC(2026, 11, 13); // 2026-12-13
const DAY = 86400000;
const inventory = [
{ name: 'shop.example.com', notAfter: [2026, 12, 20], owner: 'web-team', renewOk: false },
{ name: 'api.example.com', notAfter: [2027, 2, 10], owner: 'api-team', renewOk: true },
{ name: 'vpn.example.com', notAfter: [2026, 12, 29], owner: 'net-team', renewOk: true },
{ name: 'admin.example.com', notAfter: [2026, 12, 9], owner: 'web-team', renewOk: false },
{ name: 'old.example.com', notAfter: [2027, 1, 5], owner: '', renewOk: true },
];
function status(left) {
if (left < 0) return 'EXPIRED';
if (left <= 7) return 'CRITICAL';
if (left <= 30) return 'WARNING';
return 'OK';
}
const rows = inventory.map(c => {
const [y, m, d] = c.notAfter;
const left = Math.floor((Date.UTC(y, m - 1, d) - TODAY) / DAY);
const notes = [];
if (!c.renewOk) notes.push('last auto-renew FAILED');
if (!c.owner) notes.push('no owner');
return { ...c, left, st: status(left), notes };
});
rows.sort((a, b) => a.left - b.left);
for (const r of rows) {
console.log(r.st.padEnd(9) + String(r.left).padStart(4) + 'd ' +
r.name.padEnd(19) + r.notes.join(', '));
}
const page = rows.filter(r => r.st === 'EXPIRED' || r.st === 'CRITICAL').length;
console.log(`page on-call now: ${page}, of ${rows.length} certificates`);প্রথম সারি EXPIRED -4d admin.example.com last auto-renew FAILED, মানে চার দিন আগেই শেষ। দ্বিতীয় সারি CRITICAL 7d shop.example.com. শেষ লাইন page on-call now: 2, of 5 certificates. old.example.com-এ ২৩ দিন বাকি আর নিজে থেকে নবায়ন সফল, তবু no owner দেখাচ্ছে: আজ সমস্যা নেই, কিন্তু নবায়ন ভাঙলে কার কাছে যাবে কেউ জানে না। তালিকা মেয়াদ অনুযায়ী সাজানো, তাই জরুরি কাজ ওপরে থাকে। আসল ব্যবস্থায় এই তথ্য নিজের inventory আর বাইরের পরীক্ষা, দুই জায়গা থেকেই আসা উচিত।
৬ · mTLS আর TLS termination — proxy-র পেছনে কী খোলা থাকে
TLS কোথায় শেষ হয়
বেশিরভাগ বড় সিস্টেমে TLS app server পর্যন্ত যায় না। সামনের reverse proxy, load balancer বা CDN সেটি খুলে ফেলে, একে বলে TLS termination. সুবিধা অনেক: certificate এক জায়গায়, HTTP দেখে routing, API gateway বা WAF-এর কাজ। কিন্তু একটি বিষয় ভোলা চলে না: TLS খোলা মানে proxy-র memory-তে পুরো ডেটা খোলা।
একটি অনুরোধের পথ: কোথায় এনক্রিপ্টেড, কোথায় খোলা
Hop-by-hop সুরক্ষা, end-to-end নয়
একটি login অনুরোধ এই পথে কীভাবে যায়, ধাপে ধাপে দেখুন। ডেটার মানগুলো কাল্পনিক।
- ব্রাউজার
POST /loginTLS-এ মোড়া - Edge proxy
TLS শেষডেটা খোলা - ভেতরের পথ
HTTP বা mTLSসিদ্ধান্ত আপনার - App
log, DBআবার খোলা
| কোথায় | |
| ডেটার অবস্থা | |
| কে দেখতে পারে | |
| যা করবেন |
- পথে এনক্রিপ্টেড। Wi-Fi বা ISP শুধু IP ঠিকানা, ECH ছাড়া SNI, আর ডেটার আকার দেখে। Password দেখে না। এই অংশটুকু TLS ঠিকই রক্ষা করছে।
- Proxy TLS খুলল। এখানেই সংযোগ শেষ। Proxy-র memory-তে পুরো অনুরোধ, password-সহ, খোলা। সাইটের private key-ও এখানে। তাই এই যন্ত্র আপনার সবচেয়ে গুরুত্বপূর্ণ সম্পদগুলোর একটি; CDN হলে সেই প্রতিষ্ঠানকেও বিশ্বাস করতে হয়।
- Proxy header যোগ করল।
X-Forwarded-ForআরX-Forwarded-Proto: httpsদিয়ে app জানে আসল client কে। App যেন এই header শুধু নিজের proxy থেকে মানে; বাইরে থেকে আসা একই header মুছে ফেলতে হয়। - দুর্বল নকশা: ভেতরে খোলা HTTP. “ভেতরের network তো নিরাপদ” এই ধারণা বিপজ্জনক। একটি যন্ত্র আক্রান্ত হলে, traffic mirror ভুল জায়গায় গেলে, বা lateral movement-এর সময় password খোলা অবস্থায় পাওয়া যায়।
- ভালো নকশা: আবার TLS. Proxy নতুন TLS সংযোগ খোলে, প্রায়ই mTLS দিয়ে, certificate আসে private CA থেকে। ভেতরের পথেও ডেটা এনক্রিপ্টেড থাকে। এটি defense in depth আর zero trust-এর ধারণা (পর্ব ৭৪)।
- App-এ আবার খোলা। App-কে ডেটা পড়তেই হবে, তাই এখানে খোলা। Password যাচাই করে সাথে সাথে memory থেকে ফেলে দেওয়া ভালো। Database পর্যন্ত পথও TLS দিয়ে রাখুন।
- TLS-এর চোখের আড়ালে: log. Debug log-এ পুরো request body লেখা থাকলে সব সুরক্ষা ব্যর্থ। TLS পথ রক্ষা করে, ফাইল নয়। অনেক ফাঁস ঘটে এমন ভুল থেকেই (পর্ব ৫৫-এ log-এর নিয়ম)।
| ধরন | কীভাবে | লাভ | ঝুঁকি |
|---|---|---|---|
| Edge-এ শেষ | ভেতরে খোলা HTTP | সরল, দ্রুত | ভেতরের পথে সব খোলা |
| Re-encryption | Edge-এ খোলে, ভেতরে নতুন TLS | WAF আর routing থাকে, পথও এনক্রিপ্টেড | দুই সেট certificate সামলানো |
| Passthrough | Proxy TLS খোলে না, app খোলে | Proxy ডেটা দেখে না | HTTP দেখে routing বা WAF চলে না |
mTLS — সার্ভিসে সার্ভিসে পরিচয়পত্র
সাধারণ TLS-এ শুধু server পরিচয় দেয়। mTLS-এ client-ও certificate দেখায়। অফিসের গেটে দারোয়ান আপনার কার্ড দেখছেন, আপনিও দারোয়ানের পোশাক আর কার্ড দেখছেন। ভেতরের API-তে password বা স্থায়ী token-এর বদলে এটি চমৎকার, কারণ private key পথে যায় না।
অপারেটরের চোখে কয়েকটি কথা:
- Private CA ব্যবহার করুন। নিজের network-এর ভেতরের পরিচয়ের জন্য এটিই স্বাভাবিক, আর এর key খুব সাবধানে রাখতে হয় (Secrets ও KMS). সর্বজনীন certificate-এ client authentication ব্যবহার এখন ঝুঁকিপূর্ণ: Chrome-এর root program নীতির জেরে সর্বজনীন CA-গুলো ২০২৬ থেকে ধাপে ধাপে এই ব্যবহার সরিয়ে নিচ্ছে বলে CA-দের ঘোষণায় জানা যায়। তারিখ নিজের CA থেকে মিলিয়ে নিন।
- মেয়াদ ছোট, নবায়ন স্বয়ংক্রিয়। Service mesh বা SPIFFE-র মতো ব্যবস্থা ঘণ্টা বা দিনের মেয়াদে certificate দিতে পারে।
- পরিচয় মানে অনুমতি নয়। mTLS বলে “এটি billing সার্ভিস”; “billing কি এই ডেটা পড়তে পারে?” সেই প্রশ্ন authorization-এর (পর্ব ১৯)।
- Trust store সীমিত রাখুন। যে CA-কে client হিসেবে মানছেন, সে CA থেকে পাওয়া সব certificate ঢুকতে পারে। তাই শুধু chain নয়, নামও যাচাই করুন।
৭ · TLS inspection, SNI আর ECH — দেখা আর না-দেখার টানাপোড়েন
TLS inspection
প্রতিষ্ঠানের নিরাপত্তা দল বলে, malware-ও HTTPS ব্যবহার করে, না দেখলে ধরব কীভাবে? সমাধান হিসেবে TLS inspection: প্রতিষ্ঠানের নিজের root CA সব অফিস-যন্ত্রের trust store-এ বসানো হয়, আর একটি proxy দুই দিকের সংযোগ আলাদা করে খুলে দেখে। কাঠামোগতভাবে এটি একটি অনুমোদিত MITM. TLS 1.3-এ পুরোনো “passive decrypt” চলে না, তাই এই সক্রিয় proxy বা endpoint-এ নজরদারিই প্রধান পথ।
| লাভ | ক্ষতি |
|---|---|
| Malware আর ডেটা পাচার দেখা সহজ | Proxy-ই বড় লক্ষ্যবস্তু: সব ডেটা আর একটি শক্তিশালী CA key সেখানে |
| কিছু নিয়ন্ত্রিত খাতের চাহিদা মেটে | পণ্যের TLS দুর্বল হলে নিরাপত্তা কমে। Durumeric ও সহকর্মীদের ২০১৭ সালের NDSS গবেষণায় বহু interception পণ্য সংযোগের নিরাপত্তা কমিয়েছিল বলে দেখা যায় |
| Web filter আর DLP চলে | Certificate pinning আর mTLS ভেঙে যায়; ব্যাংক বা স্বাস্থ্যের সাইটে গোপনীয়তার প্রশ্ন |
| ঘটনার তদন্তে প্রমাণ | গতি কমে, আর যন্ত্রটির নিজস্ব certificate-ও নবায়ন করতে হয় |
যদি করতেই হয়: লিখিত নীতি আর কর্মীদের জানানো, ব্যাংকিং ও স্বাস্থ্যের মতো শ্রেণি বাদ, CA key হার্ডওয়্যারে রাখা, পণ্যের outbound TLS পরীক্ষা, আর শুধু নিজের প্রতিষ্ঠানের যন্ত্রে। আইনি দিক দেশভেদে আলাদা; এটি আইনি পরামর্শ নয়, প্রতিষ্ঠানের আইনজীবীর সাথে কথা বলুন (পর্ব ০৬)।
Equifax (২০১৭): মার্কিন প্রতিনিধি পরিষদের কমিটির ডিসেম্বর ২০১৮ সালের কর্মী-প্রতিবেদন অনুযায়ী, একটি SSL inspection যন্ত্রের certificate ১৯ মাস আগে মেয়াদোত্তীর্ণ ছিল, ফলে সেই ট্রাফিক পরীক্ষা হচ্ছিল না। নবায়নের পর সন্দেহজনক ট্রাফিক চোখে পড়ে বলে প্রতিবেদনে বলা হয়। Equifax প্রতিবেদনের কিছু অংশে আপত্তি জানিয়েছিল। শিক্ষাটি এখানে: নজরদারির যন্ত্রও নজরদারির আওতায় রাখতে হয়।
SNI আর ECH — একটি সংক্ষিপ্ত নোট
একই IP-তে অনেক সাইট থাকে, তাই client SNI-তে নাম বলে, আর সেটি খোলা। ECH (RFC 9849, মার্চ ২০২৬) আসল নামসহ ClientHello-র গোপন অংশ এনক্রিপ্ট করে; বাইরের অংশে থাকে একটি সাধারণ public_name. Key আসে DNS থেকে, তাই DNS-ও এনক্রিপ্টেড না হলে লাভ কমে। সমর্থন ব্রাউজার আর সেবাভেদে আলাদা।
অপারেটরের জন্য অর্থ: নিজের সাইটে চালু করতে হলে DNS-এর HTTPS record আর server-এর সমর্থন লাগবে। আবার প্রতিষ্ঠানের যে filter SNI দেখে সিদ্ধান্ত নেয়, ভবিষ্যতে সেটি কিছু ট্রাফিকে অন্ধ হতে পারে, তাই শুধু SNI-র ওপর নির্ভর করা নকশা এখনই ভেবে দেখা ভালো। ব্যবহারকারীর গোপনীয়তা আর প্রতিষ্ঠানের দৃশ্যমানতা, দুটোই বৈধ লক্ষ্য; সিদ্ধান্ত নিতে হয় ঝুঁকি মেপে।
৮ · সাধারণ ভুল আর ইতিহাসের শিক্ষা — verify=False, Heartbleed, POODLE
সাধারণ ভুলের তালিকা
| ভুল | লক্ষণ | প্রতিকার |
|---|---|---|
| Intermediate নেই | ব্রাউজারে চলে, অ্যাপ বা curl-এ ব্যর্থ | fullchain.pem ব্যবহার, একাধিক client-এ পরীক্ষা |
| নাম মেলে না | www আছে, মূল domain নেই | দুটি নামই SAN-এ রাখা |
| Private key ফাঁস | Key repo বা ভুল permission-এ | chmod 600, secret scanning, key বদল আর revoke |
| Wildcard key সবখানে | এক যন্ত্র গেলে সব নাম ঝুঁকিতে | সার্ভিস অনুযায়ী আলাদা certificate; blast radius ছোট রাখা |
| পুরোনো default | পুরোনো যন্ত্রে TLS 1.0 চালু | Load balancer আর appliance-ও audit |
| ভুল ঘড়ি | নতুন certificate-ও “মেয়াদোত্তীর্ণ” | NTP ঠিক রাখা |
| অ্যাপে certificate পিন | নবায়নের পর অ্যাপ বন্ধ | পিন করলে ব্যাকআপ key আর হালনাগাদের পরিকল্পনা |
verify=False — ত্রুটি লুকানোর সবচেয়ে বিপজ্জনক সমাধান
রাত ২টা। ভেতরের API-তে CERTIFICATE_VERIFY_FAILED এল। Stack Overflow বা AI বলল, একটি flag যোগ করুন, সব ঠিক হয়ে যাবে। সত্যিই ঠিক হয়ে যায়, আর সেখানেই বিপদ। ত্রুটিটি ধোঁয়ার অ্যালার্ম ছিল; আপনি ব্যাটারি খুলে নিলেন।
# উদাহরণ: চালানোর জন্য নয়। api.example.com একটি নমুনা নাম।
import requests
# অ্যান্টি-প্যাটার্ন: যাচাই বন্ধ। কোনো নকল server-ও গৃহীত হবে।
r = requests.get("https://api.example.com/health", verify=False)
# ঠিক পথ: ভেতরের CA-কে স্পষ্টভাবে বিশ্বাস করা
r = requests.get("https://api.example.com/health",
verify="/etc/ssl/internal-ca.pem", timeout=5)একই ভুলের অন্য রূপ: curl -k, Node.js-এর rejectUnauthorized: false, আর NODE_TLS_. নিচের খেলনা client দেখায় যাচাই থাকা আর না থাকার পার্থক্য। এখানে কোনো network নেই।
// খেলনা client: কোনো network নেই, certificate মানে সাধারণ object
const TODAY = '2026-12-13';
const trustStore = ['Example Root CA'];
const certs = [
{ label: 'real server', san: ['shop.example.com'], root: 'Example Root CA', notAfter: '2027-03-13' },
{ label: 'expired', san: ['shop.example.com'], root: 'Example Root CA', notAfter: '2026-12-09' },
{ label: 'wrong name', san: ['mail.example.com'], root: 'Example Root CA', notAfter: '2027-03-13' },
{ label: 'self-signed', san: ['shop.example.com'], root: 'Unknown Lab CA', notAfter: '2027-03-13' },
];
function nameMatches(host, pattern) {
if (!pattern.startsWith('*.')) return host === pattern;
const parts = host.split('.'); // wildcard: ঠিক একটি label
return parts.slice(1).join('.') === pattern.slice(2);
}
function verify(cert, host, verifyOn) {
if (!verifyOn) return 'CONNECT (nothing checked)';
if (!trustStore.includes(cert.root)) return 'REFUSE: untrusted issuer';
if (cert.notAfter < TODAY) return 'REFUSE: expired';
if (!cert.san.some(p => nameMatches(host, p))) return 'REFUSE: hostname mismatch';
return 'CONNECT (verified)';
}
const host = 'shop.example.com';
for (const flag of [true, false]) {
console.log(`verify=${flag ? 'True' : 'False'}`);
for (const c of certs) {
console.log(' ' + c.label.padEnd(13) + verify(c, host, flag));
}
}verify=True-তে তিনটি খারাপ certificate আটকে যায়: REFUSE: expired, REFUSE: hostname mismatch, REFUSE: untrusted issuer. verify=False-তে চারটি সারিই CONNECT (nothing checked). এখনো এনক্রিপশন আছে, কিন্তু কার সাথে এনক্রিপ্ট করছেন তা অজানা; মাঝখানের লোকের সাথেও “নিরাপদে” কথা বলতে পারেন। আসল সমস্যা সাধারণত তিনটির একটি: chain অসম্পূর্ণ, CA অজানা, বা নাম ভুল। সেটিই ঠিক করুন। Detection: CI-তে এই pattern-গুলো খোঁজার নিয়ম রাখুন, আর code review-তে আটকান (পর্ব ৪৯)।
Heartbleed আর POODLE — দুই ধরনের ব্যর্থতা
দুটি ঘটনাই ২০১৪ সালের। এখানে শুধু প্রকাশিত প্রতিবেদনের স্তরে, প্রতিরক্ষার শিক্ষা হিসেবে দেখুন।
| Heartbleed (CVE-2014-0160, এপ্রিল) | POODLE (CVE-2014-3566, অক্টোবর) | |
|---|---|---|
| ধরন | বাস্তবায়নের ভুল: OpenSSL-এর heartbeat কোডে দৈর্ঘ্য যাচাই ছিল না | নকশার দুর্বলতা: SSL 3.0-এর CBC padding, সাথে পুরোনো version-এ নেমে আসা |
| প্রভাব | Server-এর memory-র অংশ ফাঁস, যাতে key বা session তথ্য থাকতে পারত | কিছু পরিস্থিতিতে এনক্রিপ্টেড ডেটার অংশ উদ্ধারের ঝুঁকি |
| Protocol ঠিক ছিল? | হ্যাঁ, ভুল ছিল কোডে | না, ভুল ছিল protocol-এই |
| সাড়া | Patch, key বদল, নতুন certificate, পুরোনোটি revoke, session বাতিল | SSL 3.0 বন্ধ; পরে RFC 7507 (fallback সুরক্ষা) আর RFC 7568 |
| শিক্ষা | কোথায় কোন library আছে জানুন (পর্ব ৩২, ৪৮); patch-ই শেষ কথা নয় | “সামঞ্জস্যের জন্য” রাখা পুরোনো বিকল্পই আক্রমণের পথ |
আরও গভীরে: TLS 1.3-এর সার্ভার পুরোনো version-এ নামলে তার random-এর শেষ ৮ বাইটে একটি বিশেষ চিহ্ন রেখে দিয়ে client-কে downgrade ধরতে সাহায্য করে (RFC 8446 §4.1.3). আজকের ECDHE ভবিষ্যতের বড় quantum কম্পিউটারের সামনে দুর্বল হতে পারে, তাই “এখন রেকর্ড, পরে খোলা” ঠেকাতে X25519-এর সাথে ML-KEM মেশানো hybrid key exchange ছড়াচ্ছে; এতে ClientHello বড় হয়, আর কিছু middlebox সমস্যা করতে পারে (পর্ব ১৪). TLS মানের সংশোধনের কাজও IETF-এ চলছে, তাই RFC-র সর্বশেষ অবস্থা দেখে নিন।
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- Forward secrecy কী, কীভাবে পাওয়া যায়? — Key পরে ফাঁস হলেও পুরোনো session খোলে না; অস্থায়ী ECDHE দিয়ে।
- TLS 1.3-এ কী বাদ গেছে? — Static RSA, CBC, RC4, compression, renegotiation; handshake ১ RTT আর certificate এনক্রিপ্টেড।
- ব্রাউজারে সাইট চলে,
curl-এ certificate error. প্রথম সন্দেহ? — Intermediate পাঠানো হচ্ছে না, অথবা client-এর trust store ভিন্ন। - Certificate নবায়ন হলো, তবু পুরোনোটি দেখা যাচ্ছে। কেন? — Server reload হয়নি, বা অন্য যন্ত্রে বসানো হয়নি।
- TLS termination-এর ঝুঁকি কী? — Proxy-তে ডেটা আর key খোলা; পেছনের পথ আলাদা করে সুরক্ষিত করতে হয়।
৯ · Checklist আর AI-এর যুগে TLS
অপারেটরের TLS checklist
AI কোথায় ভুল করে
| AI যা বলতে পারে | সমস্যা | আপনি যা করবেন |
|---|---|---|
Certificate error-এ verify=False বা -k | লক্ষণ লুকায়, MITM-এর পথ খোলে | Chain, CA আর নাম দেখুন |
| পুরোনো cipher তালিকা, TLS 1.0 চালু | পুরোনো টিউটোরিয়াল থেকে শেখা | Mozilla-র generator-এ মিলিয়ে নিন |
| অস্তিত্বহীন CVE বা RFC নম্বর | বানানো হতে পারে | NVD আর rfc-editor.org-এ যাচাই |
| পুরোনো certificate মেয়াদের নিয়ম | নিয়ম দ্রুত বদলাচ্ছে | Baseline Requirements পড়ুন |
| “এখন সিস্টেম নিরাপদ” জাতীয় নিশ্চয়তা | আসল server সে দেখেনি | নিজের server বাইরে থেকে যাচাই করুন |
| প্রম্পটে key চাওয়া বা গ্রহণ করা | Secret ফাঁস | Key বা token কখনো পেস্ট করবেন না |
AI-কে আপনার config পর্যালোচনায় ব্যবহার করুন, শর্ত হলো secret বাদ দিয়ে আর উৎস চেয়ে। নিচের প্রম্পটে নাম আর path বদলে নিন:
AI-এর পরামর্শ বসানোর আগে
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।
প্র ০১TLS 1.3 static RSA key exchange সরিয়ে দিল। তাহলে কিছু প্রতিষ্ঠান কেন এর বিরোধিতা করেছিল? শেষে কী হলো?
Static RSA-তে একটি সুবিধা ছিল, যা নিরাপত্তার দিক থেকে আবার দুর্বলতাও। Server-এর private key হাতে থাকলে আগে রেকর্ড করা ট্রাফিক পরে খোলা যেত। ব্যাংকের মতো বড় প্রতিষ্ঠান এটি কাজে লাগাত: data center-এর ভেতরে ট্রাফিক কপি করে একটি যন্ত্রে পাঠিয়ে সমস্যা খুঁজত, লেনদেনের গতি মাপত, আক্রমণ তদন্ত করত।
TLS 1.3-এর আলোচনায় অর্থখাতের কিছু প্রতিনিধি উদ্বেগ জানান যে forward secrecy বাধ্যতামূলক হলে এই পদ্ধতি বন্ধ হবে। IETF-এর মূল সিদ্ধান্ত ছিল নিরাপত্তার পক্ষে: passive decrypt-এর ক্ষমতা যার হাতে, চুরি করা key হাতে পাওয়া আক্রমণকারীর হাতেও সেই একই ক্ষমতা আসে। মানে একটি মাত্র key ফাঁস হলে বছরের পর বছরের রেকর্ড খুলে যেত। নকশায় ব্যতিক্রম রাখলে সেটি downgrade-এর পথও হতে পারত।
পরে ETSI “Enterprise Transport Security” নামে একটি ভিন্ন ধারার মান প্রকাশ করে, যেখানে স্থির key share ব্যবহার করে ভেতরে দৃশ্যমানতা রাখা যায়। এটি নিয়ে বিতর্ক আছে। অন্যদিকে NIST-এর NCCoE প্রকল্প SP 1800-37-এ TLS 1.3-এর যুগে প্রতিষ্ঠানের দৃশ্যমানতার পথ নিয়ে কাজ করেছে। বাস্তবে দৃশ্যমানতা এখন সরে যাচ্ছে তিন জায়গায়: সংযোগের শেষ প্রান্তে (termination-এর পরে), application-এর structured log-এ, আর endpoint-এর EDR-এ।
এই বিতর্ক থেকে বোঝা যায়, নিরাপত্তার সিদ্ধান্ত প্রায়ই দুই বৈধ লক্ষ্যের মধ্যে টানাপোড়েন। একদিকে ভবিষ্যতের গোপনীয়তা, অন্যদিকে আজকের নজরদারি। সবার জন্য খোলা দরজা রেখে শুধু “ভালো মানুষ” ঢুকবে, এমন ব্যবস্থা বানানো যায় না।
মূল উপলব্ধি: যে ক্ষমতা আপনার কাজে লাগে, চুরি হলে সেটি শত্রুর কাজেও লাগে। তাই দৃশ্যমানতা এমন জায়গায় তৈরি করুন, যেখানে তা পুরো ব্যবস্থার গোপনীয়তা না ভেঙে পাওয়া যায়।
প্র ০২Heartbleed-এর সময় শুধু patch করা কেন যথেষ্ট ছিল না? একজন অপারেটর হিসেবে সঠিক সাড়া কী হতো?
২০১৪ সালের এপ্রিলে প্রকাশিত Heartbleed (CVE-2014-0160) ছিল OpenSSL-এর ১.০.১ শাখার কয়েকটি release-এর ত্রুটি, যাতে heartbeat বার্তার দৈর্ঘ্য ঠিকমতো যাচাই হতো না। ফলে server-এর memory-র অংশ বাইরে যেতে পারত। ত্রুটিটি দুই বছরের মতো প্রকাশিত কোডে ছিল। সবচেয়ে অস্বস্তির কথা, এই ফাঁসের স্বাভাবিক log-এ তেমন চিহ্ন থাকত না।
Patch ভবিষ্যতের ফাঁস থামায়, অতীতের ফাঁস ফেরত আনে না। অর্থাৎ অপারেটরকে ধরে নিতে হয়েছিল যে private key, session cookie আর password আগেই বেরিয়ে গিয়ে থাকতে পারে, প্রমাণ না থাকলেও। এটিই “assume breach” চিন্তার একটি শক্ত উদাহরণ।
সঠিক ক্রম ছিল এমন: প্রথমে সব জায়গায় আক্রান্ত version খোঁজা, শুধু web server নয়, VPN, load balancer আর appliance-ও। তারপর patch এবং সার্ভিস restart, কারণ পুরোনো library memory-তে থেকে যায়। এরপর নতুন private key দিয়ে certificate নেওয়া, পুরোনোটি revoke করা। তারপর session বাতিল, আর প্রয়োজনে ব্যবহারকারীদের password বদলাতে বলা। ক্রম উল্টে গেলে বিপদ: patch-এর আগে নতুন key বসালে সেটিও ফাঁস হতে পারে।
Forward secrecy থাকলে একটি ক্ষতি কমত: চুরি যাওয়া key দিয়ে পুরোনো রেকর্ড করা ট্রাফিক খোলা যেত না। অন্য ক্ষতি, যেমন memory-তে থাকা cookie, তাতে আটকাত না। আর ঘটনাটি আরেকটি জিনিস দেখিয়েছিল: বিশ্বের বিশাল অবকাঠামো অল্প কিছু মানুষের রক্ষণাবেক্ষণ করা একটি প্রকল্পের ওপর নির্ভর করছিল। এর পরে Linux Foundation-এর Core Infrastructure Initiative গড়ে ওঠে বলে জানা যায়, আর এমন প্রকল্পে অর্থায়নের আলোচনা বাড়ে।
মূল উপলব্ধি: দুর্বলতা বন্ধ করা আর ক্ষতি মেরামত করা আলাদা কাজ। Incident-এর পরিকল্পনায় “কী ফাঁস হয়ে থাকতে পারে” প্রশ্নটি রাখতে হবে, আর আগে থেকেই জানতে হবে কোথায় কোন library চলছে।
প্র ০৩Certificate-এর মেয়াদ ছোট করা কি সত্যিই নিরাপত্তা বাড়ায়, নাকি শুধু outage-এর ঝুঁকি বাড়ায়?
দুই পক্ষেরই যুক্তি আছে, তবে হিসাবটি দেখুন। Key চুরি হলে বা ভুল certificate জারি হলে মূল প্রতিকার revocation. কিন্তু CRL আর OCSP দীর্ঘদিন ধরেই সীমিত: ব্রাউজার নানা কারণে পুরোপুরি কঠোরভাবে এগুলো মানে না, কারণ যাচাই সার্ভার বন্ধ থাকলে সব সাইট আটকে দেওয়া বাস্তবসম্মত নয়। ফলে ৩৯৮ দিনের certificate-এর key চুরি হলে ঝুঁকির জানালা অনেক বড় থাকতে পারে। মেয়াদ ৪৭ দিন হলে সেই জানালা নিজে থেকেই ছোট।
দ্বিতীয় কারণ পরিচয়ের তথ্য। Domain-এর মালিকানা বদলাতে পারে। Domain যাচাই পুনর্ব্যবহারের সময় ২০২৯ সালের সূচিতে ১০ দিন, তাই পুরোনো যাচাইয়ের ওপর ভর করে থাকার সুযোগ কমে। তৃতীয় কারণ অভ্যাস: ঘন ঘন নবায়ন মানে automation সবসময় পরীক্ষিত থাকে। বছরে একবারের কাজ মানুষ ভুলে যায়; মাসে একবারের কাজ যন্ত্রকে দিতে বাধ্য হন। আর ভবিষ্যতে যদি সব certificate-এর algorithm বদলাতে হয়, যেমন post-quantum-এ, তখন দ্রুত বদলের ক্ষমতা কাজে লাগবে।
ঝুঁকির দিকটিও বাস্তব। অনেক প্রতিষ্ঠানে certificate শুধু web server-এ নয়, পুরোনো appliance, শিল্প-যন্ত্র আর ভেন্ডরের হাতে বসানো বাক্সেও থাকে, যেখানে ACME নেই। সেখানে হাতে কাজ বেড়ে যাবে। স্বয়ংক্রিয় ব্যবস্থার নিজের ব্যর্থতাও একসাথে বহু certificate-কে আঘাত করতে পারে। CA-র কোনো বিভ্রাট চললে অল্প মেয়াদের ব্যবস্থায় হাতে সময় কম থাকে; তাই দ্বিতীয় CA-র পরিকল্পনা আর আগেভাগে নবায়নের সময় রাখা ভালো।
এই পর্বের হিসাবে দেখেছেন, হাতে করলে কাজ প্রায় আট গুণ বাড়ে। মানে প্রশ্নটি “মেয়াদ ছোট ভালো কি না” নয়, “আপনার তালিকা আর automation প্রস্তুত কি না”.
মূল উপলব্ধি: ছোট মেয়াদ নিরাপত্তার খরচকে ঘটনার সময় থেকে সরিয়ে প্রতিদিনের প্রকৌশলে নিয়ে আসে। Automation থাকলে লাভ, না থাকলে বিভ্রাট।
প্র ০৪Equifax-এর ঘটনায় একটি মেয়াদোত্তীর্ণ certificate কেন এত গুরুত্বপূর্ণ হয়ে উঠল? নজরদারির ব্যবস্থা নিজেই বন্ধ থাকলে কীভাবে জানবেন?
Equifax-এর ২০১৭ সালের ফাঁস নিয়ে মার্কিন প্রতিনিধি পরিষদের একটি কমিটির কর্মীদের ২০১৮ সালের প্রতিবেদনে কয়েকটি ব্যর্থতার কথা আছে। মূল প্রবেশপথ ছিল patch না হওয়া একটি প্রকাশিত দুর্বলতা। কিন্তু দেরিতে ধরা পড়ার পেছনে প্রতিবেদন একটি বিশেষ কারণ দেখায়: ট্রাফিক পরীক্ষার একটি SSL inspection যন্ত্রের certificate প্রায় ১৯ মাস মেয়াদোত্তীর্ণ ছিল, তাই সেই ট্রাফিক পরীক্ষা হচ্ছিল না। নবায়নের পরই সন্দেহজনক কার্যকলাপ চোখে পড়ে বলে বলা হয়। প্রতিবেদনে শত শত মেয়াদোত্তীর্ণ certificate-এর কথাও আছে। Equifax প্রতিবেদনের কিছু দাবি নিয়ে আপত্তি জানিয়েছিল, তাই এটিকে একটি প্রকাশিত বিবরণ হিসেবেই পড়ুন।
শিক্ষাটি গভীর। সাধারণ certificate মেয়াদ শেষে চিৎকার করে: ব্রাউজারে লাল পাতা, ফোনে অভিযোগ। কিন্তু একটি নজরদারি যন্ত্র ব্যর্থ হলে নীরব থাকতে পারে। ট্রাফিক চলছে, ব্যবসা চলছে, শুধু একটি চোখ বন্ধ। এই ধরনের ব্যর্থতাকে বলা যায় নীরব ব্যর্থতা, আর এগুলো সবচেয়ে বিপজ্জনক, কারণ সমস্যা জানানোর দায়িত্ব যার, সে-ই সমস্যায়।
প্রতিরক্ষা কীভাবে? প্রথমত, নজরদারির ওপর নজরদারি: প্রতিটি sensor কতটুকু ডেটা দেখছে, সেই পরিমাণ মাপুন; হঠাৎ শূন্য বা কমে গেলে alert. দ্বিতীয়ত, জানা নমুনা দিয়ে নিয়মিত পরীক্ষা: একটি নিরীহ পরীক্ষামূলক ঘটনা তৈরি করে দেখুন alert আসে কি না। তৃতীয়ত, নিরাপত্তা যন্ত্রগুলোকেও একই certificate তালিকায় রাখুন, যেখানে মালিক আর মেয়াদ লেখা। চতুর্থত, একটি সূচকের ওপর নির্ভর না করে defense in depth: network-এ না দেখলে endpoint-এর log দেখবে। পর্ব ০৫-এর detection gap ধারণাটি এখানেও প্রযোজ্য।
মূল উপলব্ধি: “কোনো alert নেই” মানে “সব ঠিক আছে” নয়। হতে পারে শুধু দেখার চোখটি বন্ধ। নিরাপত্তা ব্যবস্থা কাজ করছে, এটিও মেপে প্রমাণ করতে হয়।
প্র ০৫“ভেতরের network তো নিরাপদ” — সার্ভিসে সার্ভিসে TLS চালানো কি বাড়াবাড়ি?
দীর্ঘদিন প্রচলিত নকশা ছিল দুর্গের মতো: বাইরে দেয়াল, ভেতরে সবাই বিশ্বস্ত। এই ধারণা বেশ কিছু কারণে ভেঙেছে। ২০১৩ সালের সংবাদে প্রকাশিত নথির ভিত্তিতে বলা হয়, গোয়েন্দা সংস্থা বড় ইন্টারনেট কোম্পানির data center-এর মধ্যের খোলা যোগাযোগে নজর দিয়েছিল। এই খবরের পরে বড় প্রতিষ্ঠানগুলো নিজেদের ভেতরের পথ এনক্রিপ্ট করার গতি বাড়ায় বলে জানা যায়। ভেতরের দেয়াল যে সত্যিই দেয়াল নয়, এটি তার একটি উদাহরণ।
দ্বিতীয় কারণ আক্রমণের ধরন। Ransomware আর APT-এর ঘটনাগুলোতে প্রায়ই দেখা যায়, একটি যন্ত্র দখলের পরে আক্রমণকারী ভেতরে ঘোরে। খোলা ট্রাফিক তখন পরিচয়পত্র আর ডেটার সহজ উৎস। Cloud-এ network আপনার নিজের হাতে তৈরিও নয়। তৃতীয়ত, নিয়ন্ত্রক মান ও গ্রাহকের চুক্তি অনেক সময় ভেতরের এনক্রিপশন চায়।
তবে খরচও বাস্তব। প্রতিটি সংযোগে certificate, প্রতিটি সার্ভিসে নবায়ন, ত্রুটি খোঁজা কঠিন, আর হাতে সামলালে outage-এর ঝুঁকি। একটি ছোট প্রতিষ্ঠান দুটি সার্ভিসের জন্য বিশাল service mesh বসালে নিরাপত্তার চেয়ে জটিলতাই বাড়তে পারে, আর জটিলতা নিজেই ঝুঁকি (economy of mechanism). CPU-এর খরচ আধুনিক হার্ডওয়্যারে সাধারণত বড় বাধা নয়, বড় বাধা হলো পরিচালনার ঝামেলা।
যুক্তিসঙ্গত পথ: ঝুঁকি অনুযায়ী এগোন। প্রথমে যেখানে password, token, আর্থিক বা ব্যক্তিগত ডেটা যায়, সেই পথ। Automation ছাড়া শুরু করবেন না। Zero trust মানে শুধু এনক্রিপশন নয়: প্রতিটি সংযোগে পরিচয় আর অনুমতি যাচাই, যা পর্ব ৭৪-এ দেখবেন।
মূল উপলব্ধি: নিরাপত্তার সীমা এখন network-এর দেয়াল নয়, পরিচয়। ভেতরের TLS বাড়াবাড়ি নয়, তবে automation ছাড়া তা নতুন ঝুঁকি। মাপ ঠিক করে দেয় আপনার threat model.
অনুশীলন
আগে নিজে করুন, তারপর উত্তর মিলিয়ে নিন। কমান্ড চালালে শুধু নিজের সিস্টেমে।
-
সংখ্যার হিসাব: একটি প্রতিষ্ঠানে ৩০০টি certificate. প্রতিটির মেয়াদ ১০০ দিন, মেয়াদের ২/৩ পার হলে নবায়ন, হাতে প্রতিবার ২০ মিনিট। (ক) কত দিন পরপর নবায়ন? (খ) বছরে মোট কতবার? (গ) মোট কত ঘণ্টা? (ঘ)
max-age=63072000কত দিন?(ক) ১০০ × ২/৩ ≈ ৬৬.৭ দিন। (খ) ৩৬৫ ÷ ৬৬.৭ ≈ ৫.৪৭৫ বার প্রতি certificate, ৫.৪৭৫ × ৩০০ ≈ ১,৬৪২.৫ বার। (গ) ১,৬৪২.৫ × ২০ ÷ ৬০ ≈ ৫৪৭.৫ ঘণ্টা, অর্থাৎ পূর্ণ সময়ের একজন মানুষের কয়েক মাসের কাজ। (ঘ) ৬৩০৭২০০০ ÷ ৮৬৪০০ = ৭৩০ দিন, মানে দুই বছর।
-
Configuration সমালোচনা: একটি সর্বজনীন সাইটের config এমন:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;,ssl_ciphers ALL;,ssl_certificate cert.pem(শুধু leaf), key ফাইল/var/www/html/-এ, HSTS নেই, port 80-তে পুরো সাইট চলছে। অন্তত পাঁচটি সমস্যা আর প্রতিকার লিখুন।- পুরোনো version: TLS 1.0 আর 1.1 বন্ধ, TLS 1.3 চালু।
ALLcipher: দুর্বল আর forward secrecy-হীন cipher-ও ঢুকে যায়। Intermediate তালিকা ব্যবহার করুন।- শুধু leaf: অনেক client chain বানাতে পারবে না।
fullchain.pemদিন। - Key web root-এ: এটি সবচেয়ে গুরুতর। ভুল করে ডাউনলোডযোগ্য হতে পারে। সরান, permission কড়া করুন, আর ফাঁস হয়ে থাকতে পারে ধরে নিয়ে key বদলে নতুন certificate নিন।
- HTTP সেবা: port 80-তে 301 redirect, আর ধাপে ধাপে HSTS.
-
ফল অনুমান করুন: nginx চলছে, disk-এ আর memory-তে একই certificate, মেয়াদ শেষ ২০ ডিসেম্বর। এই ক্রমে কাজ হলো: (১) নবায়ন সফল, disk-এর ফাইলে মেয়াদ ১৩ মার্চ; deploy hook নেই। (২) বাইরে থেকে
openssl s_client ... | openssl x509 -noout -enddate. (৩)nginx -tসফল, তারপরsystemctl reload nginx. (৪) আবার একই যাচাই। ধাপ ২ আর ধাপ ৪-এ কোন তারিখ দেখাবে?ধাপ ২-এ ২০ ডিসেম্বর, ধাপ ৪-এ ১৩ মার্চ। nginx চলার সময় ফাইল নিজে থেকে আবার পড়ে না; memory-তে পুরোনো certificate-ই থাকে। Reload-এর পরে নতুন worker নতুন ফাইল পড়ে।
nginx -tশুধু config পরীক্ষা করে, যা চলছে তা বদলায় না। ACME client-এ deploy hook বসালে এই ফাঁক বন্ধ হয়। -
Runbook লিখুন: নিজের একটি পরীক্ষার server-এ (বা কাগজে) একটি পাতার runbook লিখুন: “private key ফাঁস হয়েছে সন্দেহ হলে”. কে সিদ্ধান্ত নেবেন, কোন ক্রমে কী হবে, আর কীভাবে যাচাই হবে?
একটি ভালো runbook-এ থাকবে: (১) ঘটনার মালিক ঠিক করা আর সময়রেখা শুরু। (২) ফাঁসের উৎস বন্ধ, যেমন repo থেকে সরানো; ইতিহাসও বিবেচনা করা। (৩) নতুন key বানিয়ে নতুন certificate নেওয়া; পুরোনো key আবার ব্যবহার নয়। (৪) সব যন্ত্রে বসিয়ে reload, বাইরে থেকে serial আর মেয়াদ যাচাই। (৫) পুরোনোটি revoke. (৬) CT log আর অ্যাক্সেস log দেখা, অপ্রত্যাশিত certificate বা ব্যবহার আছে কি না। (৭) প্রয়োজনে session বাতিল। (৮) ঘটনার পরে কারণ আর শিক্ষা লেখা। ক্রমটি গুরুত্বপূর্ণ: নতুনটি বসার আগে পুরোনোটি revoke করলে নিজেই outage ঘটাতে পারেন।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমনবায়ন ব্যর্থতার সাড়ার ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- বাইরে থেকে যাচাই করে alert সত্য কি না দেখা
- Log দেখে ব্যর্থতার কারণ খোঁজা
- কারণ ঠিক করে নবায়ন চালানো
- Server reload করা
- বাইরে থেকে আবার মেয়াদ আর chain যাচাই
- Alert, মালিক আর প্রক্রিয়া ঠিক করা
কোন TLS বৈশিষ্ট্য নিশ্চিত করে যে server-এর দীর্ঘমেয়াদি private key পরে ফাঁস হলেও আগে রেকর্ড করা session খোলা যাবে না?
- HSTS
- Forward secrecy
- Certificate Transparency
- OCSP
একটি সাধারণ ওয়েবসাইটের জন্য নিচের কোন TLS configuration ভিত্তিটি সবচেয়ে উপযুক্ত?
- TLS 1.0 থেকে 1.3 সব চালু, যাতে সবাই সংযোগ করতে পারে
- TLS 1.2 চালু, শুধু RSA key exchange আর CBC cipher
- TLS 1.3 চালু, আর TLS 1.2-তে শুধু ECDHE ও AEAD cipher
- SSL 3.0 চালু রেখে তার ওপর HSTS
ACME দিয়ে certificate নবায়ন সফল হয়েছে আর disk-এর ফাইলও নতুন, কিন্তু client এখনো পুরোনো certificate পাচ্ছে। সবচেয়ে সম্ভাব্য কারণ কী?
- CA নতুন certificate দেয়নি
- HSTS পুরোনো certificate ধরে রেখেছে
- Forward secrecy চালু থাকায় পুরোনোটি যাচ্ছে
- Server reload হয়নি, তাই চলমান প্রক্রিয়া পুরোনো certificate ব্যবহার করছে
Edge proxy-তে TLS শেষ হয়, আর proxy থেকে app server পর্যন্ত খোলা HTTP যায়। এই নকশার প্রধান ঝুঁকি কী?
- ভেতরের network-এ নাগাল পাওয়া কেউ password বা token খোলা অবস্থায় দেখতে পারে
- ব্রাউজারে certificate সতর্কবার্তা দেখা যাবে
- TLS handshake সবসময় ব্যর্থ হবে
- SNI পাঠানো বন্ধ হয়ে যাবে
ভেতরের একটি API call-এ CERTIFICATE_VERIFY_FAILED এসেছে। সঠিক প্রতিক্রিয়া কোনটি?
verify=Falseদিয়ে ত্রুটি বন্ধ করা- সব জায়গায়
curl -kব্যবহার করা - Chain, CA আর নাম পরীক্ষা করে আসল কারণ ঠিক করা, প্রয়োজনে ভেতরের CA-কে client-এ যোগ করা
- API-কে HTTP-তে নামিয়ে আনা
Heartbleed আর POODLE-এর মূল পার্থক্য কোনটি?
- Heartbleed SSL 3.0-এর নকশার ত্রুটি, POODLE OpenSSL-এর কোডের ভুল
- Heartbleed বাস্তবায়নের ভুল, POODLE protocol-এর নকশাগত দুর্বলতা
- দুটিই একই ত্রুটি, শুধু নাম আলাদা
- দুটিই certificate-এর মেয়াদ শেষ হওয়ার কারণে ঘটে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- TLS-এর বেশিরভাগ বাস্তব ব্যর্থতা পরিচালনায়, গণিতে নয়।
- ভিত্তি: TLS 1.3, আর TLS 1.2 শুধু ECDHE + AEAD; পুরোনো সব বন্ধ। Forward secrecy পুরোনো রেকর্ড রক্ষা করে।
- মেয়াদ ছোট হচ্ছে, তাই তালিকা, automation, reload আর বাইরের monitoring একসাথে দরকার।
- TLS যেখানে শেষ, ডেটা সেখানে খোলা। Proxy-র পেছনের পথ, log আর key আলাদা করে রক্ষা করুন।
verify=Falseলক্ষণ লুকায়; কারণ ঠিক করুন, আর AI-এর পরামর্শ প্রাথমিক উৎসে যাচাই করুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ১৩ · Password নিরাপদে রাখা — salt, Argon2 আর bcryptপরবর্তী পর্বServer-এ পৌঁছানোর পরে password কীভাবে রক্ষা করবেন।
- সাইবার নিরাপত্তা · কোর্স হোম৮০টি পর্বপুরো কোর্সের রোডম্যাপ।
- TLS আর HTTPSগভীরে যানHandshake-এর বার্তা, key schedule, X.509 আর Web PKI-র খুঁটিনাটি।
- CDN, WAF আর edgeপাশের ট্র্যাকEdge-এ TLS আর সামনের সুরক্ষা স্তর বাস্তবে।
- Secrets আর KMSপাশের ট্র্যাকPrivate key আর secret নিরাপদে রাখা ও ঘোরানো।
- নিরাপত্তার নকশাপাশের ট্র্যাকবড় সিস্টেমের নকশায় নিরাপত্তা কীভাবে বসে।