সরাসরি পর্বে যান
পর্ব ১১ · ৮০-এর মধ্যে · মডিউল ২

Digital signature আর PKI — certificate, CA আর বিশ্বাসের শিকল

Digital Signatures & PKI — X.509 Certificates, CAs, Chain Validation, Revocation, Certificate Transparency & ACME

Taught in Bangla, this lesson explains hash-then-sign and what signatures prove, compares RSA-PSS, ECDSA and Ed25519, reads X.509 fields with openssl, covers CAs, intermediates, roots and trust stores, steps through chain validation with a hands-on toy validator, and explains revocation, the DigiNotar lesson, Certificate Transparency, ACME, private PKI and code signing.

এই পর্বে যা শিখবেন

  • Hash-then-sign কীভাবে কাজ করে, signature কী প্রমাণ করে আর কী করে না
  • RSA-PSS, ECDSA আর Ed25519-এর মোটা পার্থক্য, আর ECDSA-তে nonce-এর পুনরাবৃত্তি কেন বিপজ্জনক
  • X.509 certificate-এর ঘরগুলো পড়া, নিজের যন্ত্রে openssl x509 দিয়ে
  • Chain validation-এর প্রতিটি ধাপ, আর ব্যর্থ হলে কারণ খুঁজে বের করা
  • Revocation, Certificate Transparency, ACME, private PKI আর code signing কোথায় কী ভূমিকা রাখে

১ · সইয়ের সমস্যা — কাগজের সই থেকে গণিতের সই

পর্ব ১০-এ দেখেছেন, public key cryptography-তে দুটি চাবি থাকে: একটি সবার জন্য খোলা (public key), অন্যটি শুধু মালিকের (private key). এই পর্বে সেই জুটিকে আমরা একটি নতুন কাজে লাগাব: প্রমাণ করা যে একটি বার্তা সত্যিই নির্দিষ্ট কারও কাছ থেকে এসেছে, আর পথে বদলায়নি।

ধরুন আপনার অফিসে একটি চেক এল। চেকের সই দেখে ব্যাংক কী বোঝে? প্রথমত, মালিকই সই করেছেন। দ্বিতীয়ত, লেখা অংশ বদলায়নি, অন্তত ঘষামাজার দাগ নেই। কিন্তু কাগজের সইয়ের দুটি বড় দুর্বলতা আছে। সইটি প্রতিটি কাগজে একই রকম, তাই নকল করা যায়। আর সই কাগজের লেখার সাথে গাণিতিকভাবে বাঁধা নয়; একই সই কেটে অন্য কাগজে বসানো সম্ভব।

পোস্ট অফিসের সিলমোহরের কথা ভাবুন। সিল দেখলে বোঝা যায় চিঠিটি কোন ডাকঘর দিয়ে গেছে। এখন কল্পনা করুন এমন এক জাদুর সিল, যার ছাপ প্রতিটি চিঠির লেখা অনুযায়ী বদলে যায়। চিঠির একটি অক্ষর বদলালেই ছাপ আর মেলে না। সিলটি থাকে শুধু পোস্টমাস্টারের কাছে, কিন্তু ছাপ মেলানোর যন্ত্র সবার হাতে। Digital signature ঠিক এমন একটি সিল।

কিন্তু এখানেই একটি নতুন প্রশ্ন জন্ম নেয়, যা এই পর্বের দ্বিতীয় অর্ধেক। আপনি public key দিয়ে স্বাক্ষর যাচাই করলেন। কিন্তু সেই public key যে সত্যিই “আপনার ব্যাংকের”, তা জানলেন কীভাবে? মাঝখানে কেউ নিজের public key “ব্যাংকের” বলে ধরিয়ে দিলে সব গণিত ঠিক থাকবে, আর আপনি ঠকবেন। Key আর নামের এই জোড়া প্রমাণ করার পুরো ব্যবস্থার নাম PKI (Public Key Infrastructure).

Digital signature-এর ধারণা Diffie আর Hellman তুলে ধরেন ১৯৭৬ সালে। প্রথম ব্যবহারযোগ্য পদ্ধতি আসে RSA-র ১৯৭৮ সালের গবেষণাপত্রে। একই বছর MIT-তে Loren Kohnfelder তাঁর স্নাতক থিসিসে “certificate” ধারণাটি প্রস্তাব করেন: নাম আর public key-এর একটি স্বাক্ষরিত জোড়া। ১৯৮৮ সালে ITU-T X.509 মান প্রকাশ করে, আর ইন্টারনেটে এর ব্যবহারের নিয়ম আজ RFC 5280 (২০০৮)-এ লেখা।

২ · আগে hash, তারপর স্বাক্ষর — আর MAC-এর সাথে পার্থক্য

Public key-এর গণিত ধীর, আর একটি নির্দিষ্ট আকারের সংখ্যার ওপরই কাজ করে। তাই ১০ GB-এর ফাইলে সরাসরি স্বাক্ষর হয় না। আগে পুরো ফাইলের hash বের করা হয় (পর্ব ০৯), তারপর সেই ছোট, নির্দিষ্ট আকারের hash-এর ওপর স্বাক্ষর। এই রীতির নাম hash-then-sign. এর একটি গুরুত্বপূর্ণ ফল আছে: স্বাক্ষর ততটাই শক্ত, যতটা শক্ত hash-টি। Hash-এ collision বানানো গেলে একটি স্বাক্ষর দুটি আলাদা বার্তায় বসে যায়।

নিচের ধাপগুলোতে ছোট সংখ্যার একটি খেলনা উদাহরণ চলছে। সংখ্যাগুলো পরের কোড ব্লকের আসল আউটপুট থেকে নেওয়া।

  1. বার্তাpay 500যা সই হবে
  2. Hash3102ছোট আঙুলের ছাপ
  3. Sign2931private key
  4. Verify3102 = 3102public key
এই ধাপের মান
message
hash (want)
signature
from signature (got)
result
  1. বার্তা। একটি কাল্পনিক অনলাইন বাজারের হিসাব বিভাগ লিখল pay 500 to shop-17. বার্তাটি গোপন নয়; এখানে লক্ষ্য গোপনীয়তা নয়, প্রমাণ।
  2. Hash. স্বাক্ষরকারী বার্তার hash বের করলেন: 3102. বার্তা যত লম্বাই হোক, ফল একই ছোট পরিসরে থাকে।
  3. Sign. তিনি নিজের private key দিয়ে hash-এর ওপর গণনা করলেন, পেলেন 2931. Private key ছাড়া এই মান বানানোর সহজ পথ নেই।
  4. পাঠানো। বার্তা আর স্বাক্ষর একসাথে খোলা পথে গেল। পথে যে কেউ দুটোই দেখতে পারে। তাতে ক্ষতি নেই, কারণ দেখে নতুন স্বাক্ষর বানানো যায় না।
  5. Verify. গ্রহীতা বার্তার hash নিজেই বের করলেন (3102). তারপর public key দিয়ে স্বাক্ষর থেকে একটি মান বের করলেন (3102). দুটি মিলল, তাই VALID.
  6. বদলালে কী হয়। পথে কেউ টাকার অঙ্ক বদলে pay 900 করল। এখন বার্তার hash 3151, কিন্তু স্বাক্ষর থেকে আসছে 3102. মিলল না, তাই INVALID. বদলকারীর কাছে private key নেই, তাই নতুন স্বাক্ষর বানাতে পারছে না।

এবার নিজে চালিয়ে দেখুন। এটি খেলনা RSA: মাত্র ৩২৩৩ আকারের modulus আর একটি খেলনা hash. শুধু ধারণার জন্য; সত্যিকারের RSA-তে key হাজার হাজার বিটের, আর padding ছাড়া এভাবে স্বাক্ষর করা নিরাপদ নয়।

// Toy RSA (p=61, q=53). Real নয়, শুধু ধারণার জন্য।
const pub = { n: 3233n, e: 17n }, priv = { n: 3233n, d: 2753n };
function modpow(b, x, m) {
  let r = 1n; b %= m;
  for (; x > 0n; x >>= 1n) { if (x & 1n) r = r * b % m; b = b * b % m; }
  return r;
}
// Toy hash: any length in, a small number out. Never use for real.
function toyHash(text, n) {
  let h = 7n;
  for (const ch of text) h = (h * 131n + BigInt(ch.charCodeAt(0))) % n;
  return h;
}
const sign = (msg) => modpow(toyHash(msg, priv.n), priv.d, priv.n);
function verify(msg, sig) {
  const want = toyHash(msg, pub.n), got = modpow(sig, pub.e, pub.n);
  return { want, got, ok: want === got };
}
const msg = 'pay 500 to shop-17';
const sig = sign(msg);
console.log('message  :', msg);
console.log('hash     :', String(toyHash(msg, pub.n)));
console.log('signature:', String(sig), '(made with private d)');
const show = (label, v) =>
  console.log(label.padEnd(20), 'want', String(v.want).padStart(4),
              'got', String(v.got).padStart(4), v.ok ? 'VALID' : 'INVALID');
show('original', verify(msg, sig));
show('amount changed', verify('pay 900 to shop-17', sig));
show('signature changed', verify(msg, sig + 1n));

প্রথম সারি want 3102 got 3102 VALID. দ্বিতীয় সারিতে বার্তা বদলানোয় want 3151 got 3102 INVALID. তৃতীয় সারিতে বার্তা ঠিক, কিন্তু স্বাক্ষরে ১ যোগ করায় want 3102 got 2180 INVALID. অর্থাৎ বার্তা বা স্বাক্ষর, যেকোনো একটি বদলালেই যাচাই ব্যর্থ। খেয়াল করুন, verify ফাংশনে শুধু pub ব্যবহার হয়েছে। যাচাইকারীর কোনো গোপন জিনিস লাগেনি।

স্বাক্ষর কী প্রমাণ করে, আর কী করে না

একটি বৈধ স্বাক্ষর ঠিক তিনটি জিনিস বলে: বার্তা স্বাক্ষরের পর বদলায়নি (integrity), স্বাক্ষরটি ওই private key দিয়ে বানানো (authenticity), আর তৃতীয় কোনো পক্ষের কাছেও তা দেখানো যায় (non-repudiation-এর ভিত্তি)। কিন্তু স্বাক্ষর বলে না যে বার্তাটি সত্যি, স্বাক্ষরকারী সৎ, বা ভেতরের কোড নিরাপদ। সবচেয়ে বড় কথা, এটি প্রমাণ করে key ব্যবহার হয়েছে, মানুষটি নিজে করেছেন তা নয়। Key চুরি হলে চোরের স্বাক্ষরও গণিতের চোখে নিখুঁত। আর বার্তা গোপনও থাকে না; গোপনতার জন্য আলাদা encryption লাগে।

