Windows সার্টিফিকেট স্টোরের বাস্তব নির্দেশিকা — ব্যবহারকারী না কম্পিউটার, কোনটিতে রাখবেন
· Go Komura · সার্টিফিকেট, Windows, নিরাপত্তা, PKI, TLS, PowerShell, ব্যবসায়িক অ্যাপ, তথ্য ব্যবস্থা
«অনলাইন যোগ্যতা নিশ্চিতকরণের টার্মিনাল হালনাগাদে ক্লায়েন্ট সার্টিফিকেট নতুন PC-তে আবার রাখলে সংযোগ হয় না», «ডেভ মেশিনে ব্যাংক API-তে পৌঁছায়, Windows সার্ভিস করলে «সার্টিফিকেট পাওয়া যায় না» বলে», «আদৌ certmgr.msc-তে দেখা সার্টিফিকেট আর certlm.msc-তে দেখা সার্টিফিকেট কোনটা আসল বোঝা যায় না» — ক্লায়েন্ট সার্টিফিকেটসহ Web API ইন্টিগ্রেশন কাস্টম সফটওয়্যার ডেভেলপমেন্টে বানালে এই ধরনের পরামর্শ নিয়মিত আসে।
চিকিৎসা প্রতিষ্ঠানের অনলাইন যোগ্যতা নিশ্চিতকরণ, ইলেকট্রনিক আবেদন, ব্যাংক পরিবারের API, লেনদেনের EDI। একসময় শুধু বড় প্রতিষ্ঠানের অবকাঠামো কর্মী ছুঁতেন এমন ক্লায়েন্ট সার্টিফিকেট এখন ছোট ও মাঝারি ব্যবসার তথ্য-ব্যবস্থা কর্মী ও ব্যবসায়িক-অ্যাপ ডেভেলপার সামলান। আর সার্টিফিকেট ঘিরে দুর্ঘটনা আসলে কয়েকটা প্যাটার্নে জমা হয়। রাখার জায়গা ভুল, প্রাইভেট কী-এর অনুমতি ভুলে যাওয়া, মেয়াদ ভুলে যাওয়া — এই তিনটা।
এই নিবন্ধ ক্লায়েন্ট সার্টিফিকেট ব্যবহার করা ব্যবসায়িক অ্যাপের ডেভেলপার এবং সার্টিফিকেট বদলানোর কাজ পাওয়া তথ্য-ব্যবস্থা কর্মীদের জন্য, «ব্যবহারকারী স্টোর না কম্পিউটার স্টোর কোনটিতে রাখবেন» সিদ্ধান্তকে কেন্দ্র করে Windows সার্টিফিকেট স্টোরের কাঠামো থেকে প্রাইভেট কী-এর অনুমতি, PowerShell দিয়ে মেয়াদের তালিকা, .NET থেকে ব্যবহারের কোড একসাথে সাজায়। বিষয় আগস্ট ২০২৬-এর Microsoft Learn প্রাথমিক সূত্রে।
1. আগে উপসংহার
- Windows-এর সার্টিফিকেট স্টোর «ব্যবহারকারী (CurrentUser)» ও «কম্পিউটার (LocalMachine)» দুই ধারা। ব্যবহারকারী স্টোর অ্যাকাউন্টে অ্যাকাউন্টে আলাদা (রেজিস্ট্রির HKEY_CURRENT_USER-এর নিচে), কম্পিউটার স্টোর পুরো PC-তে সাধারণ (HKEY_LOCAL_MACHINE-এর নিচে)।12
- পরিচালনার টুলও দুটো। certmgr.msc বর্তমান ব্যবহারকারী, certlm.msc লোকাল কম্পিউটারের স্টোর খোলে। PowerShell থেকে
Cert:\CurrentUserওCert:\LocalMachine।34 - কোনটিতে রাখবেন «সেই সার্টিফিকেট ব্যবহার করা প্রোগ্রাম কার হিসেবে চলে» দিয়ে স্থির। ইন্টারঅ্যাকটিভ ব্যবহারকারীর অ্যাপ হলে ব্যবহারকারী স্টোর, Windows সার্ভিস·IIS·টাস্ক শিডিউলারের মানবহীন চালনা হলে কম্পিউটার স্টোর নীতি (৩ অধ্যায়ের সিদ্ধান্ত সারণি)।
- «ডেভে চলল সার্ভিস করলে পাওয়া যায় না»-এর কারণ প্রায় একটাই। ডেভেলপার নিজের ব্যবহারকারী স্টোরে রাখা সার্টিফিকেট আলাদা অ্যাকাউন্টে চলা সার্ভিসের CurrentUser থেকে দেখা যায় না (৩ অধ্যায়)।
- সার্টিফিকেট ও প্রাইভেট কী আলাদা জিনিস। কম্পিউটার স্টোরে রাখলেই সার্ভিস অ্যাকাউন্ট প্রাইভেট কী পড়তে পারে না সাধারণত। certlm.msc-এর «প্রাইভেট কী ব্যবস্থাপনা» দিয়ে চালু অ্যাকাউন্টে পড়ার অনুমতি দিন।5
- pfx ইমপোর্টে প্রাইভেট কী ডিফল্টে এক্সপোর্ট অযোগ্য হয়।
Import-PfxCertificate-Exportableনা দিলে প্রাইভেট কী আবার এক্সপোর্ট করা যায় না এমন রূপে নেয়। এটা দুর্ঘটনা নয়, কাম্য ডিফল্ট।6 - মেয়াদ শেষ তালিকার স্বয়ংক্রিয়তায় ঠেকান।
Get-ChildItem Cert:\LocalMachine\My -ExpiringInDays 60এর মতো নির্দিষ্ট দিনের মধ্যে কাটা সার্টিফিকেট যান্ত্রিকভাবে বের করা যায়।4 - থাম্বপ্রিন্ট (স্যামপ্রিন্ট) কোড বা কনফিগে হার্ডকোড করলে সার্টিফিকেট হালনাগাদের বার মরে। নতুন সার্টিফিকেটের থাম্বপ্রিন্ট সবসময় বদলায়। কনফিগ বাইরে রাখা+পুরনো-নতুন পাশাপাশি সময় নকশার মূল (৫ অধ্যায়·৭ অধ্যায়)।
এই নিবন্ধের জ্ঞান মানচিত্র
Windows-এর সার্টিফিকেট স্টোর ব্যবহারকারী (CurrentUser) ও কম্পিউটার (LocalMachine) দুই ধারায় ভাগ, ক্লায়েন্ট সার্টিফিকেট কোনটিতে রাখবেন «সেই প্রোগ্রাম কার হিসেবে চলে» দিয়ে স্থির। মানবহীন চালনার Windows সার্ভিস কম্পিউটার স্টোর ও প্রাইভেট কী-এর অ্যাক্সেস অনুমতি একসেট, সার্টিফিকেটের মেয়াদ শেষ ও হার্ডকোড করা থাম্বপ্রিন্ট সার্টিফিকেটজনিত সংযোগ বিঘ্নের নিয়মিত কারণ।
flowchart LR
accTitle: Windows সার্টিফিকেট স্টোর বাস্তব নির্দেশিকার জ্ঞান মানচিত্র
accDescr: সার্টিফিকেট স্টোর (ব্যবহারকারী/কম্পিউটার), ক্লায়েন্ট সার্টিফিকেট, প্রাইভেট কী, সার্টিফিকেট চেইন, রুট CA · মধ্যবর্তী CA, মেয়াদ শেষ · থাম্বপ্রিন্ট ও সংযোগ বিঘ্ন, বদলানোর ধাপ · খাতা · স্ব-স্বাক্ষরিত সার্টিফিকেটের ঝুঁকির সম্পর্ক দেখানো চিত্র
certificate_store["সার্টিফিকেট স্টোর"]
client_certificate["ক্লায়েন্ট সার্টিফিকেট"]
windows_service["Windows সার্ভিস"]
localmachine_store["কম্পিউটারের সার্টিফিকেট স্টোর"]
private_key["প্রাইভেট কী"]
private_key_acl["প্রাইভেট কী-এর অ্যাক্সেস অনুমতি"]
certificate_chain["সার্টিফিকেট চেইন"]
intermediate_ca["মধ্যবর্তী CA সার্টিফিকেট"]
root_ca["রুট CA সার্টিফিকেট"]
certificate_expiry["সার্টিফিকেটের মেয়াদ শেষ"]
certificate_failure["সার্টিফিকেটজনিত সংযোগ বিঘ্ন"]
thumbprint_hardcode["থাম্বপ্রিন্ট হার্ডকোড"]
group_policy["গ্রুপ পলিসি"]
intune["Microsoft Intune"]
currentuser_store["ব্যবহারকারীর সার্টিফিকেট স্টোর"]
certmgr_msc["certmgr.msc"]
certlm_msc["certlm.msc"]
cert_drive["Cert: ড্রাইভ"]
pfx["PFX ফাইল"]
certutil["certutil"]
code_signing_cert["কোড স্বাক্ষর সার্টিফিকেট"]
trusted_publisher_store["বিশ্বস্ত প্রকাশক স্টোর"]
desktop_app["ইন্টারঅ্যাকটিভ ব্যবহারকারীর ডেস্কটপ অ্যাপ"]
cert_renewal["সার্টিফিকেট বদলানো"]
cert_ledger["সার্টিফিকেট খাতা"]
self_signed_cert["অ্যাডহক স্ব-স্বাক্ষরিত সার্টিফিকেট"]
trust_anchor_risk["বিশ্বাসের শুরু অপব্যবহারের ঝুঁকি"]
cert_selection["সার্টিফিকেট বাছাই (খোঁজা)"]
personal_store["«ব্যক্তিগত» স্টোর (My)"]
store_mismatch["স্টোর ভুল চেনা"]
iis_apppool["IIS অ্যাপ্লিকেশন পুল"]
task_scheduler["টাস্ক শিডিউলারের মানবহীন চালনা"]
exportable_import["এক্সপোর্ট যোগ্য করে ইমপোর্ট"]
key_exfiltration_risk["প্রাইভেট কী বের করে নেওয়ার ঝুঁকি"]
everyone_full_control["Everyone-এ ফুল কন্ট্রোল দেওয়া"]
partner_registration["প্রতিপক্ষে সার্টিফিকেট আগে নিবন্ধন"]
cert_switchover["নতুন সার্টিফিকেটে স্যুইচ"]
x509store["X509Store ক্লাস"]
validonly_search["validOnly নির্দেশের সার্টিফিকেট খোঁজা"]
key_usage["কী ব্যবহার (Key Usage) অ্যাট্রিবিউট"]
config_externalization["থাম্বপ্রিন্ট কনফিগে বাইরে রাখা"]
cert_choice_logging["বেছে নেওয়া সার্টিফিকেটের লগ আউটপুট"]
windows_service -.->|"ব্যবহার করে"| localmachine_store
client_certificate -->|"পূর্বশর্ত"| private_key
windows_service -.->|"পূর্বশর্ত"| private_key_acl
certificate_chain -.->|"পূর্বশর্ত"| intermediate_ca
certificate_chain -->|"পূর্বশর্ত"| root_ca
certificate_expiry -.->|"কারণ হতে পারে"| certificate_failure
thumbprint_hardcode -.->|"কারণ হতে পারে"| certificate_failure
certificate_failure -.->|"দিয়ে যাচাই"| certificate_chain
root_ca -.->|"দিয়ে কনফিগার"| group_policy
root_ca -.->|"দিয়ে কনফিগার"| intune
currentuser_store -->|"দিয়ে যাচাই"| certmgr_msc
localmachine_store -->|"দিয়ে যাচাই"| certlm_msc
certificate_store -->|"দিয়ে যাচাই"| cert_drive
certificate_expiry -->|"দিয়ে যাচাই"| cert_drive
private_key -.->|"এ সংরক্ষিত"| pfx
certificate_chain -->|"দিয়ে যাচাই"| certutil
code_signing_cert -.->|"এ সংরক্ষিত"| trusted_publisher_store
desktop_app -.->|"ব্যবহার করে"| currentuser_store
root_ca -.->|"এ সংরক্ষিত"| localmachine_store
private_key_acl -.->|"দিয়ে কনফিগার"| certlm_msc
cert_renewal -.->|"প্রতিরোধ করে"| certificate_failure
cert_ledger -.->|"প্রতিরোধ করে"| certificate_expiry
self_signed_cert -.->|"কারণ হতে পারে"| trust_anchor_risk
thumbprint_hardcode -->|"ব্যবহার নিরুৎসাহিত"| cert_selection
self_signed_cert -->|"ব্যবহার নিরুৎসাহিত"| root_ca
cert_ledger -->|"প্রস্তাবিত সমাধান"| certificate_expiry
currentuser_store -->|"বিষয়বস্তু উত্তরাধিকার করে"| localmachine_store
client_certificate -->|"এ সংরক্ষিত"| personal_store
store_mismatch -->|"কারণ হতে পারে"| certificate_failure
iis_apppool -.->|"ব্যবহার করে"| localmachine_store
iis_apppool -->|"পূর্বশর্ত"| private_key_acl
task_scheduler -.->|"ব্যবহার করে"| localmachine_store
exportable_import -->|"কারণ হতে পারে"| key_exfiltration_risk
everyone_full_control -->|"ব্যবহার নিরুৎসাহিত"| private_key_acl
cert_renewal -.->|"পূর্বশর্ত"| private_key_acl
partner_registration -.->|"আগে করা উচিত"| cert_switchover
x509store -->|"ব্যবহার করে"| certificate_store
validonly_search -.->|"কমায়"| certificate_failure
client_certificate -.->|"পূর্বশর্ত"| key_usage
config_externalization -->|"প্রস্তাবিত সমাধান"| cert_selection
cert_choice_logging -->|"প্রস্তাবিত সমাধান"| certificate_failure
চিত্রে, টানা রেখা সবসময় সত্য এমন সম্পর্ককে এবং ভাঙা রেখা শর্তসাপেক্ষ সম্পর্ককে নির্দেশ করে (শর্তগুলো বিস্তারিত পাতায় প্রতিটি সম্পর্কের ব্যাখ্যায় আছে)। সম্পর্কের সম্পূর্ণ তালিকা (মোট 41, প্রমাণ ও নিশ্চয়তার মাত্রাসহ) এবং প্রধান ধারণাগুলোর সংজ্ঞা জ্ঞান মানচিত্রের বিস্তারিত পাতায় সংগ্রহ করা আছে (জাপানি ভাষায়)। তথ্য: JSON-LD / Turtle
2. সার্টিফিকেট স্টোরের পুরো ছবি — দুই জায়গা ও লজিক্যাল স্টোর
2.1. ব্যবহারকারী ও কম্পিউটার দুই ধারা
Windows-এর সার্টিফিকেট স্টোর মোটামুটি দুই «জায়গা»য় ভাগ।1
- কম্পিউটার (লোকাল কম্পিউটার, LocalMachine) সার্টিফিকেট স্টোর: সেই PC-তে একটা, PC-এর সব ব্যবহারকারী ও সার্ভিসের সাধারণ। সত্তা রেজিস্ট্রির
HKEY_LOCAL_MACHINE\Software\Microsoft\SystemCertificatesএর নিচে।2 - ব্যবহারকারী (বর্তমান ব্যবহারকারী, CurrentUser) সার্টিফিকেট স্টোর: ব্যবহারকারী অ্যাকাউন্টে অ্যাকাউন্টে আলাদা। সত্তা
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificatesএর নিচে, অর্থাৎ ব্যবহারকারী প্রোফাইলের অংশ।2
এছাড়া সার্ভিস অ্যাকাউন্ট এককে স্টোরও আছে3, সত্তা সার্ভিস নাম অনুযায়ী রেজিস্ট্রি কী।2 কাজে আগে ধরার বিষয় প্রথম দুটো।
একটা জরুরি স্পেসিফিকেশন আছে। ব্যবহারকারী স্টোরের প্রতিটি লজিক্যাল স্টোর «ব্যক্তিগত» ছাড়া কম্পিউটার স্টোরের একই নামের স্টোরের বিষয়বস্তু উত্তরাধিকার করে দেখায়।1 যেমন কম্পিউটার স্টোরের «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে অফিসের CA সার্টিফিকেট রাখলে সব ব্যবহারকারীর «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তেও সেই সার্টিফিকেট দেখা যায়। উল্টো কথা, «ব্যক্তিগত» স্টোরই উত্তরাধিকার হয় না, তাই ক্লায়েন্ট সার্টিফিকেট (=ব্যক্তিগত স্টোরে রাখা জিনিস) «কার কাছে দেখা দরকার» নিজে স্থির করতে হয়। এই অসাম্য এই নিবন্ধের মূল চরিত্র।
flowchart TB
accTitle: কম্পিউটার স্টোর ও ব্যবহারকারী স্টোর
accDescr: কম্পিউটার স্টোর PC-তে একটা ও সব ব্যবহারকারী ও সার্ভিসের সাধারণ, ব্যবহারকারী স্টোর অ্যাকাউন্টে অ্যাকাউন্টে আলাদা ও ব্যক্তিগত ছাড়া কম্পিউটার পাশ থেকে উত্তরাধিকার করে দেখায়
subgraph LM["কম্পিউটার (LocalMachine)<br/>PC-তে একটা·সব ব্যবহারকারী ও সার্ভিসের সাধারণ"]
LMMY["ব্যক্তিগত (My)"]
LMROOT["বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি (Root)"]
LMCA["মধ্যবর্তী সার্টিফিকেশন অথরিটি (CA)"]
LMTP["বিশ্বস্ত প্রকাশক (TrustedPublisher)"]
end
subgraph CU["ব্যবহারকারী (CurrentUser)<br/>অ্যাকাউন্টে অ্যাকাউন্টে আলাদা"]
CUMY["ব্যক্তিগত (My)<br/>※উত্তরাধিকার হয় না=নিজে রাখার জায়গা স্থির করুন"]
CUROOT["বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি (Root)"]
CUCA["মধ্যবর্তী সার্টিফিকেশন অথরিটি (CA)"]
CUTP["বিশ্বস্ত প্রকাশক (TrustedPublisher)"]
end
LMROOT -.->|"বিষয়বস্তু উত্তরাধিকার করে দেখা যায়"| CUROOT
LMCA -.->|"উত্তরাধিকার"| CUCA
LMTP -.->|"উত্তরাধিকার"| CUTP
চিত্র 1: ব্যবহারকারী স্টোর ব্যক্তিগত ছাড়া কম্পিউটার স্টোরের বিষয়বস্তু উত্তরাধিকার করে দেখায়; ক্লায়েন্ট সার্টিফিকেট রাখার জায়গা নিজে স্থির করতে হয়।
2.2. প্রধান লজিক্যাল স্টোর
প্রতি জায়গার ভিতর ভূমিকা অনুযায়ী লজিক্যাল স্টোরে ভাগ। certmgr.msc / certlm.msc-তে দেখা ফোল্ডার সেগুলো, PowerShell বা কমান্ড থেকে দেখলে ইংরেজি অভ্যন্তরীণ নাম ব্যবহার হয়।24
| প্রদর্শন নাম | অভ্যন্তরীণ নাম | কী রাখার জায়গা |
|---|---|---|
| ব্যক্তিগত | My | নিজে (এই PC·এই ব্যবহারকারী) ব্যবহার করা সার্টিফিকেট। ক্লায়েন্ট সার্টিফিকেট·সার্ভার সার্টিফিকেট এখানে। প্রাইভেট কী-এর সাথে যুক্তও এখানে |
| বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি | Root | বিশ্বাসের শুরু রুট CA সার্টিফিকেট। এখানে রাখা CA-এর নিচে «বিশ্বস্ত» হয় |
| মধ্যবর্তী সার্টিফিকেশন অথরিটি | CA | রুট ও প্রান্তের মাঝে যোগ করা মধ্যবর্তী CA সার্টিফিকেট। চেইন গড়ার উপাদান |
| বিশ্বস্ত প্রকাশক | TrustedPublisher | স্বাক্ষরিত সফটওয়্যারের প্রকাশক হিসেবে বিশ্বাস করা সার্টিফিকেট (৮ অধ্যায়) |
2.3. তিন খোলা জানালা — certmgr.msc / certlm.msc / Cert: ড্রাইভ
একই স্টোর দেখার উপায় তিনটা।34
- certmgr.msc: বর্তমান ব্যবহারকারীর স্টোর খোলা ব্যবস্থাপনা কনসোল।
- certlm.msc: লোকাল কম্পিউটারের স্টোর খোলা ব্যবস্থাপনা কনসোল।
- PowerShell-এর
Cert:ড্রাইভ:Cert:\CurrentUser\...ওCert:\LocalMachine\...স্তরে স্টোর ফাইলসিস্টেমের মতো চালানো যায়। সার্টিফিকেট থাম্বপ্রিন্টে শনাক্ত হয়।
আর mmc.exe-তে সার্টিফিকেট স্ন্যাপ-ইন হাতে যোগ করলে «ব্যবহারকারী অ্যাকাউন্ট» «কম্পিউটার অ্যাকাউন্ট» «সার্ভিস অ্যাকাউন্ট» তিন ধরন থেকে লক্ষ্য বাছাই হয়। প্রশাসক নন এমন ব্যবহারকারী শুধু নিজের ব্যবহারকারী অ্যাকাউন্টের স্টোর পরিচালনা করতে পারেন।3
সমস্যা তদন্তের প্রথম পা «অ্যাপ কোন স্টোর দেখছে» আর «আমি কোন স্টোর দেখছি» মেলানো। certmgr.msc তাকিয়ে সার্ভিসের বিঘ্ন তদন্ত করলে দেখার জায়গা আলাদা, চিরকাল উত্তর আসে না।
3. কোনটিতে রাখবেন — প্রোগ্রামের চালু রূপ দিয়ে স্থির সিদ্ধান্ত সারণি
সিদ্ধান্তের মাপকাঠি একটা। সেই সার্টিফিকেট ব্যবহার করা প্রোগ্রাম কার অ্যাকাউন্টে চলে।
| চালু রূপ | চালু অ্যাকাউন্ট | রাখার স্টোর | টীকা |
|---|---|---|---|
| ইন্টারঅ্যাকটিভ ব্যবহারকারী চালু করা ডেস্কটপ অ্যাপ | সাইন-ইন ব্যবহারকারী নিজে | ব্যবহারকারী (Cert:\CurrentUser\My) | ব্যবহারকারীর অ্যাকাউন্টে অ্যাকাউন্টে বসাতে হয়। শেয়ার করা PC-তে একাধিক মানুষ ব্যবহার করলে কম্পিউটার স্টোরও ভাবা যায় |
| Windows সার্ভিস | LocalSystem / NETWORK SERVICE / নিবেদিত সার্ভিস অ্যাকাউন্ট | কম্পিউটার (Cert:\LocalMachine\My) | LocalSystem ছাড়া (NETWORK SERVICE·নিবেদিত অ্যাকাউন্ট ইত্যাদি) প্রাইভেট কী পড়ার অনুমতি আবশ্যক (৪ অধ্যায়)। LocalSystem ডিফল্ট SYSTEM অধিকারে পড়ে |
| IIS-এর ওয়েব অ্যাপ | অ্যাপ্লিকেশন পুলের ID | কম্পিউটার | উপরের মতো |
| টাস্ক শিডিউলারের মানবহীন চালনা (ব্যবহারকারী সাইন-ইন থাকুক বা না থাকুক চলে) | টাস্কে নির্দিষ্ট অ্যাকাউন্ট | কম্পিউটার সুপারিশকৃত | চালু অ্যাকাউন্টের ব্যবহারকারী স্টোরেও চালানো যায়, কিন্তু প্রোফাইল বা স্টোর দেখা যাচাই বাড়ে শুধু, সুবিধা কম |
| ব্রাউজারে ইলেকট্রনিক আবেদন·ওয়েব প্রমাণীকরণ | সাইন-ইন ব্যবহারকারী নিজে | ব্যবহারকারী | বিতরণ করা মানুষ ছাড়া কাউকে ব্যবহার না করানোর অর্থও স্বাভাবিক |
দ্বিধা হলে মানবহীন চলা জিনিস কম্পিউটার স্টোর, মানুষ চালান জিনিস ব্যবহারকারী স্টোর।
3.1. নিয়মিত দুর্ঘটনার ব্যবচ্ছেদ — «ডেভে চলল সার্ভিস করলে পাওয়া যায় না»
এই দুর্ঘটনা নিচের ধাপে সঠিক পুনরাবৃত্তি করা যায়।
- ডেভেলপার নিজের PC-তে pfx ডাবল ক্লিক করে ইমপোর্ট করেন। উইজার্ডের ডিফল্ট «বর্তমান ব্যবহারকারী», তাই সার্টিফিকেট ডেভেলপার অ্যাকাউন্টের ব্যবহারকারী স্টোরে যায়।
- ডেভ চলাকালীন অ্যাপ Visual Studio থেকে, অর্থাৎ ডেভেলপার অ্যাকাউন্টে চলে,
StoreLocation.CurrentUserখুললে সার্টিফিকেট পাওয়া যায়। চলে। - প্রোডাকশন সার্ভারে Windows সার্ভিস হিসেবে রেজিস্টার। সার্ভিস NETWORK SERVICE বা নিবেদিত অ্যাকাউন্টে চলে।
- সার্ভিসের কোড যে
CurrentUserখোলে সেটা সার্ভিস চালু অ্যাকাউন্টের ব্যবহারকারী স্টোর। সেখানে খালি। «সার্টিফিকেট পাওয়া যায় না»।
flowchart TB
accTitle: ডেভে চলল সার্ভিস করলে পাওয়া যায় না
accDescr: ডেভেলপারের ব্যবহারকারী স্টোরে রাখা সার্টিফিকেট আলাদা অ্যাকাউন্টে চলা সার্ভিসের CurrentUser থেকে দেখা যায় না
subgraph DEV["ডেভ মেশিন"]
D1["pfx ডাবল ক্লিক করে ইমপোর্ট<br/>উইজার্ডের ডিফল্ট «বর্তমান ব্যবহারকারী»"] --> D2["ডেভেলপার অ্যাকাউন্টের<br/>ব্যবহারকারী স্টোরে যায়"]
D2 --> D3["Visual Studio থেকে চালু<br/>=ডেভেলপার অ্যাকাউন্টে চলে"]
D3 --> D4["CurrentUser খুললে পাওয়া যায়<br/>→ চলে"]
end
subgraph PROD["প্রোডাকশন সার্ভার"]
P1["Windows সার্ভিস হিসেবে রেজিস্টার<br/>চালু অ্যাকাউন্ট NETWORK SERVICE ইত্যাদি"] --> P2["কোড যে CurrentUser খোলে সেটা<br/>সার্ভিস অ্যাকাউন্টের ব্যবহারকারী স্টোর"]
P2 --> P3["সেখানে খালি<br/>→«সার্টিফিকেট পাওয়া যায় না»"]
end
D4 -.->|"একই প্রোগ্রাম বসানো"| P1
চিত্র 2: ডেভেলপারের ব্যবহারকারী স্টোর ও সার্ভিস অ্যাকাউন্টের ব্যবহারকারী স্টোর আলাদা; ডেভে চলা প্রোডাকশনে পাওয়ার নিশ্চয়তা নয়।
বিন্দু, ব্যবহারকারী স্টোর «অ্যাকাউন্ট যত তত আছে»। প্রশাসক certmgr.msc খুলে «ঠিকই আছে তো?» নিশ্চিত করলেও সেটা প্রশাসক নিজের স্টোর, সার্ভিস অ্যাকাউন্টের স্টোর নয়। মোকাবিলা ক্ষণিকের কপি নয়, কম্পিউটার স্টোরে আবার রেখে কোডও StoreLocation.LocalMachine-এ মেলানো। আর পরের অধ্যায়ের অনুমতি দেওয়া পর্যন্ত একসেট।
4. প্রাইভেট কী ও অ্যাক্সেস অনুমতি — দ্বিতীয় নিয়মিত দুর্ঘটনা
4.1. সার্টিফিকেট ও প্রাইভেট কী আলাদা জিনিস
সার্টিফিকেট স্টোরের তালিকায় যা দেখা যায় সেটা সার্টিফিকেট (প্রকাশ্য তথ্য), প্রাইভেট কী নিজে নয়। ক্লায়েন্ট প্রমাণীকরণে আসলে যা লাগে প্রাইভেট কী দিয়ে স্বাক্ষর, তাই «তালিকায় দেখা» আর «ব্যবহার করা যায়» আলাদা সমস্যা। এটা মেশালে «সার্টিফিকেট আছে তবু TLS হ্যান্ডশেইক ব্যর্থ», «Access Denied পরিবারের অভ্যন্তরীণ ত্রুটি» — চেহারায় বোঝা কঠিন বিঘ্ন হয়।
4.2. pfx ইমপোর্টের বাস্তবতা — এক্সপোর্ট যোগ্য কি না সিদ্ধান্ত
সার্টিফিকেট ও প্রাইভেট কী জোড়া pfx (PKCS #12) ফাইলে হস্তান্তর হয়, Import-PfxCertificate দিয়ে স্টোরে নেওয়া যায়।6
$pwd = Get-Credential -UserName '(পাসওয়ার্ড নিচে লিখুন)' -Message 'PFX-এর পাসওয়ার্ড'
Import-PfxCertificate -FilePath C:\certs\client.pfx `
-CertStoreLocation Cert:\LocalMachine\My -Password $pwd.Password
এখানে জরুরি, -Exportable না দিলে নেওয়া প্রাইভেট কী আবার এক্সপোর্ট করা যায় না — এই ডিফল্ট আচরণ।6 «পরে মাইগ্রেশনের জন্য» বলে যা খুশি এক্সপোর্ট যোগ্য করে রাখা প্রাইভেট কী বের করে নেওয়ার পথ একটা বাড়ানো। মূল pfx নিরাপদে রাখার পরিচালনা করে স্টোরের প্রাইভেট কী এক্সপোর্ট অযোগ্যই মূল — এটা আমাদের সুপারিশ। আর মূল pfx ও তার পাসওয়ার্ড রাখাই সাধারণ লেখায় ফেলে রাখা সহজ। চিন্তা «Windows অ্যাপে গোপন তথ্য রাখা — DPAPI দিয়ে সাধারণ লেখা সেটিং এড়ান» ও «PowerShell-এ শংসাপত্র নিরাপদে সামলানো»-এ সাজানো।
4.3. সার্ভিস অ্যাকাউন্টে প্রাইভেট কী অনুমতি দেওয়া
কম্পিউটার স্টোরে রাখা সার্টিফিকেটের প্রাইভেট কী ডিফল্টে প্রশাসক ও SYSTEM ছাড়া পড়া যায় না এমন কনফিগই সাধারণ। তাই LocalSystem-এ চলা সার্ভিস ডিফল্টেই প্রাইভেট কী পড়ে, NETWORK SERVICE·নিবেদিত সার্ভিস অ্যাকাউন্ট·IIS অ্যাপ পুল ID ইত্যাদি অন্য অ্যাকাউন্টে চালালে চালু অ্যাকাউন্টে স্পষ্ট পড়ার অনুমতি দিতে হয়। ধাপ সার্টিফিকেট স্ন্যাপ-ইনের UI থেকে করা যায়।5
- certlm.msc (অথবা কম্পিউটার অ্যাকাউন্ট লক্ষ্য সার্টিফিকেট স্ন্যাপ-ইন) খুলুন।
- «ব্যক্তিগত»→«সার্টিফিকেট»-এ লক্ষ্য সার্টিফিকেট রাইট ক্লিক করে «সব টাস্ক» থেকে «প্রাইভেট কী ব্যবস্থাপনা» খুলুন।
- «নিরাপত্তা» ট্যাবে চালু অ্যাকাউন্ট (NETWORK SERVICE, নিবেদিত সার্ভিস অ্যাকাউন্ট, IIS অ্যাপ পুল ID ইত্যাদি) যোগ করে «পড়া» অনুমতি দিন।5
ফুল কন্ট্রোল লাগে না। স্বাক্ষরে ব্যবহার করলে পড়াই যথেষ্ট। উল্টোদিকে চলে না বলে Everyone-এ ফুল কন্ট্রোল দেওয়া প্রাইভেট কীকে সাধারণ লেখা পাসওয়ার্ডের মতো নামিয়ে আনা কাজ, একেবারে এড়াবেন। কম্পিউটার স্টোরে রাখা ও প্রাইভেট কী-এর অনুমতি দেওয়া সবসময় একসেট — এটা নির্দেশিকায় লিখে রাখলেই এই ধারার দুর্ঘটনা মরে।
5. মেয়াদ শেষের দুর্ঘটনা ঠেকান — তালিকা·বদলানো·খাতা
5.1. PowerShell দিয়ে তালিকা
সার্টিফিকেটের বৈধ মেয়াদ NotAfter প্রপার্টিতে থাকে। Cert: ড্রাইভে Get-ChildItem দিয়ে যান্ত্রিক তালিকা করা যায়।4
# কম্পিউটার স্টোরের «ব্যক্তিগত» মেয়াদ অনুযায়ী তালিকা
Get-ChildItem Cert:\LocalMachine\My |
Sort-Object NotAfter |
Format-Table Thumbprint, Subject, NotAfter
# ৬০ দিনের মধ্যে মেয়াদ কাটে এমন শুধু বের করুন (0 দিলে মেয়াদ কাটা)
Get-ChildItem -Path Cert:\LocalMachine\My -ExpiringInDays 60
-ExpiringInDays «নির্দিষ্ট দিনের মধ্যে মেয়াদ কাটে এমন সার্টিফিকেট» ফেরানো প্যারামিটার, 0 হলে মেয়াদ কাটা সার্টিফিকেট ওঠে।4 এটা মাসিক শিডিউলড টাস্ক করে সব সার্ভার ঘুরিয়ে ফল মেইল বা খাতায় জমা — শুধু তাতেই «মেয়াদ কেটে সোমবার সকাল থেকে যোগ্যতা নিশ্চিতকরণ পাস করে না» ধরনের দুর্ঘটনা প্রায় ঠেকে।
5.2. বদলানোর ধাপ — পুরনো-নতুন পাশাপাশি সময় ও থাম্বপ্রিন্টের ফাঁদ
সার্টিফিকেট হালনাগাদ «মুছে রাখা» নয় «যোগ করে তারপর স্যুইচ, নিশ্চিত করে তারপর মুছা»।
- নতুন সার্টিফিকেট (pfx) একই স্টোরে ইমপোর্ট করুন। থাম্বপ্রিন্ট আলাদা, তাই পুরনো-নতুন একই স্টোরে পাশাপাশি থাকতে পারে।
- নতুন সার্টিফিকেটের প্রাইভেট কী অনুমতি দিন (৪ অধ্যায়)। হালনাগাদে সহজে ভোলা এখানে। অনুমতি সার্টিফিকেটের প্রাইভেট কী প্রতি লাগে, সার্টিফিকেট বদলালে দেওয়াও আবার।
- প্রতিপক্ষ সিস্টেমে জানানো (সার্টিফিকেট আগে নিবন্ধন লাগে এমন API হলে) পুরনো সার্টিফিকেট দিয়ে পরিচালনা চালিয়ে আগে শেষ করে পুরনো-নতুন দুইই গ্রহণ হয় এমন পাশাপাশি সময় নিশ্চিত করুন। স্যুইচ আগে করলে প্রতিপক্ষ নতুন সার্টিফিকেট প্রত্যাখ্যান করে প্রোডাকশন যোগাযোগ থামে।
- অ্যাপের কনফিগ নতুন সার্টিফিকেটে স্যুইচ করে কাজ নিশ্চিত করুন।
- যথেষ্ট সময়ের পর পুরনো সার্টিফিকেট মুছুন।
flowchart LR
accTitle: সার্টিফিকেট হালনাগাদ যোগ করে তারপর স্যুইচ
accDescr: নতুন pfx একই স্টোরে রেখে অনুমতি দিয়ে প্রতিপক্ষে আগে নিবন্ধন করে থাম্বপ্রিন্ট স্যুইচ করুন, পাশাপাশি সময়ের পর পুরনো সার্টিফিকেট মুছুন
I["1. নতুন pfx একই স্টোরে<br/>ইমপোর্ট (পুরনো-নতুন পাশাপাশি)"] --> P["2. নতুন সার্টিফিকেটের<br/>প্রাইভেট কী অনুমতি দিন"]
P --> R["3. প্রতিপক্ষে আগে নিবন্ধন<br/>(পুরনো সার্টিফিকেট রেখে পরিচালনা চালান)"]
R --> SW["4. কনফিগের থাম্বপ্রিন্ট বদলে<br/>স্যুইচ·কাজ নিশ্চিত"]
SW --> DEL["5. পাশাপাশি সময়ের পর<br/>পুরনো সার্টিফিকেট মুছুন"]
চিত্র 3: সার্টিফিকেট হালনাগাদ যোগ → অনুমতি → আগে নিবন্ধন → কনফিগ বদল → পুরনো মুছা ক্রম; থাম্বপ্রিন্ট হালনাগাদ ভুলবেন না।
তখন সবচেয়ে বড় ফাঁদ কনফিগ ফাইল বা কোডে লেখা থাম্বপ্রিন্ট। থাম্বপ্রিন্ট সার্টিফিকেটে সার্টিফিকেটে অনন্য, হালনাগাদ করলে সবসময় বদলায়। কোথাও এক জায়গায় পুরনো থাম্বপ্রিন্ট রেফারেন্স থাকলে «সার্টিফিকেট হালনাগাদ করলাম তবু সংযোগ হয় না» জন্মায়। থাম্বপ্রিন্ট কোথায় লেখা (অ্যাপ কনফিগ, IIS বাইন্ডিং, স্ক্রিপ্ট, প্রতিপক্ষে জানানো) খাতায় রাখাই নিশ্চিত।
5.3. সার্টিফিকেট খাতার সুপারিশ
খাতা বলে Excel এক পাতাই প্রথমে যথেষ্ট। ন্যূনতম ব্যবহার/প্রকাশক/সাবজেক্ট/থাম্বপ্রিন্ট/যেখানে আছে (সার্ভার নাম+স্টোর)/প্রাইভেট কী অনুমতি থাকা অ্যাকাউন্ট/বৈধ মেয়াদ/হালনাগাদ ধাপের লিঙ্ক/দায়িত্বপ্রাপ্ত কলাম বানিয়ে ৫.১-এর তালিকার ফলের সাথে মিলান। সার্টিফিকেট দুর্ঘটনার আসল চেহারা প্রযুক্তির সমস্যা নয় «কারোর কাছে তালিকা নেই» সমস্যা, তাই খাতাই সবচেয়ে কাজ করে।
6. যাচাই ও ব্যর্থতা পড়া — চেইন ও রুট বিতরণ
6.1. চেইন যাচাইয়ের মূল ও certutil
«এই সার্টিফিকেট বিশ্বস্ত নয়» পরিবারের ত্রুটি প্রান্তের সার্টিফিকেট থেকে রুট CA পর্যন্ত চেইন (প্রমাণের পথ) কোথাও কাটা অবস্থা। ছাঁটাইতে certutil সুবিধাজনক।7
flowchart TB
accTitle: চেইন যাচাই কাটার তিন নিয়মিত কারণ
accDescr: মধ্যবর্তী CA পাওয়া যায় না, রুট বিতরণ হয়নি, প্রান্তের মেয়াদ শেষ — কোনো একটায় বিশ্বস্ত নয় ত্রুটি হয়
LEAF["প্রান্তের সার্টিফিকেট<br/>(ক্লায়েন্ট সার্টিফিকেট·সার্ভার সার্টিফিকেট)"] --> INT["মধ্যবর্তী CA সার্টিফিকেট<br/>জায়গা: মধ্যবর্তী সার্টিফিকেশন অথরিটি (CA) স্টোর"]
INT --> ROOT["রুট CA সার্টিফিকেট<br/>জায়গা: বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি (Root)"]
INT -.->|"পাওয়া যায় না<br/>(উপস্থাপন·AIA·স্টোর কোনোটাই)"| E1["চেইন গড়া যায় না<br/>(নিয়মিত কারণ ১)"]
ROOT -.->|"বিতরণ হয়নি"| E2["«বিশ্বস্ত নয়» ত্রুটি<br/>(নিয়মিত কারণ ২)"]
LEAF -.->|"মেয়াদ শেষ"| E3["বৈধ সময়ের ত্রুটি<br/>(নিয়মিত কারণ ৩)"]
চিত্র 4: চেইন মধ্যবর্তী CA বা রুট না পাওয়ায়, অথবা মেয়াদে কাটে; certutil দিয়ে স্তর স্থির করুন।
:: সার্টিফিকেট ফাইলের চেইন গড়ে যাচাই করুন (প্রত্যাহার নিশ্চিতকরণের URL আনাসহ)
certutil -urlfetch -verify client.cer
:: লক্ষ্য অ্যাপ ব্যবহারকারী স্টোর ব্যবহার করলে -user দিয়ে একই প্রসঙ্গে যাচাই করুন
certutil -user -urlfetch -verify client.cer
:: স্টোরের ভিতর ডাম্প করুন (-user দিলে ব্যবহারকারী স্টোর)
certutil -store My
certutil -user -store My
certutil -verify সার্টিফিকেট·CRL·চেইন যাচাই করে, CACertFile না দিলে পূর্ণ চেইন গড়ে যাচাই করে।7 আউটপুট লম্বা, কিন্তু কোন স্তরে বিশ্বাস কাটে, প্রত্যাহার তথ্য পাওয়া গেছে কি না পড়া যায়। নিয়মিত কারণ (1) মধ্যবর্তী CA সার্টিফিকেট পাওয়া যায় না (TLS প্রতিপক্ষ পাঠায় না, সার্টিফিকেটের AIA তথ্য থেকেও আনা যায় না, «মধ্যবর্তী সার্টিফিকেশন অথরিটি» স্টোরেও নেই), (2) অফিসের CA-এর রুট «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে বিতরণ হয়নি, (3) সার্টিফিকেট নিজের মেয়াদ শেষ — এই তিনটা। মধ্যবর্তী CA প্রতিপক্ষের উপস্থাপন বা AIA দিয়ে স্বয়ংক্রিয় আনাতেও সারে, তাই স্টোরে রাখা «নিশ্চিত করার উপায়গুলোর একটা» ভাবুন।
6.2. অফিসের CA·স্ব-স্বাক্ষরিত রুট বিতরণ GPO/Intune দিয়ে
অফিসের CA বা যাচাইয়ের স্ব-স্বাক্ষরিত সার্টিফিকেট ব্যবহার করলে সেই রুট সার্টিফিকেট প্রতিটি PC-তে বিতরণ করতে হয়। এক মেশিনে হাতে রাখা নয়, বিতরণের ব্যবস্থায় তুলুন।
- Active Directory পরিবেশ (GPO): গ্রুপ পলিসির
কম্পিউটারের কনফিগারেশন\পলিসি\Windows সেটিং\নিরাপত্তা সেটিং\পাবলিক কী পলিসিএর «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে সার্টিফিকেট ইমপোর্ট করলে লক্ষ্য PC-তে বিতরণ হয়।8 - Intune পরিচালিত পরিবেশ: «বিশ্বস্ত সার্টিফিকেট» প্রোফাইল দিয়ে রুট/মধ্যবর্তী CA সার্টিফিকেট বিতরণ। Windows-এ বিতরণের স্টোর (কম্পিউটারের রুট/মধ্যবর্তী, ব্যবহারকারীর মধ্যবর্তী) বাছাই যায়।9
২.১-এ বলা মতো কম্পিউটার স্টোরের রুটে রাখলে সব ব্যবহারকারী থেকে বিশ্বস্ত হয়।1 তাই উল্টো ঝুঁকিও সামনে রাখুন। স্ব-স্বাক্ষরিত সার্টিফিকেট «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে রাখার পরিচালনা সেই PC-তে নতুন বিশ্বাসের শুরু রোপণ। সেই প্রাইভেট কী ফাঁস হলে যেকোনো সাইট বা সফটওয়্যারের ছদ্মবেশে সার্টিফিকেট ইস্যুর ভিত্তি হয়ে যায়। স্থায়ী পরিচালনায় প্রাইভেট কী যথাযথ সুরক্ষিত অফিসের CA তুলুন, অথবা পাবলিক CA সার্টিফিকেটে সরান, স্ব-স্বাক্ষরিত রুট «যাচাই পরিবেশ সীমিত·মেয়াদ কেটে» নীতি।
7. ডেভেলপারের দৃষ্টি — .NET থেকে স্টোর সঠিক ব্যবহার
7.1. X509Store দিয়ে থাম্বপ্রিন্ট খোঁজা
.NET থেকে X509Store দিয়ে স্টোর খুলে Find দিয়ে সার্টিফিকেট আনা হয়।1011
using System.Security.Cryptography.X509Certificates;
static X509Certificate2 GetClientCertificate(string thumbprint)
{
using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var found = store.Certificates.Find(
X509FindType.FindByThumbprint, thumbprint, validOnly: true);
if (found.Count == 0)
throw new InvalidOperationException(
$"সার্টিফিকেট পাওয়া যায় না: থাম্বপ্রিন্ট={thumbprint}, " +
$"জায়গা={store.Location}\\{store.Name}");
var cert = found[0];
if (!cert.HasPrivateKey)
throw new InvalidOperationException(
$"সার্টিফিকেট আছে কিন্তু প্রাইভেট কী যুক্ত নয় (.cer থেকে" +
$"ইমপোর্ট ইত্যাদি): থাম্বপ্রিন্ট={thumbprint}, জায়গা={store.Location}\\{store.Name}");
return cert;
}
৩ অধ্যায়ের সিদ্ধান্ত এখানে সরাসরি লাগে। সার্ভিসে চলা কোড হলে StoreLocation.LocalMachine, ইন্টারঅ্যাকটিভ অ্যাপ হলে StoreLocation.CurrentUser। আরও একটা, Find-এর তৃতীয় আর্গুমেন্ট validOnly খেয়াল রাখুন। true যাচাই পাস করা বৈধ সার্টিফিকেটই ফেরায়।11 মেয়াদ কাটা সার্টিফিকেট না ধরার বীমা হয় অন্যদিকে চেইন অবিশ্বস্ত পরীক্ষার স্ব-স্বাক্ষরিত সার্টিফিকেটও «পাওয়া যায় না» পাশে পড়ে, তাই «আছে তবু পাওয়া যায় না» হলে এখানেও সন্দেহ করুন। আর না পাওয়ার ত্রুটি বার্তায় উপরের উদাহরণের মতো কোন স্টোর খুঁজেছে অবশ্যই রাখুন। ৩ অধ্যায়ের দুর্ঘটনার তদন্ত সময় অঙ্কে বদলায়।
7.2. HttpClient-এ ক্লায়েন্ট সার্টিফিকেট রাখা
নেওয়া সার্টিফিকেট HttpClientHandler.ClientCertificates-এ যোগ করে সার্ভারে উপস্থাপন হয়। এই কালেকশনই সার্টিফিকেট-ভিত্তিক ক্লায়েন্ট প্রমাণীকরণে সার্ভারে উপস্থাপিত সার্টিফিকেটের সেট।12
var handler = new HttpClientHandler();
handler.ClientCertificates.Add(GetClientCertificate(thumbprint));
var client = new HttpClient(handler);
// তারপর সাধারণ HttpClient হিসেবে ব্যবহার করুন
আর .NET Core পরিবারে সার্টিফিকেটে কী ব্যবহার (Key Usage) অ্যাট্রিবিউট থাকলে «Digital Signature» না থাকলে অনুরোধ পাঠানোয় ব্যবহার হয় না নথিতে স্পষ্ট।12 ক্লায়েন্ট সার্টিফিকেট ইস্যুর অনুরোধের অবস্থানে এলে ব্যবহার (ক্লায়েন্ট প্রমাণীকরণ) সঠিক করে জানান। আর HttpClient তৈরির প্যাটার্ন ভুল হলে সকেট শেষ বা DNS অনুসরণের সমস্যা হয়। হ্যান্ডলারসহ দীর্ঘজীবী নকশা «HttpClient using দিয়ে ঘিরবেন না»-এ যেমন আছে।
7.3. হার্ডকোড করা থাম্বপ্রিন্ট বদলালে মরে যাওয়ার সমস্যা
থাম্বপ্রিন্ট খোঁজা নিশ্চিত, কিন্তু থাম্বপ্রিন্ট কোডে পুঁতলে সার্টিফিকেট হালনাগাদের বার বিল্ড ও রিলিজ লাগে। নকশায় মোকাবিলা নিচের তিন স্তর।
- ন্যূনতম: থাম্বপ্রিন্ট কনফিগ ফাইলে (appsettings ইত্যাদি) বাইরে রেখে রিলিজ ছাড়াই বদলানো যায় করুন। কনফিগের জায়গা ৫.৩-এর খাতায় তুলুন।
- এক পা এগোন: সাবজেক্ট নাম বা প্রকাশক দিয়ে খুঁজে
validOnly: trueমিলিয়ে «সেই নামে এখন বৈধগুলোর মধ্যেNotAfterসবচেয়ে দূরে» বাছুন। পুরনো-নতুন পাশাপাশি সময়ে নতুন সার্টিফিকেটে স্বয়ংক্রিয় সরে যায়। তবে একই নামের অনিচ্ছাকৃত সার্টিফিকেট ধরার ঝুঁকি আছে, তাই প্রকাশক নিশ্চিত ও লগ আউটপুট সেট করুন। আর এই স্বয়ংক্রিয় সরা দাঁড়ায় প্রতিপক্ষ সার্টিফিকেট আগে নিবন্ধন চায় না এমন ক্ষেত্রেই। আগে নিবন্ধন লাগে এমন API (৫.২)-এ ইমপোর্ট করা মাত্র নিবন্ধনহীন সার্টিফিকেটে নিজে থেকে সরে যোগাযোগ থামতে পারে, তাই নিবন্ধন শেষ নিশ্চিত করে তারপর স্যুইচ করা কনফিগ বাইরে রাখার ধরনেই থাকুন। - পরিচালনায় বেঁধে দিন: যে ধরনই হোক চালুতে «কোন সার্টিফিকেট (থাম্বপ্রিন্ট·মেয়াদ) বেছেছে» লগে রাখুন। বিঘ্ন তদন্তেও খাতা মেলাতেও এই এক লাইন কাজ করে।
8. কোড স্বাক্ষর সার্টিফিকেটের সাথে সম্পর্ক — «বিশ্বস্ত প্রকাশক» স্টোর
এ পর্যন্ত যা সামলানো যোগাযোগ (TLS)-এর সার্টিফিকেট, কিন্তু সার্টিফিকেট স্টোরে আরও এক জগৎ — কোড স্বাক্ষর — একসাথে থাকে। ২.২ সারণির «বিশ্বস্ত প্রকাশক (TrustedPublisher)» স্টোর সেই সংযোগ, স্বাক্ষরিত সফটওয়্যারের প্রকাশক সার্টিফিকেট বিশ্বস্ত হিসেবে নিবন্ধনের জায়গা। ব্যবহারকারী·কম্পিউটার দুই জায়গায় আছে10, অফিসে বিতরণ অ্যাপের প্রকাশক GPO দিয়ে প্রতিটি PC-এর TrustedPublisher-এ বিতরণ — এমন পরিচালনায় ব্যবহার হয়।
অ্যাপ «বিতরণ করা পাশে» কোড স্বাক্ষর বা SmartScreen সতর্কতা («Windows এই PC সুরক্ষা করেছে»)-এর মোকাবিলা দরকার হলে আলাদা নিবন্ধ «Windows-এ «Windows এই PC সুরক্ষা করেছে» কেন ওঠে»-এ আছে। এই নিবন্ধের জ্ঞান (স্টোরের দুই ধারা, রুট বিতরণ) সরাসরি পূর্বজ্ঞান হিসেবে ব্যবহার করা যায়।
9. সারসংক্ষেপ
- সার্টিফিকেট স্টোর ব্যবহারকারী (CurrentUser) ও কম্পিউটার (LocalMachine) দুই ধারা। certmgr.msc / certlm.msc /
Cert:ড্রাইভ একই জিনিস দেখার তিন জানালা। তদন্তের প্রথম পা «কোন স্টোরের কথা» মেলানো। - রাখার জায়গা «প্রোগ্রাম কার হিসেবে চলে» দিয়ে স্থির। মানবহীন চালনা (সার্ভিস·IIS·টাস্ক) কম্পিউটার স্টোর, ইন্টারঅ্যাকটিভ অ্যাপ ব্যবহারকারী স্টোর নীতি।
- «ডেভে চলল প্রোডাকশনে পাওয়া যায় না» ডেভেলপারের ব্যবহারকারী স্টোর ও সার্ভিস অ্যাকাউন্টের ব্যবহারকারী স্টোর আলাদা জিনিস হওয়ার কারণ। কম্পিউটার স্টোর+
StoreLocation.LocalMachineমিলিয়ে সারে। - কম্পিউটার স্টোরে রাখা ও «প্রাইভেট কী ব্যবস্থাপনা» দিয়ে পড়ার অনুমতি দেওয়া একসেট। হালনাগাদে আবার দেওয়াও ভুলবেন না।
- pfx ইমপোর্ট ডিফল্টে এক্সপোর্ট অযোগ্য।
-Exportableআসলে দরকার হলেই। মূল pfx ও পাসওয়ার্ড রাখাও নকশায় রাখুন। - মেয়াদ শেষ
Get-ChildItem Cert: ... -ExpiringInDays-এর নিয়মিত তালিকা ও সার্টিফিকেট খাতায় ঠেকান। বদলানো «যোগ→স্যুইচ→নিশ্চিত→মুছা» ক্রমে, কনফিগের থাম্বপ্রিন্ট হালনাগাদ ফাঁক খেয়াল রাখুন। - চেইন ছাঁটাই
certutil -urlfetch -verify। অফিসের CA-এর রুট GPO/Intune দিয়ে বিতরণ করুন, স্ব-স্বাক্ষরিত রুটে রাখার পরিচালনা যাচাই পরিবেশ সীমিত·মেয়াদসহ। - কোডে থাম্বপ্রিন্ট কনফিগে বাইরে রেখে বেছে নেওয়া সার্টিফিকেট লগে রাখুন। শুধু তাতেই সার্টিফিকেটজনিত বিঘ্ন মোকাবিলা চেহারা বদলায়।
সম্পর্কিত নিবন্ধ
- Windows-এ «Windows এই PC সুরক্ষা করেছে» কেন ওঠে
- Windows অ্যাপে গোপন তথ্য রাখা — DPAPI দিয়ে সাধারণ লেখা সেটিং এড়ান
- PowerShell-এ শংসাপত্র নিরাপদে সামলানো — সাধারণ লেখা পাসওয়ার্ড স্ক্রিপ্ট থেকে সরান
- HttpClient using দিয়ে ঘিরবেন না — C# ব্যবসায়িক অ্যাপের HTTP যোগাযোগের বাস্তবতা
- মাইনাম্বর ইনস্যুরেন্স কার্ড ছোঁয়ালে কী হয় — অনলাইন যোগ্যতা নিশ্চিতকরণ ও রেসেকন ইন্টিগ্রেশন ORCA সোর্স থেকে পড়া
সম্পর্কিত পরামর্শ ক্ষেত্র
KomuraSoft LLC ক্লায়েন্ট সার্টিফিকেটসহ Web API ইন্টিগ্রেশন (ব্যাংক পরিবারের API, অনলাইন যোগ্যতা নিশ্চিতকরণ ইত্যাদি) বসানো ব্যবসায়িক অ্যাপ ডেভেলপমেন্ট, «সার্টিফিকেট পাওয়া যায় না» «হালনাগাদ করলে সংযোগ হয় না» ধরনের বিঘ্ন তদন্ত, সার্টিফিকেট বদলানোর ধাপ সাজানো সামলায়। স্টোরের কোথায় দেখবেন বোঝা যায় না — সেই পর্যায়ের পরামর্শই যথেষ্ট।
তথ্যসূত্র
-
Microsoft Learn, Local Machine and Current User Certificate Stores. কম্পিউটারের সার্টিফিকেট স্টোর PC-এর প্রতি লোকাল ও সব ব্যবহারকারীর সাধারণ, HKEY_LOCAL_MACHINE-এর নিচে; ব্যবহারকারীর সার্টিফিকেট স্টোর ব্যবহারকারী অ্যাকাউন্টে অ্যাকাউন্টে, HKEY_CURRENT_USER-এর নিচে; ব্যবহারকারী স্টোর «ব্যক্তিগত» স্টোর ছাড়া কম্পিউটার স্টোরের বিষয়বস্তু উত্তরাধিকার করে (কম্পিউটারের «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে যোগ করা সার্টিফিকেট প্রতিটি ব্যবহারকারীর একই স্টোরেও দেখা যায়) — এসব বিষয়ে। ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, System Store Locations. CERT_SYSTEM_STORE_CURRENT_USER / CERT_SYSTEM_STORE_LOCAL_MACHINE-এর রেজিস্ট্রি অবস্থান (যথাক্রমে HKEY_CURRENT_USER / HKEY_LOCAL_MACHINE-এর Software\Microsoft\SystemCertificates); সংজ্ঞায়িত লজিক্যাল স্টোর MY · Root · Trust · CA; সার্ভিস স্টোর সার্ভিস নাম অনুযায়ী রেজিস্ট্রি কীতে (Software\Microsoft\Cryptography\Services\ServiceName\SystemCertificates); গ্রুপ পলিসি বিতরণের স্টোর আলাদা আছে — এসব বিষয়ে। ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, How to: View certificates with the MMC snap-in. certlm.msc লোকাল ডিভাইস (লোকাল কম্পিউটার)-এর সার্টিফিকেট, certmgr.msc বর্তমান ব্যবহারকারীর সার্টিফিকেট পরিচালনার টুল; সার্টিফিকেট স্ন্যাপ-ইনের লক্ষ্য «কম্পিউটার অ্যাকাউন্ট» «ব্যবহারকারী অ্যাকাউন্ট» «সার্ভিস অ্যাকাউন্ট» তিন ধরন; প্রশাসক নন এমন ব্যবহারকারী শুধু নিজের ব্যবহারকারী অ্যাকাউন্টের সার্টিফিকেট পরিচালনা করতে পারেন — এসব বিষয়ে। ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, about_Certificate_Provider. PowerShell-এর Cert: ড্রাইভ CurrentUser ও LocalMachine দুই স্টোর জায়গা থাকা স্তর নেমস্পেস; Get-ChildItem দিয়ে স্টোর ও সার্টিফিকেট তালিকা; -ExpiringInDays প্যারামিটার নির্দিষ্ট দিনের মধ্যে মেয়াদ কাটে এমন সার্টিফিকেট (0-এ মেয়াদ কাটা) ফেরায়; -CodeSigningCert ইত্যাদি গতিশীল প্যারামিটার; NotAfter প্রপার্টিতে বৈধ মেয়াদ থাকে; সার্টিফিকেট থাম্বপ্রিন্টে শনাক্ত হয় — এসব বিষয়ে। ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, How to Modify Private Key Permissions to Support Management Server or Streaming Server. লোকাল কম্পিউটারের সার্টিফিকেট স্টোর লক্ষ্য সার্টিফিকেট স্ন্যাপ-ইনে «প্রাইভেট কী ব্যবস্থাপনা» (Manage Private Keys) খুলে «নিরাপত্তা» ট্যাবে সার্ভিসের চালু অ্যাকাউন্ট (উদাহরণ: Network Service)-এ «পড়া» অ্যাক্সেস অনুমতি যোগ করার ধাপ — এসব বিষয়ে। ↩ ↩2 ↩3
-
Microsoft Learn, Import-PfxCertificate. Import-PfxCertificate PFX ফাইল থেকে সার্টিফিকেট ও প্রাইভেট কী নির্দিষ্ট স্টোরে নেয়; -Exportable সুইচ না দিলে নেওয়া প্রাইভেট কী এক্সপোর্ট করা যায় না; -CertStoreLocation · -Password · -FilePath প্রতিটি প্যারামিটারের সিনট্যাক্স ও ব্যবহারের উদাহরণ — এসব বিষয়ে। ↩ ↩2 ↩3
-
Microsoft Learn, certutil. certutil -verify সার্টিফিকেট · CRL · সার্টিফিকেট চেইন যাচাই করে, CA সার্টিফিকেট ফাইল না দিলে পূর্ণ চেইন গড়ে যাচাই করে; -urlfetch অপশন ব্যবহার করা যায়; certutil -store সার্টিফিকেট স্টোর ডাম্প করে, -user অপশনে কম্পিউটার স্টোরের বদলে ব্যবহারকারী স্টোরে অ্যাক্সেস — এসব বিষয়ে। ↩ ↩2
-
Microsoft Learn, Distribute Certificates to Client Computers by Using Group Policy. গ্রুপ পলিসির «কম্পিউটারের কনফিগারেশন\পলিসি\Windows সেটিং\নিরাপত্তা সেটিং\পাবলিক কী পলিসি» এর নিচে «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি»তে সার্টিফিকেট ইমপোর্ট করে ডোমেইনের ক্লায়েন্ট কম্পিউটারে বিতরণের ধাপ ও দরকারি অনুমতি (Domain Admins / Enterprise Admins সমতুল্য) — এসব বিষয়ে। ↩
-
Microsoft Learn, Create trusted certificate profiles in Microsoft Intune. Intune-এর «বিশ্বস্ত সার্টিফিকেট» প্রোফাইল রুট বা মধ্যবর্তী CA সার্টিফিকেট পরিচালিত ডিভাইসে বিতরণ করে; SCEP/PKCS সার্টিফিকেট প্রোফাইলের পূর্বশর্ত হিসেবে রুট CA-তে বিশ্বাস স্থাপনে ব্যবহার হয়; Windows-এ বিতরণের স্টোর «কম্পিউটার সার্টিফিকেট স্টোর - রুট» «কম্পিউটার সার্টিফিকেট স্টোর - মধ্যবর্তী» «ব্যবহারকারী সার্টিফিকেট স্টোর - মধ্যবর্তী» বাছাই যায় — এসব বিষয়ে। ↩
-
Microsoft Learn, X509Store Class. X509Store StoreName ও StoreLocation (CurrentUser / LocalMachine) নির্দিষ্ট করে গড়া যায়, Open মেথড ও OpenFlags (ReadOnly, OpenExistingOnly ইত্যাদি) দিয়ে স্টোর খুলে Certificates প্রপার্টিতে সার্টিফিকেট কালেকশন আনা যায়; স্ট্যান্ডার্ড স্টোর নামে My · Root · CA · TrustedPublisher ইত্যাদি আছে, TrustedPublisher স্টোর CurrentUser · LocalMachine দুইতেই আছে — এসব বিষয়ে। ↩ ↩2
-
Microsoft Learn, X509Certificate2Collection.Find(X509FindType, Object, Boolean) Method. Find মেথড X509FindType (FindByThumbprint ইত্যাদি) ও খোঁজার মান দিয়ে সার্টিফিকেট খোঁজে; তৃতীয় আর্গুমেন্ট validOnly-এ true দিলে যাচাই পাস করা বৈধ সার্টিফিকেটই ফেরে — এসব বিষয়ে। ↩ ↩2
-
Microsoft Learn, HttpClientHandler.ClientCertificates Property. ClientCertificates প্রপার্টি সার্টিফিকেট-ভিত্তিক ক্লায়েন্ট প্রমাণীকরণে সার্ভারে উপস্থাপিত X509CertificateCollection; .NET Core-এ সার্টিফিকেটে কী ব্যবহার অ্যাট্রিবিউট থাকলে «Digital Signature» থাকতে হয় — এসব বিষয়ে। ↩ ↩2
সম্পর্কিত নিবন্ধ
কাছাকাছি বিষয়ে গভীরে যেতে একই ট্যাগযুক্ত সাম্প্রতিক নিবন্ধ।
Windows Firewall ও ব্যবসায়িক অ্যাপ — ইনবাউন্ড নিয়ম ইনস্টলার থেকে রেজিস্টার করুন
«ডেভ মেশিনে চলে, গ্রাহকের কাছে যোগাযোগ হয় না»-এর নিয়মিত কারণ Windows Firewall। ইনবাউন্ড ডিফল্ট ব্লক ও প্রোফাইল, নোটিফিকেশন ডায়ালগে প্র...
Windows নিরাপত্তা অডিট পলিসি ও ইভেন্ট লগ তদন্তের বাস্তব প্রয়োগ — 4625 পড়তে পারে এমন তথ্য-ব্যবস্থা দল
«সাইন-ইন ব্যর্থতার লগ দেখে দিন»-এর জবাব দেওয়ার বাস্তব নির্দেশিকা। মৌলিক ও বিস্তারিত অডিট পলিসির সম্পর্ক, ন্যূনতম চালু সাবক্যাটাগরি, ইভেন...
Windows LAPS-এর বাস্তব নির্দেশিকা — সব PC-তে ভাগ করা স্থানীয় প্রশাসক পাসওয়ার্ড ছাড়ুন
সব PC-তে একই স্থানীয় প্রশাসক পাসওয়ার্ড এক মেশিনের আক্রমণকে সব মেশিনে ছড়িয়ে দেওয়া Pass-the-Hash-এর উর্বর ভূমি। OS-এর স্ট্যান্ডার্ড Wi...
OneDrive "ফাইল অন-ডিমান্ড" ও ব্যবসায়িক অ্যাপ — প্লেসহোল্ডার যে অনুমান ভাঙে এবং কীভাবে মোকাবিলা করবেন
ডেস্কটপের CSV খোলে না, বা আমদানি "ফাইল পাওয়া যায়নি" দিয়ে ব্যর্থ হয় — কারণ হতে পারে OneDrive-এর Known Folder Move ও ফাইল অন-ডিমান্ড। এ...
ভলিউম শ্যাডো কপি (VSS)-এর কৌশল ও প্রয়োগ — ব্যবহারে থাকা ফাইলের ব্যাকআপ কেন নেওয়া যায়
ব্যবহারে থাকা ফাইল শেয়ারিং ভায়োলেশনে সাধারণত কপি হয় না, তবু ব্যাকআপ সফটওয়্যার কীভাবে নেয়? ভলিউম শ্যাডো কপি (VSS)-এর রিকোয়েস্টার, রা...
সম্পর্কিত বিষয়
এই পৃষ্ঠাগুলো বিষয়টিকে সেবা ও সিদ্ধান্তের বৃহত্তর প্রেক্ষাপটে স্থাপন করে।
Windows-এর প্রযুক্তিগত বিষয়
Windows ডেভেলপমেন্ট, বাগ তদন্ত ও বিদ্যমান সম্পদ ব্যবহারের প্রবেশদ্বার।
এই বিষয়ের সাথে সম্পর্কিত সেবা
নিবন্ধটি নিচের সেবাগুলোর সাথে সরাসরি সম্পর্কিত।
Windows অ্যাপ ডেভেলপমেন্ট
ব্যবসায়িক অ্যাপ, ডিভাইস ইন্টিগ্রেশন ও যোগাযোগ টুল, চাহিদা থেকে ডেভেলপমেন্ট পর্যন্ত।
প্রায়শ জিজ্ঞাসিত প্রশ্ন
এই নিবন্ধের বিষয়ে পরামর্শে প্রায়ই আসা প্রশ্ন।
- certmgr.msc আর certlm.msc-এর ফারাক কী?
- লক্ষ্য স্টোর আলাদা। certmgr.msc সাইন-ইন করা ব্যবহারকারীর সার্টিফিকেট স্টোর (বর্তমান ব্যবহারকারী, CurrentUser) খোলে, certlm.msc কম্পিউটারের সার্টিফিকেট স্টোর (লোকাল কম্পিউটার, LocalMachine) খোলে। কম্পিউটার স্টোর PC-এর সব ব্যবহারকারী ও সার্ভিসের সাধারণ, পরিচালনায় প্রশাসক অধিকার লাগে। প্রশাসক নন এমন ব্যবহারকারী শুধু নিজের ব্যবহারকারী স্টোর পরিচালনা করতে পারেন। দুটোর ভিতরই «ব্যক্তিগত» «বিশ্বস্ত রুট সার্টিফিকেশন অথরিটি» ইত্যাদি লজিক্যাল স্টোরে ভাগ, PowerShell থেকে Cert:\CurrentUser ও Cert:\LocalMachine হিসেবে একই কাঠামো দেখা যায়।
- ক্লায়েন্ট সার্টিফিকেট ব্যবহারকারী না কম্পিউটার কোন স্টোরে রাখব?
- সেই সার্টিফিকেট ব্যবহার করা প্রোগ্রাম «কার হিসেবে» চলে সেই অনুযায়ী স্থির করুন। ইন্টারঅ্যাকটিভ ব্যবহারকারী চালু করা ডেস্কটপ অ্যাপ হলে ব্যবহারকারী নিজের স্টোর (Cert:\CurrentUser\My) মূল পথ। Windows সার্ভিস·IIS অ্যাপ্লিকেশন পুল·টাস্ক শিডিউলারে মানবহীন চালনা হলে কম্পিউটার স্টোরে (Cert:\LocalMachine\My) রেখে চালু অ্যাকাউন্টে প্রাইভেট কী পড়ার অনুমতি দিন। ব্যবহারকারী স্টোর অ্যাকাউন্টে অ্যাকাউন্টে আলাদা, তাই ডেভেলপার নিজের ব্যবহারকারী স্টোরে রাখা সার্টিফিকেট আলাদা অ্যাকাউন্টে চলা সার্ভিস থেকে দেখা যায় না। এটাই «ডেভে চলল প্রোডাকশনে পাওয়া যায় না» দুর্ঘটনার নিয়মিত কারণ।
- Windows সার্ভিস থেকে সার্টিফিকেট পাওয়া যায় না·ব্যবহার করা যায় না — কী দেখব?
- নিশ্চিতকরণ দুই ধাপ। প্রথম «কোন স্টোর দেখছে»। কোড StoreLocation.CurrentUser খুললে সেটা সার্ভিস চালু অ্যাকাউন্টের ব্যবহারকারী স্টোর, প্রশাসক certmgr.msc-তে যে নিজের স্টোর দেখেন সেটা আলাদা জিনিস। সার্টিফিকেট কম্পিউটার স্টোরে সরিয়ে কোডও StoreLocation.LocalMachine-এ মেলান। দ্বিতীয় «প্রাইভেট কী পড়া যায় কি না»। সার্টিফিকেট তালিকায় দেখা আর প্রাইভেট কী ব্যবহার করা আলাদা, কম্পিউটার স্টোরের প্রাইভেট কী-তে ডিফল্টে প্রশাসক ও SYSTEM ছাড়া অ্যাক্সেস না থাকাই সাধারণ। certlm.msc-তে লক্ষ্য সার্টিফিকেট থেকে «প্রাইভেট কী ব্যবস্থাপনা» খুলে সার্ভিসের চালু অ্যাকাউন্ট (NETWORK SERVICE ইত্যাদি)-এ «পড়া» দিন।
- সার্টিফিকেটের মেয়াদ শেষ PowerShell দিয়ে আগে কীভাবে ধরব?
- Cert: ড্রাইভে Get-ChildItem দিয়ে তালিকা করা যায়। যেমন Get-ChildItem Cert:\LocalMachine\My | Sort-Object NotAfter | Format-Table Thumbprint, Subject, NotAfter দিয়ে কম্পিউটার স্টোরের ব্যক্তিগত স্টোর মেয়াদ অনুযায়ী তালিকা হয়। আর -ExpiringInDays প্যারামিটার দিয়ে «নির্দিষ্ট দিনের মধ্যে মেয়াদ কাটে এমন সার্টিফিকেট» শুধু বের করা যায়, 0 দিলে মেয়াদ কাটা সার্টিফিকেট ওঠে। এটা মাসিক সব সার্ভারে চালিয়ে ফল সার্টিফিকেট খাতার সাথে মিলিয়ে রাখলে «মেয়াদ কেটে সকাল থেকে সংযোগ হয় না» ধরনের দুর্ঘটনা প্রায় ঠেকে।