MAC আর signature — একই কাজ?

পর্ব ০৯-এ MAC দেখেছেন, যেমন HMAC. দুটোই বদল ধরে। পার্থক্য হলো কে বানাতে পারে।

বিষয়MAC (যেমন HMAC-SHA-256)Digital signature
Keyএকটিই গোপন key, দুই পক্ষের হাতেPrivate key দিয়ে সই, public key দিয়ে যাচাই
কে যাচাই করতে পারেশুধু key-ধারীরাPublic key পাওয়া যে কেউ
যিনি যাচাই করেন, তিনি কি জাল বানাতে পারেন?হ্যাঁ, একই key আছেনা
তৃতীয় পক্ষকে প্রমাণযায় না; যেকোনো পক্ষই বানাতে পারতযায়; তাই non-repudiation-এর ভিত্তি
গতিখুব দ্রুতঅনেক ধীর
সাধারণ ব্যবহারSession-এর ভেতরের ডেটা, webhook, APICertificate, software update, দলিল, TLS handshake
মূল ধারণা

গ্রহীতা নিজে ছাড়া আর কাউকে প্রমাণ করতে না হলে, আর দুই পক্ষ আগে থেকেই গোপন key ভাগ করে থাকলে MAC-ই যথেষ্ট, এবং দ্রুত। অনেক অচেনা মানুষকে যাচাই করতে দিতে হলে, বা তৃতীয় পক্ষের সামনে প্রমাণ দরকার হলে signature লাগে। TLS দুটোই ব্যবহার করে: handshake-এ signature, তারপর ডেটায় দ্রুত symmetric সুরক্ষা।

৩ · RSA-PSS, ECDSA আর Ed25519 — তিন পরিচিত স্বাক্ষর

গণিতের বিস্তার পর্ব ১০-এর বিষয়। এখানে একজন প্রকৌশলীর যা জানা দরকার, শুধু সেটুকু।

পদ্ধতিভিত্তিস্বাক্ষরের আকারলক্ষ করার মতো
RSA-PSSবড় সংখ্যার গুণনীয়কRSA-2048-এ ২৫৬ বাইটএলোমেলো padding, RFC 8017. পুরোনো PKCS#1 v1.5 padding এখনো অনেক certificate-এ চলে
ECDSA (P-256)Elliptic curveমূল মান ৬৪ বাইট; DER আকারে প্রায় ৭০–৭২প্রতিটি স্বাক্ষরে নতুন গোপন nonce লাগে; এখানেই ঝুঁকি
Ed25519Edwards curve৬৪ বাইটNonce বার্তা আর key থেকে নির্ধারিত, RFC 8032 (২০১৭); ভুলের সুযোগ কম

NIST-এর FIPS 186-5 (২০২৩) RSA, ECDSA আর EdDSA-কে স্বাক্ষরের মান হিসেবে রেখেছে। নতুন নকশায় কোনটি নেবেন, সেটি নির্ভর করে কে যাচাই করবে তার ওপর। Public web-এ RSA আর ECDSA সবচেয়ে সর্বজনীন; SSH key, software signing আর নিজের নিয়ন্ত্রিত ব্যবস্থায় Ed25519 জনপ্রিয়। কোয়ান্টাম-যুগের নতুন স্বাক্ষর (FIPS 204, FIPS 205; ২০২৪) নিয়ে আলোচনা হবে পর্ব ১৪-এ।

ECDSA-তে nonce-এর ইতিহাস — একটি সংখ্যার দাম

ECDSA-তে প্রতিটি স্বাক্ষরের জন্য একটি নতুন, গোপন, অননুমেয় সংখ্যা লাগে। এই একটি সংখ্যার নিয়ম ভাঙলে গণিত নিজেই গোপন তথ্য ফাঁস করে। দুটি ভিন্ন বার্তায় একই nonce পড়লে, বা nonce অনুমানযোগ্য হলে, প্রকাশ্য স্বাক্ষর থেকেই private key বেরিয়ে আসা সম্ভব। অর্থাৎ অ্যালগরিদম ঠিক, key-ও লম্বা, তবু দুর্বল random-এ সব শেষ।

এটি শুধু তত্ত্ব নয়। ২০১০ সালের শেষে গবেষকেরা প্রকাশ্যে জানান যে Sony PS3-র firmware স্বাক্ষরে nonce বদলানো হচ্ছিল না। ২০১৩ সালে Android-এর একটি random-সংক্রান্ত ত্রুটি কিছু Bitcoin wallet-এর স্বাক্ষরকে ঝুঁকিতে ফেলেছিল বলে প্রকাশিত হয়। দুই ঘটনাতেই গণিত ভাঙেনি, ভেঙেছে বাস্তবায়ন। প্রতিরোধ: নিজে স্বাক্ষরের কোড না লেখা, পরীক্ষিত library ব্যবহার, ডিটারমিনিস্টিক nonce (RFC 6979 বা Ed25519), আর key-কে HSM-এর ভেতরে রাখা।

আরও গভীরে: RSA-PSS-এর নিরাপত্তা-প্রমাণ দেন Bellare আর Rogaway (১৯৯৬)। TLS 1.3 (এখন RFC 9846) handshake-এর স্বাক্ষরে RSA ব্যবহার হলে PSS বাধ্যতামূলক, যদিও certificate-এর গায়ের স্বাক্ষরে পুরোনো padding থাকতে পারে। Hash আর স্বাক্ষরের শক্তি মেলানো হয়: SHA-256-এর collision-এর খরচ প্রায় 2128, যা P-256-এর প্রায় ১২৮-বিট নিরাপত্তার সমান। এজন্যই দুটি একসাথে দেখা যায়।

৪ · X.509 certificate — ডিজিটাল পরিচয়পত্র পড়া

শুরুর প্রশ্নটি এবার ফিরে আসে: public key-টি কার? উত্তর হলো certificate. জাতীয় পরিচয়পত্রের মতোই এতে নাম আছে, দাতার পরিচয় আছে, মেয়াদ আছে, আর একটি জিনিস আছে যা কার্ডে নেই: মালিকের public key. পুরোটার ওপর দাতার স্বাক্ষর। মানটির নাম X.509.

দারোয়ান আপনাকে চেনেন না, কিন্তু নির্বাচন কমিশনের পরিচয়পত্র চেনেন। তিনি আপনাকে নয়, দাতাকে বিশ্বাস করছেন। Certificate-এ CA (Certificate Authority) হলো সেই দাতা। আর ব্রাউজার হলো দারোয়ান, যিনি ছবি মেলান (নাম), মেয়াদ দেখেন, আর কার্ডটি আসল কি না যাচাই করেন (স্বাক্ষর)।

নিচের আউটপুট বানানো গল্প নয়। আমরা একটি আলাদা ল্যাব-ফোল্ডারে OpenSSL 3.5.5 দিয়ে lab.example.com নামে একটি self-signed certificate বানিয়ে পড়েছি। এই বানানো certificate-এ কোনো আসল সাইট জড়িত নয়। আউটপুট ছোট করা হয়েছে, আর private key-র কিছুই এতে নেই।

উদাহরণ — আসল রান, ছাঁটা (version-ভেদে বিন্যাস আলাদা হতে পারে): openssl x509 -in test.crt -noout -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            29:0c:63:7b:f4:a8:ff:22:52:9a:d7:48:3c:c9:c8:41:f4:eb:6f:a7
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: O=ABCL Lab Example, CN=lab.example.com
        Validity
            Not Before: Oct 31 13:23:10 2026 GMT
            Not After : Nov 30 13:23:10 2026 GMT
        Subject: O=ABCL Lab Example, CN=lab.example.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                ASN1 OID: prime256v1
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:lab.example.com, DNS:www.lab.example.com
            X509v3 Basic Constraints: critical
                CA:FALSE
            X509v3 Key Usage: critical
                Digital Signature
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
    Signature Algorithm: ecdsa-with-SHA256
    Signature Value:
        30:46:02:21:00:b6:ae:99:87:... (ছাঁটা)
ঘরঅর্থকী দেখবেন
Serial NumberCA-র দেওয়া অনন্য নম্বরRevocation-এ এই নম্বর দিয়েই চেনা হয়
Issuer / Subjectকে দিল / কাকে দিলদুটি এক হলে self-signed
ValidityNot Before থেকে Not Afterঘড়ি ভুল হলেও ত্রুটি আসে
Public Keyমালিকের খোলা চাবিঅ্যালগরিদম আর আকার
SANCertificate যে সব নামের জন্য বৈধHostname এখানেই মেলানো হয়; CN এখন পুরোনো রীতি
Basic ConstraintsCA কি না, আর নিচে কত স্তরLeaf-এ CA:FALSE হতে হবে
Key Usage / EKUKey কী কাজে লাগবেCA-তে certificate সইয়ের অনুমতি; সার্ভারে TLS Web Server Authentication
Signatureপুরো ওপরের অংশে Issuer-এর স্বাক্ষরএটি বদলানো যায় না, তাই ওপরের ঘরগুলোও না

নিজের যন্ত্রে হাতে-কলমে দেখতে ব্রাউজারের তালা-চিহ্ন থেকে certificate দেখে নিতে পারেন, অথবা নিচের কমান্ডগুলো চালাতে পারেন। এগুলো শুধু আপনার নিজের ফোল্ডারের ফাইল পড়ে; কোনো সার্ভারে যোগাযোগ করে না।

# উদাহরণ: নিজের ফোল্ডারে test certificate বানানো আর পড়া
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
  -nodes -keyout test.key -out test.crt -days 30 \
  -subj "/O=ABCL Lab Example/CN=lab.example.com" \
  -addext "subjectAltName=DNS:lab.example.com,DNS:www.lab.example.com"

openssl x509 -in test.crt -noout -subject -issuer -dates
openssl x509 -in test.crt -noout -ext subjectAltName
openssl x509 -in test.crt -noout -fingerprint -sha256
openssl x509 -in test.crt -noout -checkend 0
openssl x509 -in test.crt -noout -checkhost lab.example.com

শেষ দুটি কমান্ড আমাদের ল্যাবে দিয়েছে Certificate will not expire আর Hostname lab.example.com does match certificate. -checkend 0 মানে “এই মুহূর্তে মেয়াদ আছে কি”; সংখ্যাটি সেকেন্ডে, তাই ৩০ দিন আগে সতর্ক হতে 2592000 দিতে পারেন। test.key ফাইলটি এই পরীক্ষার পর মুছে ফেলুন, আর কোনো অবস্থায় কারও সাথে ভাগ করবেন না। -nodes মানে key-তে কোনো passphrase নেই, যা শুধু এমন ল্যাবের জন্য চলে।

Certificate-এর “fingerprint” বা আঙুলের ছাপ আসলে কী? এটি certificate-এর গায়ে লেখা কোনো ঘর নয়। এটি পুরো ফাইলের (DER আকার) hash, যা আপনি নিজেই বের করতে পারেন। নিচের Python কোড আসল hashlib দিয়ে তা করে, আর উপরের সেই test certificate-ই ব্যবহার করে। PEM ফাইলটি শুধু DER বাইটের Base64 রূপ।

# A public test certificate from our lab folder. It holds no private key.
import base64, hashlib

PEM = """-----BEGIN CERTIFICATE-----
MIICFTCCAbqgAwIBAgIUKQxje/So/yJSmtdIPMnIQfTrb6cwCgYIKoZIzj0EAwIw
NTEZMBcGA1UECgwQQUJDTCBMYWIgRXhhbXBsZTEYMBYGA1UEAwwPbGFiLmV4YW1w
bGUuY29tMB4XDTI2MTAzMTEzMjMxMFoXDTI2MTEzMDEzMjMxMFowNTEZMBcGA1UE
CgwQQUJDTCBMYWIgRXhhbXBsZTEYMBYGA1UEAwwPbGFiLmV4YW1wbGUuY29tMFkw
EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEvBcJrUiqX5xuV8iUmfhveAFJqPXkIRJU
riTrUrIW2agLKit0bHC9qGtp7akM8QKW0SoYylMvgjIjscz/chqxqqOBpzCBpDAd
BgNVHQ4EFgQUYjRAIQ88WjayLysyJsz37e+XX44wHwYDVR0jBBgwFoAUYjRAIQ88
WjayLysyJsz37e+XX44wLwYDVR0RBCgwJoIPbGFiLmV4YW1wbGUuY29tghN3d3cu
bGFiLmV4YW1wbGUuY29tMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMBMG
A1UdJQQMMAoGCCsGAQUFBwMBMAoGCCqGSM49BAMCA0kAMEYCIQC2rpmHT8O9OHiI
dRCTiUeJ4QiIITYVtOlVPO84Uj/MMwIhAIOPVMgiRR7I3n6xgnGH85DbcUX3IXHO
KC3jwLEQvRG+
-----END CERTIFICATE-----"""
der = base64.b64decode("".join(
    line for line in PEM.splitlines() if "CERTIFICATE" not in line))

def fingerprint(data):
    h = hashlib.sha256(data).hexdigest().upper()
    return ":".join(h[i:i + 2] for i in range(0, len(h), 2))

print("DER bytes    :", len(der))
print("SHA-256      :", fingerprint(der)[:47], "...")
changed = bytearray(der)
changed[100] ^= 1                    # flip one bit
print("after 1 bit  :", fingerprint(changed)[:47], "...")
a = hashlib.sha256(der).digest()
b = hashlib.sha256(changed).digest()
print("same bytes   :", sum(x == y for x, y in zip(a, b)), "of", len(a))

আউটপুটের DER bytes : 537 মানে পুরো certificate মাত্র ৫৩৭ বাইট। SHA-256 সারিটি শুরু হয় B2:49:16:85:DF:24:C4:C7:84:71:13:47:19:F3:32:25 দিয়ে, যা openssl x509 -fingerprint -sha256-এর দেওয়া মানের শুরুর সাথে হুবহু মেলে। একটি বিট বদলালে ছাপ শুরু হয় A9:CE:01:FA দিয়ে, আর same bytes : 0 of 32, অর্থাৎ ৩২ বাইটের একটিও মেলে না। আপনি ফোনে বা অন্য নিরাপদ পথে কারও সাথে fingerprint মিলিয়ে নিলে, মাঝখানের বদল ধরা পড়ে। তবে fingerprint কেবল চেনার উপায়; এটি দিয়ে certificate-এর শিকল যাচাই হয় না।

৫ · CA, intermediate, root আর trust store — বিশ্বাস আসে কোথা থেকে

আপনার সার্ভারের certificate-কে বলে leaf. এতে যে CA স্বাক্ষর করে, সে সাধারণত intermediate CA. তার certificate-এ স্বাক্ষর করে root CA. Root নিজের স্বাক্ষর নিজেই করে, তাই গণিত দিয়ে তাকে প্রমাণ করা যায় না। তাকে বিশ্বাস করতে হয় আগে থেকে, আর সেই তালিকাটিই trust store: OS বা ব্রাউজারের সাথে আসা বিশ্বস্ত root-এর তালিকা। Certificate থেকে root পর্যন্ত এই সংযোগই chain of trust.

বিশ্বাসের শিকল

Chain of trust: signing goes down, checking goes up

Root, intermediate আর leaf certificate-এর শিকল আপনার যন্ত্রের trust store Root CA নিজের স্বাক্ষর নিজেই key offline, মেয়াদ দীর্ঘ Intermediate CA CA:TRUE, online-এ সই বিপদে শুধু এটি বাতিল Leaf certificate shop.example.com CA:FALSE, মেয়াদ ছোট স্বাক্ষর করে স্বাক্ষর করে যাচাই চলে নিচ থেকে ওপরে সার্ভার পাঠায়: leaf + intermediate Root আপনার কাছেই আছে
ছবি ১১.১ — স্বাক্ষর নামে ওপর থেকে নিচে, যাচাই ওঠে নিচ থেকে ওপরে।

Root key-কে সরাসরি কাজে লাগানো হয় না কেন? কারণ root key ফাঁস হলে তার ওপর দাঁড়ানো সব certificate অকেজো, আর সব যন্ত্র থেকে root সরাতে বছর লেগে যেতে পারে। তাই root key-কে সাধারণত offline HSM-এ রাখা হয়, মাঝেমধ্যে শুধু intermediate সই করতে বের করা হয়। Intermediate ফাঁস হলে তাকে বাতিল করে নতুন একটি নিলেই হয়। এটি পর্ব ০৩-এর blast radius ছোট রাখার নীতিরই বাস্তব রূপ।

Trust store-এ কারা ঢুকবে, সেটি ঠিক করে root program: Microsoft, Apple, Mozilla, Google আর Linux distribution-গুলোর তালিকা। CA-দের নিয়মিত audit দিতে হয় আর CA/Browser Forum-এর Baseline Requirements মানতে হয়। এই ব্যবস্থার গঠনগত দুর্বলতা হলো, সাধারণভাবে trust store-এর যেকোনো CA যেকোনো domain-এর certificate দিতে পারে। সেজন্য একটি CA ভুল করলে পুরো ওয়েবের ঝুঁকি। এই কথায় আমরা ৮ নম্বর অংশে ফিরব।

৬ · Chain validation — ধাপে ধাপে যাচাই

সার্ভার certificate দিলে আপনার ব্রাউজার কী করে? এই পদ্ধতির নাম path validation, যার আনুষ্ঠানিক নিয়ম RFC 5280-এর ৬ নম্বর অংশে। প্রতিটি library-র ক্রম আলাদা হতে পারে, RFC-র বর্ণনাও root থেকে নিচের দিকে চলে; কিন্তু শর্তগুলো একই, আর একটি ব্যর্থ হলেই পুরো শিকল ব্যর্থ। কল্পিত দিন ১৫০-এ, shop.example.com-এর শিকল ধরে দেখুন।

Leafshop.example.com
IntermediateToy CA
RootToy Root
যাচাইয়ের খাতা
শিকল বানানো
স্বাক্ষর
মেয়াদ
CA flag
Key usage
নাম (SAN)
Trust store
Revocation, CT
  1. শিকল বানানো। সার্ভার পাঠাল leaf আর intermediate. ব্রাউজার প্রতিটি certificate-এর Issuer দেখে পরেরটির Subject খোঁজে। শেষে মেলে trust store-এর Toy Root. Intermediate না পাঠালে এখানেই সমস্যা হতে পারে।
  2. স্বাক্ষর। Toy CA-র public key দিয়ে leaf-এর স্বাক্ষর যাচাই হলো, Toy Root-এর public key দিয়ে Toy CA-র। কোনো ঘর এক অক্ষর বদলালেই এখানে ধরা পড়ে।
  3. মেয়াদ। শিকলের প্রতিটি certificate দেখা হয়। Leaf দিন ১০০ থেকে ২০০, intermediate ৫০ থেকে ৫০০। আজ দিন ১৫০, তাই সব পাস। এজন্যই ভুল ঘড়ির যন্ত্রে সব সাইট ভাঙা দেখায়।
  4. CA flag. Intermediate-এ CA:TRUE থাকতে হবে, আর leaf-এ CA:FALSE. না হলে যেকোনো সাধারণ সাইটের মালিক নিজেই CA সেজে বসতেন। pathlen থাকলে নিচের স্তরের সংখ্যাও মেলানো হয়।
  5. Key usage. CA-র key-তে certificate সইয়ের অনুমতি আছে। Leaf-এ আছে TLS Web Server Authentication. Code signing-এর certificate দিয়ে ওয়েব সার্ভার চালানো যাবে না।
  6. নাম। আপনি যে নামে ঢুকেছেন, সেটি SAN-এ থাকতে হবে। Wildcard *.example.com শুধু এক স্তর ধরে: www.example.com মেলে, a.b.example.com মেলে না। Certificate বৈধ কিন্তু নাম ভিন্ন, এটিও ব্যর্থতা।
  7. Trust store. শিকলের শেষ মাথা Toy Root আগে থেকেই store-এ আছে। সব গণিত ঠিক থাকলেও root অচেনা হলে কোনো লাভ নেই।
  8. Revocation আর CT. ক্লায়েন্ট-নির্ভর শেষ ধাপ: certificate বাতিল হয়েছে কি না, আর CT-র প্রমাণ আছে কি না। এখানে আচরণ ব্রাউজার আর library ভেদে আলাদা। সব শর্ত মিটলে সংযোগ এগোয়।

এবার একই ধারণা কোডে। ছয়টি কল্পিত শিকল, প্রতিটি certificate-এ সত্যিকারের ধাঁচে (খেলনা RSA দিয়ে) স্বাক্ষর আছে। ব্যর্থ হলে কারণও ছাপা হয়। তারিখ কল্পিত, ক্রম leaf থেকে ওপরে।

// Toy chain validator on made-up certificates. Real নয়, শুধু ধারণার জন্য।
const pow = (b, x, m) => { let r = 1n; b %= m;
  for (; x > 0n; x >>= 1n) { if (x & 1n) r = r * b % m; b = b * b % m; } return r; };
const hash = (s, n) => { let h = 7n;
  for (const c of s) h = (h * 131n + BigInt(c.charCodeAt(0))) % n; return h; };
const H = 'shop.example.com', NOW = 150, STORE = ['Toy Root'];  // simulated day 150
const KEYS = { 'Toy Root': [3233n, 17n, 2753n], 'Toy CA': [2773n, 17n, 157n],
               'Rogue CA': [3127n, 3n, 2011n], [H]: [2537n, 5n, 1949n] };  // n, e, d
const tbs = c => [c.sub, c.iss, c.from, c.to, c.ca, c.san].join('/');
function mk(sub, iss, ca, san = '', from = 100, to = 200) {
  const c = { sub, iss, ca, san, from, to }, [n, , d] = KEYS[iss];
  c.sig = pow(hash(tbs(c), n), d, n);
  return c;
}
function validate(chain, host) {          // chain[0] = leaf, last = root
  if (!chain[0].san.split(',').includes(host)) return 'FAIL name not in SAN';
  for (const [i, c] of chain.entries()) {
    const [n, e] = KEYS[c.iss], next = chain[i + 1];
    if (next ? next.sub !== c.iss : c.iss !== c.sub) return `FAIL ${c.sub}: issuer link`;
    if (pow(c.sig, e, n) !== hash(tbs(c), n)) return `FAIL ${c.sub}: bad signature`;
    if (NOW < c.from || NOW > c.to) return `FAIL ${c.sub}: outside validity`;
    if (i > 0 && !c.ca) return `FAIL ${c.sub}: not a CA`;
  }
  return STORE.includes(chain.at(-1).sub) ? 'OK' : 'FAIL root not in trust store';
}
const root = mk('Toy Root', 'Toy Root', true, '', 0, 900);
const ca = mk('Toy CA', 'Toy Root', true, '', 50, 500), leaf = mk(H, 'Toy CA', false, H);
const P = 'pay.example.com', X = 'x.example.com';
for (const [name, chain, host] of [['good chain', [leaf, ca, root], H],
  ['wrong host', [leaf, ca, root], P],
  ['expired leaf', [mk(H, 'Toy CA', false, H, 100, 140), ca, root], H],
  ['edited SAN', [{ ...leaf, san: H + ',' + P }, ca, root], P],
  ['leaf acts as CA', [mk(X, H, false, X), leaf, ca, root], X],
  ['rogue root', [mk(H, 'Rogue CA', false, H), mk('Rogue CA', 'Rogue CA', true, '', 0, 900)], H],
]) console.log(name.padEnd(16), validate(chain, host));

প্রথম সারি good chain OK. বাকি পাঁচটি পাঁচ ভিন্ন কারণে আটকায়। wrong host পায় FAIL name not in SAN. expired leaf পায় outside validity. edited SAN সবচেয়ে শিক্ষণীয়: কেউ leaf-এ নতুন নাম ঢুকিয়েছে, তাই নামের যাচাই পার হয়েছে, কিন্তু FAIL shop.example.com: bad signature. স্বাক্ষরই ঘরগুলোকে রক্ষা করে। leaf acts as CA-তে সাধারণ সাইট অন্যের certificate সই করতে চেয়েছে: FAIL shop.example.com: not a CA. rogue root-এ সব গণিত নিখুঁত, তবু FAIL root not in trust store. গণিত বলে স্বাক্ষর ঠিক, কিন্তু কাকে বিশ্বাস করব তা গণিত বলে না।

বাস্তবে ত্রুটি এলে কারণ পড়ুন, যাচাই বন্ধ করবেন না। মেয়াদ, নাম, intermediate না পাঠানো আর ভুল ঘড়ি, এই চারটি কারণই সবচেয়ে সাধারণ। verify=False বা curl -k ত্রুটিটি সারায় না; সেটি শুধু দারোয়ানকে ছুটিতে পাঠায়, আর তখন MITM ধরার উপায় থাকে না।

৭ · Revocation আর মেয়াদ — বাতিল করা এত কঠিন কেন

Private key ফাঁস হলে মেয়াদের আগেই certificate বাতিল (revocation) করতে হয়। সমস্যা হলো, certificate ইতিমধ্যে সবার হাতে হাতে ঘুরছে। হারানো পরিচয়পত্রের মতো: কার্ডটি তো আর ফেরত আনা যায় না, তাই একটি তালিকা রাখতে হয়, আর দারোয়ানকে সেই তালিকা দেখতে হয়।

পদ্ধতিকীভাবেসুবিধাসীমা
CRLCA-র স্বাক্ষর করা বাতিল serial-এর তালিকা, ক্লায়েন্ট নামায়সহজ, CA-কে আলাদা করে জিজ্ঞেস করতে হয় নাফাইল বড় হতে পারে; আপডেটের ফাঁকে তথ্য পুরোনো
OCSP (RFC 6960)ক্লায়েন্ট CA-র responder-কে এক certificate-এর অবস্থা জিজ্ঞেস করেছোট উত্তর, তুলনায় টাটকাগতি কমে; CA জানতে পারে আপনি কোন সাইটে গেলেন; responder বন্ধ হলে অনেক ক্লায়েন্ট এগিয়ে যায়
OCSP staplingসার্ভার নিজেই CA-র স্বাক্ষর করা টাটকা উত্তর handshake-এ জুড়ে দেয়দ্রুত, ব্যবহারকারীর গোপনতা রক্ষাসার্ভারের সহযোগিতা লাগে; না পাঠালে সাধারণত ক্লায়েন্ট বুঝতেই পারে না কেন নেই
Short-lived certificateমেয়াদই এত ছোট যে বাতিলের দরকার কমে যায়কোনো অতিরিক্ত যাচাই নেইপুরো ব্যবস্থা নির্ভর করে স্বয়ংক্রিয় নবায়নের ওপর

OCSP-র বড় দুর্বলতা হলো soft-fail: উত্তর না পেলে ক্লায়েন্ট সংযোগ চালিয়ে যায়, কারণ responder-এর একটি বিভ্রাটে অর্ধেক ওয়েব বন্ধ হওয়া কেউ চায় না। কিন্তু যে আক্রমণকারী আপনার পথে বসে আছে, সে উত্তরটিই আটকে দিতে পারে। তাই সুরক্ষাটি ঠিক তখনই কাজ করে না, যখন দরকার। পর্ব ০৩-এর fail open আর fail secure-এর দ্বন্দ্ব এখানে সরাসরি দেখা যায়।

গতিপথ এখন স্পষ্ট। Let's Encrypt গোপনতার কারণ দেখিয়ে ২০২৫ সালের ৬ আগস্ট তাদের OCSP responder বন্ধ করেছে, আর CRL-এ চলে গেছে। ব্রাউজারগুলোও নিজেদের সংকুচিত তালিকা বানায় (Chrome-এর CRLSets, Firefox-এর CRLite). আর CA/Browser Forum-এর SC-081v3 ব্যালট (এপ্রিল ২০২৫) সর্বোচ্চ মেয়াদ ধাপে ধাপে কমাচ্ছে: ৩৯৮ দিন থেকে ২০০ দিন (১৫ মার্চ ২০২৬), ১০০ দিন (১৫ মার্চ ২০২৭) আর ৪৭ দিন (১৫ মার্চ ২০২৯)। এই নিয়ম public TLS certificate-এর জন্য; private PKI-তে নিজের নীতি চলে।

মেয়াদ ছোট হলে ঝুঁকির জানালা ছোট, কিন্তু কাজ বেশি। হিসাবটি নিজে দেখুন। একটি কল্পিত তারিখে (১৫ নভেম্বর ২০২৬) চারটি certificate পরীক্ষা করা হলো, আর ২০০টি certificate-এর একটি কল্পিত প্রতিষ্ঠানের বছরের কাজ গোনা হলো।

// Validity window on a fixed simulated date (no real clock).
const DAY = 86400000;
const d = s => Date.UTC(+s.slice(0, 4), +s.slice(5, 7) - 1, +s.slice(8, 10));
const TODAY = d('2026-11-15');
const certs = [
  ['shop.example.com', '2026-09-01', '2026-11-30'],
  ['api.example.com',  '2026-10-20', '2027-01-18'],
  ['old.example.com',  '2026-05-01', '2026-11-10'],
  ['new.example.com',  '2026-11-20', '2027-02-18'],
];
function status(from, to) {
  const f = d(from), t = d(to), life = (t - f) / DAY, left = (t - TODAY) / DAY;
  if (TODAY < f) return `NOT YET VALID (starts in ${(f - TODAY) / DAY} days)`;
  if (TODAY > t) return `EXPIRED ${-left} days ago`;
  // Common habit: renew when one third of the lifetime remains.
  return left <= life / 3 ? `RENEW NOW (${left} of ${life} days left)`
                          : `OK (${left} of ${life} days left)`;
}
for (const [name, from, to] of certs)
  console.log(name.padEnd(17), status(from, to));
console.log('--- renewals per year if renewed at 2/3 of life ---');
for (const days of [398, 200, 100, 47]) {
  const every = Math.floor(days * 2 / 3), n = Math.ceil(365 / every);
  console.log(String(days).padStart(3), 'day cert: renew every', every, 'days =', n,
              'renewals/yr; 200 certs =', n * 200, 'jobs/yr');
}

প্রথম চার সারিতে চার অবস্থা: RENEW NOW (15 of 90 days left), OK (64 of 90 days left), EXPIRED 5 days ago আর NOT YET VALID (starts in 5 days). শেষটিও ত্রুটি, যা ঘড়ি ভুল হলে বা ভুল সময়ে deploy করলে দেখা যায়। পরের অংশে 398 day cert: renew every 265 days = 2 renewals/yr; 200 certs = 400 jobs/yr, আর 47 day cert: renew every 31 days = 12 renewals/yr; 200 certs = 2400 jobs/yr. অর্থাৎ কাজ ছয় গুণ (২৪০০ ÷ ৪০০ = ৬)। ২০০টি certificate-এ বছরে ২৪০০ বার হাতে নবায়ন বাস্তবসম্মত নয়, তাই স্বয়ংক্রিয়তা এখন বিলাসিতা নয়, প্রয়োজন। “২/৩ মেয়াদে নবায়ন” একটি প্রচলিত অভ্যাস, কোনো মান নয়।

৮ · CA ভুল করলে কী হয় — DigiNotar আর Certificate Transparency

শিকল যত শক্তই হোক, প্রতিটি CA-ই একটি একক ব্যর্থতার বিন্দু। ২০১১ সালের ঘটনাটি এই সত্যকে সবার সামনে আনে।

DigiNotar, ২০১১। নেদারল্যান্ডসের CA DigiNotar-এর সিস্টেমে অনুপ্রবেশ ঘটে। Fox-IT-র প্রকাশিত তদন্ত অনুযায়ী অন্তত ৫৩১টি জাল certificate তৈরি হয়েছিল, যার মধ্যে *.google.com-ও ছিল। প্রকাশিত প্রতিবেদনে এই জাল certificate-এর ব্যবহার প্রধানত ইরানের ব্যবহারকারীদের সাথে যুক্ত করা হয়। Chrome-এর ভেতরে থাকা Google-এর key pinning একটি অমিল ধরে ফেলে, আর একজন ব্যবহারকারীর রিপোর্টে ঘটনা সামনে আসে। তদন্তে দুর্বল network বিভাজন, পুরোনো software আর দুর্বল log ব্যবস্থার কথা উঠে আসে। ব্রাউজার আর OS নির্মাতারা DigiNotar-এর root সরিয়ে নেয়, ডাচ সরকারের কিছু সেবাও ব্যাহত হয়, আর একই বছরের সেপ্টেম্বরে প্রতিষ্ঠানটি দেউলিয়া হয়।

রক্ষকের চোখে শিক্ষাটি পরিষ্কার। প্রতিষ্ঠানটি জানত না ঠিক কী কী তৈরি হয়েছে, আর domain-এর মালিকেরও জানার কোনো উপায় ছিল না। জাল certificate আসল certificate-এর মতোই বৈধ দেখায়, তাই সমস্যার মূল ছিল দৃশ্যমানতার অভাব।

Certificate Transparency — প্রকাশ্য রেজিস্টার খাতা

ভূমি অফিসের দলিল রেজিস্ট্রির কথা ভাবুন। একবার খতিয়ানে উঠলে সবাই দেখতে পারেন, পরে গোপনে মোছা যায় না। আপনার জমির নামে অন্য কেউ দলিল করলে আপনি খাতা দেখেই ধরতে পারেন। Certificate Transparency (CT) একই কাজ করে certificate-এর জন্য।

CT জাল certificate তৈরি আটকায় না; সেটি লুকিয়ে রাখা কঠিন করে। কর্মপদ্ধতি তিন ভাগে। CA প্রকাশের আগে certificate-টি কয়েকটি স্বাধীন, শুধু-যোগ-করা (append-only) log-এ জমা দেয়। Log তার রসিদ হিসেবে দেয় SCT (Signed Certificate Timestamp), যা certificate-এর ভেতরে থাকে। ব্রাউজার SCT ছাড়া public certificate গ্রহণ করে না (Chrome ২০১৮ সাল থেকে নতুন certificate-এর জন্য এই শর্ত চালু করেছে; Apple-এরও নিজস্ব নীতি আছে)। আর log-গুলো Merkle tree-র গঠনে থাকে, যাতে পরে গোপনে কিছু মুছলে গণিতে ধরা পড়ে।

আসল কাজটি আপনার: নিজের domain-এর জন্য CT নজরদারি (CT monitoring) চালু রাখা। অচেনা CA বা অচেনা নামে certificate দেখলেই তদন্ত করতে হয়। পাশাপাশি CAA record দিয়ে DNS-এ জানিয়ে দেওয়া যায় কোন CA আপনার domain-এর জন্য certificate দিতে পারবে; CA-দের issuance-এর আগে এটি দেখা বাধ্যতামূলক। CT log-এ নাম প্রকাশ্য হয়, তাই ভেতরের গোপন hostname public certificate-এ রাখা ঠিক নয়।

আরও গভীরে: CT-র মূল বিবরণ RFC 6962 (২০১৩, Experimental), আর তার উত্তরসূরি RFC 9162 (২০২১, CT v2, এটিও Experimental), যা RFC 6962-কে obsolete করে; তবে ওয়েবে v1 এখনো বেশি প্রচলিত। DigiNotar ছাড়াও Symantec-এর ক্ষেত্রে দেখা যায় ব্রাউজারগুলো ধাপে ধাপে অবিশ্বাস করে (২০১৭–২০১৮), কারণ সেখানে হঠাৎ root সরালে বিপুল সংখ্যক সাইট ভাঙত। ভুল issuance ধরা পড়ার পেছনেও CT-র বড় ভূমিকা ছিল।

৯ · Certificate-এর জীবন — ACME, private PKI, code signing আর বাংলাদেশ

CA কী যাচাই করে: DV, OV, EV

ধরনকী প্রমাণ হয়যা মনে রাখবেন
DVআবেদনকারী domain নিয়ন্ত্রণ করেনসম্পূর্ণ স্বয়ংক্রিয় হতে পারে; ওয়েবের বেশিরভাগ certificate
OVDV + প্রতিষ্ঠানের অস্তিত্ব যাচাইCertificate-এ প্রতিষ্ঠানের নাম থাকে
EVআরও কড়া আইনি যাচাইব্রাউজার ২০১৯-এর দিকে বিশেষ সবুজ চিহ্ন সরিয়ে নিয়েছে; গবেষণায় মানুষের আচরণে সেটির কম প্রভাব দেখা গিয়েছিল

তালা-চিহ্ন বা HTTPS মানে শুধু “সংযোগটি এনক্রিপ্টেড আর এই নামের সাথেই কথা হচ্ছে”। এর অর্থ এই নয় যে সাইটটি সৎ। Phishing সাইটও বৈধ DV certificate পেতে পারে (পর্ব ৫৩)।

ACME আর Let's Encrypt

ACME (RFC 8555, ২০১৯) হলো certificate নেওয়া আর নবায়নের একটি স্বয়ংক্রিয় protocol. উদাহরণ হিসেবে অলাভজনক CA Let's Encrypt এটি ব্যবহার করে; অন্য CA-ও করে। Client প্রমাণ করে যে domain তার নিয়ন্ত্রণে: HTTP-01-এ নির্দিষ্ট URL-এ একটি token রেখে, DNS-01-এ DNS-এ একটি TXT record রেখে। তারপর কাগজে হাত না দিয়েই certificate মেলে। Let's Encrypt-এর সাধারণ মেয়াদ দীর্ঘদিন ধরে ৯০ দিন; তাদের প্রকাশিত পরিকল্পনায় ২০২৮-এর মধ্যে ৪৫ দিনে নামার কথা আছে, আর ঐচ্ছিক ৬ দিনের profile-ও আছে। নিচের ধাপগুলো ৯০ দিনের একটি certificate-এর গল্প।

  1. Keyসার্ভারে
  2. CSRআবেদন
  3. যাচাইdomain
  4. IssueCT log
  5. Deployসার্ভার
  6. Renewদিন ৬০
certificate-এর অবস্থা
কল্পিত দিন
এখন চলছে
বাকি দিন
private key
  1. Key তৈরি। সার্ভার নিজের যন্ত্রেই key জোড়া বানায়। Private key কখনো CA-র কাছে যায় না, ইমেইলে বা chat-এও না।
  2. CSR. Public key আর চাওয়া নামগুলো দিয়ে CSR (Certificate Signing Request) তৈরি হয়। সার্ভার তাতে নিজের private key দিয়ে সই করে, যা প্রমাণ করে key তার কাছেই আছে।
  3. Domain যাচাই। CA একটি challenge দেয়। ACME client HTTP-01 বা DNS-01 দিয়ে উত্তর রাখে, আর CA নিজে তা দেখে নেয়। CA-কে CAA record-ও দেখতে হয়।
  4. Issue. CA certificate-টি CT log-এ জমা দিয়ে SCT নেয়, তারপর স্বাক্ষর করে দেয়। বাকি মেয়াদ ৯০ দিন।
  5. Deploy. সার্ভারে leaf আর intermediate দুটোই বসানো হলো (fullchain), সার্ভার reload হলো। শুধু ফাইল বসালে হয় না, চলমান সার্ভার প্রোগ্রামকে নতুন ফাইল পড়াতে হয়; এই ভুলটি প্রায়ই বিভ্রাট ঘটায়।
  6. নজরদারি। দিন ৪৫-এ ৪৫ দিন বাকি। Monitoring সার্ভার থেকে পাওয়া certificate-এর মেয়াদ দেখছে, শুধু ফাইল নয়। CT monitor অচেনা issuance-ও দেখছে।
  7. নবায়নের সময়। দিন ৬০-এ, অর্থাৎ ২/৩ মেয়াদে, ACME client নিজে থেকেই চালু হলো। হাতে এখনো ৩০ দিন, তাই ব্যর্থ হলেও ঠিক করার সময় আছে।
  8. সনদ-২ বসানো। সম্ভব হলে নতুন key দিয়ে নতুন certificate, আবার ৯০ দিন। Reload হলো, আর যাচাই হলো যে সার্ভার সত্যিই নতুনটি দেখাচ্ছে।
  9. পুরোনো key-র বিদায়। সনদ-১ আর ব্যবহার হচ্ছে না; পুরোনো key মুছে ফেলা হলো। কিন্তু কোনো দিন key ফাঁস হলে এই পথে নয়: তৎক্ষণাৎ revoke, নতুন key, নতুন certificate, আর ঘটনার তদন্ত (পর্ব ৬১)। Key ফাঁসের পরে শুধু নবায়ন করা যথেষ্ট নয়।

Private PKI — প্রতিষ্ঠানের নিজস্ব CA

অভ্যন্তরীণ সার্ভিস, VPN, Wi-Fi আর যন্ত্রের পরিচয়ে অনেক প্রতিষ্ঠান নিজস্ব CA চালায়, যাকে বলে private PKI. এতে mTLS দিয়ে সার্ভিসগুলো একে অপরকে চিনতে পারে, আর ভেতরের নাম CT log-এ যায় না। কিন্তু public CA-র যে পাহারা (audit, CT, ব্রাউজারের নজর) ছিল, এখানে তার সবই আপনার দায়িত্ব। Root offline রাখা, আলাদা intermediate, ছোট মেয়াদ, স্বয়ংক্রিয় নবায়ন, issuance-এর log (পর্ব ৫৫), আর revocation-এর পরিকল্পনা লাগবে। আর একটি সতর্কতা: কোনো যন্ত্রের trust store-এ আপনার root বসানো মানে সেই root সেই যন্ত্রে যেকোনো নামের বিশ্বাস পায়। তাই name constraints বিবেচনা করুন, আর শুধু প্রতিষ্ঠানের নিজের যন্ত্রেই বসান। Key রাখার দিকটি দেখতে পারেন Cloud & DevOps-এর secrets আর KMS পর্বে।

Code signing — একটি নোট

Code signing-এ একই ধারণা software-এর ওপর: প্রকাশক স্বাক্ষর করেন, OS বা package manager যাচাই করে। এখানে timestamp গুরুত্বপূর্ণ: certificate মেয়াদোত্তীর্ণ হলেও স্বাক্ষরের সময়ের প্রমাণ থাকলে পুরোনো software বৈধ থাকতে পারে। স্বাক্ষর মানে কিন্তু “কে প্রকাশ করেছে”, “নিরাপদ কোড” নয়। চুরি হওয়া key দিয়ে malware স্বাক্ষরের ঘটনা প্রকাশিত হয়েছে, যেমন ২০১০ সালের Stuxnet-এ। তাই signing key HSM-এ রাখা, আর build pipeline সুরক্ষিত রাখাই আসল কাজ (পর্ব ৪৮)।

বাংলাদেশের প্রেক্ষাপট

বাংলাদেশে ডিজিটাল স্বাক্ষরের লাইসেন্সপ্রাপ্ত CA-দের তত্ত্বাবধান করে Controller of Certifying Authorities (CCA), সরকারি সাইট cca.gov.bd. সাইটটিতে নিজস্ব root CA certificate, লাইসেন্সপ্রাপ্ত CA-র তালিকা আর audit নির্দেশিকা পাওয়া যায়, আর আইনি ভিত্তি হিসেবে তথ্য ও যোগাযোগ প্রযুক্তি আইন, ২০০৬ (২০০৯ ও ২০১৩-এর সংশোধনীসহ) এবং Information Technology (Certifying Authority) Rules, ২০১০-এর উল্লেখ আছে। এই পর্ব লেখার সময় (অক্টোবর ২০২৬) আমরা আইনের নির্দিষ্ট ধারাগুলো সরকারি উৎস থেকে মিলিয়ে নিতে পারিনি, তাই এখানে কোনো ধারা উদ্ধৃত করছি না। কোন দলিলে কোন স্বাক্ষর গ্রহণযোগ্য, সে বিষয়ে bdlaws.minlaw.gov.bd আর CCA-র সর্বশেষ দলিল দেখুন, আর আইনজীবীর পরামর্শ নিন। এটি আইনি পরামর্শ নয়। সাইবার আইনের সাধারণ চিত্রের জন্য দেখুন পর্ব ০৬. খেয়াল রাখবেন, আইনি স্বাক্ষরের CA আর ব্রাউজারের ওয়েব trust store দুটি আলাদা ব্যবস্থা; একটিতে থাকলে অন্যটিতে থাকা নিশ্চিত হয় না।

পরীক্ষা ও ইন্টারভিউতে: এ ধরনের প্রশ্ন আসতে পারে।
MAC আর digital signature-এর মূল পার্থক্য? MAC-এ এক গোপন key, তাই তৃতীয় পক্ষকে প্রমাণ করা যায় না; signature-এ বানানোর ক্ষমতা শুধু private key-র।
Root CA offline কেন? ফাঁস হলে পুরো শিকল ভাঙে আর সরাতে সময় লাগে; intermediate সহজে বদলানো যায়।
Hostname কোথায় মেলে? SAN-এ; CN পুরোনো রীতি।
OCSP stapling কী সমাধান করে? ক্লায়েন্টকে CA-র কাছে যেতে হয় না, তাই গতি আর গোপনতা বাড়ে।
CT কী করে, কী করে না? Issuance প্রকাশ্য করে ধরা সহজ করে; জাল issuance নিজে আটকায় না।

১০ · AI-এর যুগে certificate সামলানো

Certificate-এর ত্রুটি হাতে নিয়ে AI-কে জিজ্ঞেস করা এখন স্বাভাবিক। উত্তর দ্রুত আসে, কিন্তু প্রায়ই সবচেয়ে সহজ পথটি হয় যাচাই বন্ধ করা। সেটি ত্রুটি সারায় না, নিরাপত্তা সরিয়ে ফেলে।

AI যা করতে পারেকেন বিপদআপনি যা করবেন
verify=False, curl -k পরামর্শMITM ধরা বন্ধত্রুটির আসল কারণ খুঁজুন: নাম, মেয়াদ, intermediate, ঘড়ি
SHA-1 বা RSA-1024 দিয়ে certificate বানানোপুরোনো পরামর্শ, বর্তমান ব্যবস্থায় গ্রহণযোগ্য নয়বর্তমান মান আর আপনার library-র নথি দেখুন
নিজে ECDSA বা padding কোড লিখে দেওয়াNonce আর side-channel ভুল চোখে পড়ে নাপরীক্ষিত library ব্যবহার করুন
ভুল RFC নম্বর বা CVE বানিয়ে বলাআত্মবিশ্বাসী, কিন্তু ভিত্তিহীনrfc-editor.org আর মূল উৎসে মিলিয়ে নিন
“CN মিললেই হবে” বা “OCSP সব ধরে” বলাপুরোনো বা ভুল ধারণানিজের ল্যাবে openssl দিয়ে পরীক্ষা করুন
Private key পেস্ট করতে বলাKey আর গোপন থাকে নাকখনো দেবেন না; ফাঁস হয়ে গেলে revoke আর নতুন key

নিচের prompt-এ শুধু public তথ্য যাচ্ছে, আর শর্ত দেওয়া আছে যে যাচাই বন্ধের পরামর্শ চলবে না। Certificate-এর public অংশ দেওয়া নিরাপদ, private key নয়।

আমি নিজের সার্ভারের TLS certificate-এর সমস্যা সারাচ্ছি। নিচে আছে openssl x509 -text-এর public আউটপুট আর আমার client-এর ত্রুটি। [এখানে public আউটপুট আর ত্রুটির বার্তা দিন। কোনো private key বা password দিও না।] ১. সম্ভাব্য কারণগুলো ক্রমে সাজাও: নাম, মেয়াদ, intermediate, ঘড়ি, trust store. ২. প্রতিটি কারণ যাচাইয়ের জন্য আমার নিজের সিস্টেমে চালানোর openssl কমান্ড দাও, আর কোন আউটপুট দেখলে কী বুঝব তা বলো। ৩. verify=False, curl -k বা যাচাই বন্ধের কোনো পরামর্শ দিও না। ৪. যে RFC বা নিয়ম উল্লেখ করবে, তার নম্বর দাও। নিশ্চিত না হলে সেটি স্পষ্ট করে বলো।

AI-এর সাহায্য নেওয়ার পরে — চেকলিস্ট

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১Digital signature থাকলে কেউ কি সত্যিই অস্বীকার করতে পারেন না? Non-repudiation-এর দাবি কতটা শক্ত?

পাঠ্যবইয়ে প্রায়ই লেখা থাকে, signature দিলে স্বাক্ষরকারী আর অস্বীকার করতে পারেন না। গাণিতিকভাবে দাবিটি সংকীর্ণ: “এই private key দিয়ে এই বার্তায় স্বাক্ষর হয়েছে।” কিন্তু আদালত বা অফিসের প্রশ্ন ভিন্ন: “এই মানুষটি কি জেনে-বুঝে এতে সম্মতি দিয়েছেন?” মাঝখানে কয়েকটি ফাঁক আছে।

  • Key-এর দখল: ল্যাপটপে malware থাকলে, বা key ফাইল কেউ কপি করলে, অন্য কেউ একই স্বাক্ষর বানাতে পারে। তাই স্বাক্ষরকারী বলতে পারেন, “আমি করিনি, আমার key চুরি হয়েছিল।”
  • কী দেখে সই করলেন: পর্দায় এক টাকার অঙ্ক দেখিয়ে ভেতরে আরেকটি বার্তা সই করানো সম্ভব, যদি যন্ত্রটিই আক্রান্ত হয়। একে “what you see is what you sign” সমস্যা বলা হয়।
  • সময়: Key বাতিলের আগে না পরে সই হয়েছে, তা জানতে বিশ্বস্ত timestamp লাগে।

এজন্য বাস্তবে non-repudiation শুধু গণিত নয়, একটি পুরো প্রক্রিয়া: নির্দিষ্ট যন্ত্রে key রাখা (smart card বা HSM), key বের হতে না দেওয়া, ব্যবহারের আগে PIN, timestamp, audit log আর লিখিত নীতি। সেই সাথে আইনি কাঠামোও লাগে, যা বলে কোন শর্তে একটি স্বাক্ষরকে বৈধ ধরা হবে। MAC-এ এই আলোচনাই ওঠে না, কারণ দুই পক্ষের হাতেই একই key. ব্যাংকের লেনদেনে এজন্য স্বাক্ষরের পাশাপাশি লেনদেনের log, যন্ত্রের তথ্য আর দ্বিতীয় অনুমোদনও রাখা হয়, যা পর্ব ০৩-এর separation of duties-এরই রূপ।

মূল উপলব্ধি: Signature প্রমাণ করে key ব্যবহার হয়েছে। মানুষের দায় প্রমাণ করতে key-এর সুরক্ষা, প্রক্রিয়া আর আইন, সবই একসাথে লাগে।

প্র ০২দূর দেশের কোনো ছোট CA কি আপনার ব্যাংকের নামে certificate দিতে পারে? Web PKI-র বিশ্বাসের মডেল কেন এমন?

মূল Web PKI-তে উত্তরটি অস্বস্তিকর: সাধারণভাবে হ্যাঁ, trust store-এর যেকোনো CA যেকোনো নামের certificate দেওয়ার প্রযুক্তিগত ক্ষমতা রাখে। Certificate-এর গণিতে “এই CA শুধু এই দেশের নাম সই করবে” এমন সীমা স্বাভাবিকভাবে নেই। অর্থাৎ ব্যবস্থাটি তার সবচেয়ে দুর্বল CA-র মতোই শক্ত। বিশ্বাসের এই নকশা এসেছিল ১৯৯০-এর দশকের ই-কমার্সের তাড়া থেকে, যখন CA ছিল অল্প, আর বিশ্বজুড়ে ক্রয়-বিক্রয় চালু করাই ছিল লক্ষ্য।

২০১১ সাল এই দুর্বলতাকে সামনে আনে। Comodo-র একটি reseller-এর মাধ্যমে কিছু জাল certificate, তারপর DigiNotar. DigiNotar-এর পর প্রতিক্রিয়া ছিল কড়া: root সরানো। Symantec-এর বেলায় (২০১৭–২০১৮) ব্রাউজারগুলো ধাপে ধাপে এগিয়েছিল, কারণ অসংখ্য সাইট তার ওপর নির্ভর করত। এটি একটি অপ্রিয় প্রশ্ন তোলে: বড় CA কি “too big to fail”?

গত এক দশকের উত্তর হলো একক বড় সমাধান নয়, একাধিক স্তর। ব্যবস্থাগুলোর বেশিরভাগই ভুল ঠেকায় না, ধরে ফেলে বা ক্ষতি কমায়:

  • CT: সব issuance প্রকাশ্য, তাই লুকানো কঠিন।
  • CAA: Domain-মালিকের জানানো অনুমতি, যা CA-কে মানতে হয়।
  • Multi-perspective validation: CA একাধিক network অবস্থান থেকে domain যাচাই করে, যাতে এক জায়গার routing সমস্যায় ভুল না হয়।
  • ছোট মেয়াদ: ভুল certificate-এর আয়ু কমে।
  • কড়া root program: প্রকাশ্য audit আর incident রিপোর্ট।

একসময় HTTP Public Key Pinning (HPKP) নামেও চেষ্টা হয়েছিল, কিন্তু ভুল pin-এ নিজের সাইট বন্ধ হওয়ার ঝুঁকিতে সেটি ব্রাউজার থেকে বাদ পড়ে।

মূল উপলব্ধি: Web PKI নিখুঁত তালা নয়, পর্ব ০৩-এর defense in depth-এর মতো নজরদারি আর দায়বদ্ধতার একটি ব্যবস্থা। আপনার কাজ CAA বসানো আর CT দেখা।

প্র ০৩কেন বলা হয় online revocation-এর সিটবেল্ট দরকারের সময় ছিঁড়ে যায়? Heartbleed থেকে কী শেখা গেল?

সমস্যাটি তিন দিকের টানাপোড়েন: নির্ভরযোগ্যতা, গতি আর গোপনতা। Hard-fail করলে (উত্তর না পেলে সংযোগ বন্ধ) CA-র OCSP responder-এর সামান্য বিভ্রাটে অসংখ্য সাইট বন্ধ হবে, আর Wi-Fi-র লগইন পাতায় (captive portal) আটকে যাবে, কারণ সেখানে responder-এ পৌঁছানোই যায় না। Soft-fail করলে (উত্তর না পেলে এগিয়ে যাওয়া) পথে বসা আক্রমণকারী শুধু উত্তরটি আটকালেই বাতিল certificate চলে। প্রকৌশলী Adam Langley এটিকে এমন সিটবেল্টের সাথে তুলনা করেছিলেন, যা দুর্ঘটনার মুহূর্তেই ছিঁড়ে যায়।

২০১৪ সালের Heartbleed এই ব্যবস্থাকে বড় পরীক্ষায় ফেলে। OpenSSL-এর ত্রুটির কারণে সার্ভারের memory থেকে private key ফাঁসের আশঙ্কা ছিল, তাই বহু সাইটকে key বদলে certificate বাতিল করতে হয়। পরবর্তী গবেষণায় দেখা যায়, অনেক সাইট দেরি করেছে, অনেকে নতুন certificate নিলেও পুরোনোটি বাতিল করেনি, আর বিপুল CRL-এর কারণে খরচও বেড়েছিল। ক্লায়েন্টের দিকেও বেশিরভাগ ব্যবস্থা ঠিকমতো যাচাই করছিল না।

OCSP stapling গতি আর গোপনতা সারায়, কিন্তু সার্ভার স্ট্যাপল না পাঠালে ক্লায়েন্ট বুঝতে পারে না সে আসলে লুকাচ্ছে কি না। “Must-Staple” extension (RFC 7633) এই ফাঁক বন্ধ করতে চেয়েছিল, কিন্তু ব্যাপক ব্যবহার পায়নি। তাই শিল্প দুটি পথে গেছে। প্রথমটি ব্রাউজারে আগে থেকে পাঠানো সংকুচিত তালিকা, যেমন CRLite. দ্বিতীয়টি মেয়াদ এত ছোট করা, যাতে বাতিলের প্রয়োজনই কমে। Let's Encrypt-এর OCSP বন্ধ আর ৪৭ দিনের সীমা, দুটিই এই দিকনির্দেশ।

কিন্তু মনে রাখবেন, মেয়াদ ছোট হওয়া তাৎক্ষণিক বাতিল নয়। Key ফাঁস হলে এখনো revoke করতে হবে, আর ৪৭ দিনও একজন আক্রমণকারীর জন্য যথেষ্ট লম্বা সময়। তাই detection আর key-সুরক্ষা অপরিহার্য।

মূল উপলব্ধি: যে সুরক্ষা ব্যর্থ হলে চুপচাপ পাশ কাটিয়ে যায়, সেটি আক্রমণের সময় থাকে না। নকশার সময়ই জিজ্ঞেস করুন: এই নিয়ন্ত্রণ ব্যর্থ হলে কী হবে?

প্র ০৪Hash দুর্বল হলে স্বাক্ষর কীভাবে ধসে পড়ে? MD5 আর SHA-1-এর বিদায় থেকে কোয়ান্টাম-যুগের জন্য কী শেখার আছে?

Hash-then-sign-এ CA সই করে আসলে hash-এর ওপর, পুরো দলিলের ওপর নয়। তাই দুটি ভিন্ন দলিলের hash এক হলে, একটির স্বাক্ষর অন্যটিতেও খাটে। এটি শুধু তত্ত্বের কথা ছিল না। ২০০৪ সালে Xiaoyun Wang ও সহকর্মীরা MD5-এ collision দেখান। ২০০৮ সালে একদল গবেষক (Sotirov, Stevens প্রমুখ) নিয়ন্ত্রিত গবেষণায় দেখান যে MD5-এর দুর্বলতা কাজে লাগিয়ে একটি CA-র স্বাক্ষরকে একটি জাল intermediate CA certificate-এ খাটানো সম্ভব, অথচ সে সময়ও কিছু CA MD5 ব্যবহার করত। গবেষকেরা ঝুঁকি কমাতে certificate-টির মেয়াদ অতীতে রেখেছিলেন, আর ঘটনা দায়িত্বশীলভাবে প্রকাশ করেছিলেন। ২০১২ সালে Flame malware-এ MD5 collision-এর বাস্তব ব্যবহারের কথাও প্রকাশিত হয়।

SHA-1-এর বিদায়ে শিল্প আগেভাগে প্রস্তুত হতে চেষ্টা করেছে। CA/Browser Forum নতুন SHA-1 certificate বন্ধের নিয়ম আনে, ব্রাউজার ২০১৭-র আশেপাশে SHA-1 certificate অবিশ্বাস করে, আর একই বছর Google ও CWI-এর SHAttered প্রকল্প প্রথম প্রকাশ্য SHA-1 collision দেখায়। অর্থাৎ এবার সরে যাওয়া শুরু হয়েছিল ব্যবহারিক আক্রমণের আগেই, তবে পুরোনো যন্ত্র আর software-এর জন্য তা ছিল কষ্টকর।

এই ইতিহাস থেকে তিনটি প্রকৌশল-শিক্ষা। প্রথম, crypto agility: অ্যালগরিদম কোডে পোক্ত করে না বসিয়ে বদলানোর মতো রাখা। দ্বিতীয়, inventory: কোথায় কোন অ্যালগরিদম আছে, তার তালিকা। তৃতীয়, আগেভাগে শুরু: ভাঙা পড়ার আগে সরে যাওয়া। একটি ছোট প্রযুক্তিগত প্রতিরোধও ছিল: Serial Number অনুমান-অযোগ্য করা, যাতে আক্রমণকারী সই-হওয়া দলিলের বিষয়বস্তু আগে থেকে না জানে।

আজ একই প্রশ্ন post-quantum রূপান্তরে ফিরে এসেছে। FIPS 204 আর FIPS 205-এর নতুন স্বাক্ষর এসেছে ২০২৪ সালে, কিন্তু সেগুলোর আকার অনেক বড়, তাই certificate শিকল আর handshake নতুন করে ভাবতে হচ্ছে (পর্ব ১৪)।

মূল উপলব্ধি: স্বাক্ষরের শক্তি তার সবচেয়ে দুর্বল উপাদানের সমান। অ্যালগরিদম একদিন বদলাতেই হবে, এই ধরে নিয়ে ব্যবস্থা বানান।

প্র ০৫৪৭ দিনের certificate কি নিরাপত্তা বাড়াবে, নাকি বিভ্রাট? ছোট প্রতিষ্ঠান কী করবে?

দুই দিকেই যুক্তি আছে। নিরাপত্তার পক্ষে: ফাঁস হওয়া key বা ভুল certificate-এর আয়ু কমে, revocation-এর ওপর নির্ভরতা কমে, domain যাচাইয়ের তথ্য টাটকা থাকে, আর ঘন ঘন বদলের অভ্যাস অ্যালগরিদম বদলকেও সহজ করে, যা post-quantum রূপান্তরে কাজে লাগবে।

ঝুঁকির দিকেও ইতিহাস আছে। Certificate-এর মেয়াদ ফুরিয়ে বড় বিভ্রাটের ঘটনা বহুবার প্রকাশিত। ২০১৮ সালের ডিসেম্বরে Ericsson জানায় যে তাদের software-এ একটি মেয়াদোত্তীর্ণ certificate কয়েকটি দেশের মোবাইল নেটওয়ার্কে সমস্যার কারণ। লক্ষ করার বিষয়, এমন ঘটনাগুলোর বেশিরভাগই বাইরের হামলা নয়, হিসাব রাখার ব্যর্থতা: কার দায়িত্ব কেউ জানতেন না, বা যে ইমেইলে সতর্কবার্তা গিয়েছিল সেটি কেউ পড়েননি।

৪৭ দিনের যুগে পুরোনো “বছরে একবার হাতে করে” পদ্ধতি চলবে না। ধরুন একটি কল্পিত প্রতিষ্ঠানে ২০০টি certificate. ৩১ দিন পরপর নবায়নে বছরে প্রায় ২৪০০টি কাজ। হাতে করলে প্রতিটি কাজই বিভ্রাটের সুযোগ। ঠিক এজন্য ব্যালটটি তিন ধাপে বছরের পর বছর সময় দিয়েছে। ছোট প্রতিষ্ঠানের জন্য বাস্তব পরিকল্পনা হতে পারে:

  • তালিকা: কোন certificate কোথায়, মালিক কে। CT log থেকেও নিজের নামগুলো মিলিয়ে নেওয়া যায়।
  • স্বয়ংক্রিয়তা: ACME client, অথবা hosting বা CDN-এর ব্যবস্থাপিত certificate.
  • নজরদারি: সার্ভার আসলে কোন certificate দেখাচ্ছে, তা পরীক্ষা, আর ব্যর্থ নবায়নে জোরালো alert.
  • কঠিন জায়গা: পুরোনো যন্ত্র, load balancer আর embedded সরঞ্জাম, যেখানে ACME চলে না। এগুলোর জন্য আগে থেকে পথ বের করা, বা public certificate-এর বদলে private PKI নিয়ে ভাবা।
  • Pinning এড়ানো: App-এ leaf certificate বেঁধে রাখলে ঘন বদল প্রতিটিতেই ভাঙবে।

মূল উপলব্ধি: ছোট মেয়াদ নিরাপত্তার সুবিধা দেয় তখনই, যখন প্রক্রিয়া স্বয়ংক্রিয়। বিভ্রাট ঠেকাতে মেয়াদ নয়, হাতের কাজ কমান।

অনুশীলন

কমান্ডগুলো শুধু নিজের যন্ত্রে, নিজের ফোল্ডারের ফাইলে চালান।

  1. নিজের certificate পড়ুন (কমান্ড): পর্বের কমান্ড দিয়ে নিজের ফোল্ডারে একটি ৩০ দিনের test certificate বানান। তারপর (ক) Issuer আর Subject মিলিয়ে বলুন এটি self-signed কি না, (খ) SAN-এ কোন নাম আছে, (গ) -checkhost shop.example.com কী বলে, (ঘ) ৬০ দিন পরের মেয়াদ পরীক্ষায় -checkend-এ কত সেকেন্ড দেবেন?

    (ক) Issuer আর Subject এক, তাই self-signed. (খ) আমাদের কমান্ডে দুটি নাম: lab.example.com আর www.lab.example.com. (গ) আমাদের ল্যাবে উত্তর ছিল Hostname shop.example.com does NOT match certificate. (ঘ) ৬০ × ৮৬৪০০ = ৫১৮৪০০০ সেকেন্ড, তাই -checkend 5184000. ৩০ দিনের certificate-এ এটি বলবে মেয়াদ ফুরিয়ে যাবে। আরও দেখুন: openssl verify test.crt আমাদের ল্যাবে self-signed certificate ত্রুটি দিয়েছিল, কারণ root store-এ এটি নেই। পরীক্ষা শেষে test.key মুছে দিন।

  2. নবায়নের হিসাব (numerical): একটি কল্পিত প্রতিষ্ঠানে ৩০০টি public certificate. প্রতিটি হাতে নবায়নে ১০ মিনিট লাগে (ধরে নেওয়া)। মেয়াদের ২/৩ সময়ে নবায়ন হয়। ৪৭ দিনের যুগে বছরে কতবার নবায়ন, আর মোট কত ঘণ্টা? ৩৯৮ দিনের যুগে কত ছিল?

    ৪৭ দিন: ⌊৪৭ × ২/৩⌋ = ৩১ দিন পরপর। ৩৬৫ ÷ ৩১ ≈ ১১.৮, তাই ১২ বার। মোট ১২ × ৩০০ = ৩৬০০টি কাজ। ৩৬০০ × ১০ = ৩৬০০০ মিনিট = ৬০০ ঘণ্টা।

    ৩৯৮ দিন: ⌊৩৯৮ × ২/৩⌋ = ২৬৫ দিন পরপর। ৩৬৫ ÷ ২৬৫ ≈ ১.৪, ওপরের দিকে নিলে ২ বার। মোট ৬০০টি কাজ = ৬০০০ মিনিট = ১০০ ঘণ্টা। অর্থাৎ ছয় গুণ, প্রায় ১৫ কর্মসপ্তাহের কাজ (সপ্তাহে ৪০ ঘণ্টা ধরে)। এই হিসাবই স্বয়ংক্রিয়তার ব্যবসায়িক যুক্তি। হিসাবের ধারণাগুলো কল্পিত, তাই বাস্তব সংখ্যা আলাদা হবে।

  3. নকশা সমালোচনা: একটি কাল্পনিক অনলাইন বাজারে ৪০টি অভ্যন্তরীণ সার্ভিসের mTLS-এর জন্য এক প্রকৌশলী প্রস্তাব দিলেন: একটি root CA, তার key থাকবে সার্ভিস-সার্ভারের ডিস্কে; প্রতিটি সার্ভিসকে ১০ বছরের certificate; কোনো revocation বা log নয়; সব কর্মীর ল্যাপটপে root ইনস্টল। কী কী বদলাবেন?
    • Root আলাদা: Root key offline HSM-এ, online কাজের জন্য আলাদা intermediate. সার্ভারের ডিস্কে root key মানে একটি সার্ভার ফাঁসে পুরো বিশ্বাস শেষ।
    • মেয়াদ: ১০ বছর নয়, কয়েক দিন থেকে কয়েক সপ্তাহ, internal ACME বা service mesh দিয়ে স্বয়ংক্রিয়।
    • Revocation আর log: ছোট মেয়াদ বেশিরভাগ চাহিদা মেটায়, তবু CRL বা জরুরি পরিকল্পনা রাখুন। প্রতিটি issuance-এর log, যাতে অস্বাভাবিকতা ধরা যায় (detection).
    • Trust scope: সব ল্যাপটপে root না দিয়ে শুধু যাদের দরকার, তাদের। সার্ভিসের trust শুধু আলাদা internal CA-তে। Name constraints দিয়ে শুধু ভেতরের domain-এ সীমা দিন।
    • Key: Key সার্ভিসে তৈরি হোক, কেন্দ্রীয়ভাবে নয়; backup-এ private key না যায়।
    • মহড়া: Intermediate ফাঁসের পরিস্থিতিতে নতুন করে issue করার drill.
  4. আউটপুট অনুমান করুন: পর্বের chain_validator.js-এ শুধু NOW = 150 বদলে NOW = 210 করলে ছয়টি সারিতে কী ছাপা হবে? কোডে যাচাইয়ের ক্রম মনে রাখুন: আগে নাম, তারপর প্রতিটি certificate-এ issuer link, স্বাক্ষর, মেয়াদ, CA flag. চালানোর আগে লিখে নিন।

    Leaf-এর মেয়াদ দিন ২০০-তে শেষ, তাই দিন ২১০-এ:

    good chain       FAIL shop.example.com: outside validity
    wrong host       FAIL name not in SAN
    expired leaf     FAIL shop.example.com: outside validity
    edited SAN       FAIL shop.example.com: bad signature
    leaf acts as CA  FAIL x.example.com: outside validity
    rogue root       FAIL shop.example.com: outside validity

    দুটি জিনিস লক্ষ করুন। wrong host আর edited SAN আগের মতোই, কারণ নাম আর স্বাক্ষর মেয়াদের আগে যাচাই হয়। আর leaf acts as CA-র কারণ বদলে গেছে: আগে ছিল not a CA, এখন শিকলের প্রথম certificate-টিই মেয়াদ-উত্তীর্ণ, তাই লুপ সেখানেই থামে। ব্যর্থতার বার্তা প্রথম ব্যর্থ শর্তটি জানায়, সব সমস্যা নয়। তাই একটি ত্রুটি সারানোর পর আবার পরীক্ষা করা দরকার।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি TLS certificate-এর জীবনের ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)

  1. সার্ভারে key জোড়া তৈরি
  2. Public key আর নাম দিয়ে CSR তৈরি
  3. CA-র কাছে domain নিয়ন্ত্রণের প্রমাণ
  4. CT log-এ জমা দিয়ে certificate issue
  5. সার্ভারে fullchain বসিয়ে reload
  6. মেয়াদ ফুরানোর আগে নবায়ন

দুটি ব্যাংক একটি গোপন HMAC key ভাগ করে বার্তা যাচাই করে। একটি ব্যাংক দাবি করল, অন্যটি একটি নির্দিষ্ট বার্তা পাঠিয়েছে। আদালতের সামনে HMAC কি তা প্রমাণ করতে পারে?

  • হ্যাঁ, tag মিললেই প্রমাণ হয় অন্য ব্যাংকই পাঠিয়েছে
  • না, কারণ দুই পক্ষই একই tag বানাতে পারে
  • হ্যাঁ, যদি SHA-256 ব্যবহার হয়
  • না, কারণ HMAC বার্তার বদল ধরতে পারে না

ECDSA ব্যবহারকারী একটি firmware-signing ব্যবস্থায় দেখা গেল দুটি ভিন্ন firmware-এর স্বাক্ষরে একই nonce ব্যবহার হয়েছে। সবচেয়ে বড় ঝুঁকি কোনটি?

  • স্বাক্ষরের আকার বেড়ে যাবে
  • দুটি firmware-এর hash এক হয়ে যাবে
  • প্রকাশ্য স্বাক্ষর থেকে private key ফাঁস হতে পারে
  • স্বাক্ষর যাচাই সাথে সাথে ব্যর্থ হবে

একটি certificate-এর SAN-এ *.example.com আর example.com আছে। ব্রাউজারে a.b.example.com খুললে নাম-যাচাইয়ের ফল কী?

  • মিলবে না, কারণ wildcard শুধু এক স্তর ধরে
  • মিলবে, কারণ wildcard সব subdomain ধরে
  • মিলবে, যদি CN-এ example.com থাকে
  • শুধু স্বাক্ষরের ওপর নির্ভর করবে

একজন প্রশাসক দেখলেন openssl x509 -text-এ Not Before আগামী সপ্তাহের একটি তারিখ দেখাচ্ছে। সার্ভারের ঘড়ি ঠিক আছে। এখন ক্লায়েন্টেরা কী দেখবেন?

  • কোনো সমস্যা নেই, নতুন certificate সবসময় ভালো
  • Revocation ত্রুটি, কারণ CA এটি বাতিল করেছে
  • Hostname mismatch ত্রুটি
  • Certificate এখনো বৈধ নয়, এমন ত্রুটি

OCSP stapling সবচেয়ে বেশি কোন সমস্যা কমায়?

  • CA-র জাল certificate তৈরি পুরোপুরি বন্ধ করে
  • ক্লায়েন্টের CA-কে জিজ্ঞেস করার দেরি আর গোপনতার ঝুঁকি
  • Certificate-এর মেয়াদ বাড়িয়ে দেয়
  • Private key চুরি ঠেকায়

Certificate Transparency সম্পর্কে কোন কথাটি সঠিক?

  • Log-এর অনুমতি ছাড়া কোনো CA প্রযুক্তিগতভাবে স্বাক্ষরই করতে পারে না
  • CT ব্রাউজার আর সার্ভারের সংযোগ এনক্রিপ্ট করে
  • এটি জাল বা ভুল issuance ধরা সহজ করে, কিন্তু নিজে তা ঠেকায় না
  • এটি certificate-এর নামগুলো গোপন রাখে

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. Signature = hash + private key. যাচাই public key দিয়ে। এটি key-এর ব্যবহার প্রমাণ করে, বার্তার সত্যতা নয়।
  2. MAC দ্রুত, কিন্তু তৃতীয় পক্ষকে প্রমাণ করা যায় না। ECDSA-তে nonce কখনো পুনরাবৃত্ত হতে পারবে না।
  3. Certificate নাম আর public key-কে বাঁধে। যাচাই: স্বাক্ষর, মেয়াদ, CA flag, key usage, SAN, trust store.
  4. Revocation দুর্বল, তাই ছোট মেয়াদ আর স্বয়ংক্রিয়তা। CT আর CAA দিয়ে নিজের domain পাহারা দিন।
  5. Root key offline, private key আলাদা, আর ত্রুটিতে কখনো যাচাই বন্ধ নয়।

পরের পর্বে: আজ certificate-কে একা দেখলেন। এবার সেটি কাজে নামবে: TLS handshake-এ এই সব উপাদান কীভাবে একসাথে চলে, ভালো configuration কেমন, আর সার্ভারে certificate কীভাবে সামলাবেন।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান