PKI-র সাথে পরিচিত অধিকাংশ Windows অ্যাডমিনিস্ট্রেটর MakeCert.exe টুল সম্পর্কে জানেন, যা সেলফ-সাইনড সার্টিফিকেট তৈরি করতে দেয়। এই টুল Microsoft .NET Framework SDK এবং Microsoft Windows SDK-র অংশ। আধুনিক Windows ভার্সনগুলোতে (Windows 10/8.1 এবং Windows Server 2019/2016/2012R2) আপনি বিল্ট-ইন PowerShell কমান্ডলেট New-SelfSignedCertificate ব্যবহার করে কোনো এডিশনাল টুল ছাড়া সেলফ-সাইনড সার্টিফিকেট তৈরি করতে পারেন।
New-SelfSignedCertificate PowerShell কমান্ডলেট ব্যবহার করে Self-Signed Certificate তৈরি করা
PowerShell-এ সেলফ-সাইনড সার্টিফিকেট তৈরি করতে New-SelfSignedCertificate কমান্ডলেট ব্যবহার করতে পারেন, যা PoSh PKI (Public Key Infrastructure) মডিউলের অংশ:
PKI মডিউলে উপলব্ধ সব কমান্ডলেট লিস্ট করতে কমান্ড চালান:
Get-Command -Module PKI

সেলফ-সাইনড সার্টিফিকেট টেস্টিং উদ্দেশ্যে বা ইন্টারনাল ইন্ট্রানেট সার্ভিসের (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess, ইত্যাদি) জন্য ব্যবহার করা সুপারিশ করা হয় যদি আপনি PKI/CA ইনফ্রাস্ট্রাকচার ডিপ্লয় করতে না পারেন বা এক্সটার্নাল প্রোভাইডার থেকে ট্রাস্টেড সার্টিফিকেট কেনতে না পারেন।
টিপ: ভুলবেন না যে আপনি সহজে Let's Encrypt থেকে ফ্রি SSL সার্টিফিকেট পেতে পারেন। এখানে Windows Server-এ IIS সাইটে Let's Encrypt SSL সার্টিফিকেট ইস্যু করে বাইন্ড করার উদাহরণ দেওয়া আছে।
সার্টিফিকেট তৈরি করতে আপনাকে –DnsName (সার্ভারের নাম, নাম मनমाना হতে পারে এবং localhost নাম থেকে আলাদা হতে পারে) এবং -CertStoreLocation (লোকাল সার্টিফিকেট স্টোর যেখানে জেনারেট করা সার্টিফিকেট রাখা হবে) এর মান স্পেসিফাই করতে হবে। এই কমান্ডলেট ব্যবহার করে Windows 10 (এই উদাহরণে), Windows 8.1 এবং Windows Server 2019/2016/2012 R2/2012-এ সেলফ-সাইনড সার্টিফিকেট তৈরি করা যায়।
DNS নাম test.contoso.com (FQDN নাম ব্যবহার করুন) এর জন্য নতুন SSL সার্টিফিকেট (ডিফল্ট SSLServerAuthentication টাইপ) তৈরি করে কম্পিউটারের পার্সোনাল সার্টিফিকেট লিস্টে রাখতে নিচের কমান্ড চালান:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\My

Directory: Microsoft.PowerShell.Security\Certificate::LocalMachine\My Thumbprint Subject ---------- ------- 2175A76B10F843676951965F52A718F635FFA043 CN=test.contoso.com
যদি আপনি নন-এলিভেটেড PowerShell সেশনে (লোকাল অ্যাডমিন পারমিশন ছাড়া) এই কমান্ড চালান, তবে এরর আসবে:
New-SelfSignedCertificate : CertEnroll::CX509Enrollment::_CreateRequest: Access denied. 0x80090010 (-2146893808 NTE_PERM)
যদি আপনি নন-স্ট্যান্ডার্ড ক্রিপ্টোগ্রাফিক প্রোভাইডার (CSP) স্পেসিফাই করেছেন, উদাহরণস্বরূপ -KeyAlgorithm "ECDSA_secP256r1" -Provider "Microsoft Smart Card Key Storage Provider" প্যারামিটার ব্যবহার করে, তবে নিশ্চিত করুন এটি আপনার কম্পিউটারে ইনস্টল করা আছে (ডিফল্ট হলো Microsoft Enhanced Cryptographic Provider CSP)। অন্যথায় এরর আসবে:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).
এই কমান্ড একটি নতুন সার্টিফিকেট তৈরি করে এবং কম্পিউটারের পার্সোনাল সার্টিফিকেট স্টোরে ইম্পোর্ট করে। certlm.msc MMC স্ন্যাপ-ইন খুলুন, নিশ্চিত করুন যে সার্টিফিকেট স্টোরের Personal সেকশনে নতুন সার্টিফিকেটটি দেখাচ্ছে।
ডিফল্টভাবে একটি সেলফ-সাইনড সার্টিফিকেট নিচের সেটিংসের সাথে জেনারেট হয়:
- ক্রিপ্টোগ্রাফিক অ্যালগরিদম: RSA;
- কী লেংথ: 2048 bit;
- অ্যাক্সেপ্টেবল কী ইউজ: Client Authentication এবং Server Authentication;
- সার্টিফিকেট ব্যবহৃত হয়: Digital Signature, Key Encipherment;
- সার্টিফিকেট ভ্যালিডিটি পিরিয়ড: ১ বছর।
দেখুন, সার্টিফিকেট প্রপার্টিজে ইঙ্গিত করা হয়েছে যে এই সার্টিফিকেট Client Authentication-এর জন্য ব্যবহার করা যাবে, তবে Server Authentication-এর জন্যও এটি ভ্যালিড।

Get-ChildItem কমান্ডলেট ব্যবহার করে তৈরি করা সার্টিফিকেটের সব প্যারামিটার এর Thumbprint দিয়ে দেখতে পারেন:
Get-ChildItem -Path "Cert:\LocalMachine\My" | Where-Object Thumbprint -eq 2175A76B10F843676951965F52A718F635FFA043 | Select-Object *

PSPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My\2175A76B10F843676951965F52A718F635FFA043
PSParentPath : Microsoft.PowerShell.Security\Certificate::LocalMachine\My
PSChildName : 2175A76B10F843676951965F52A718F635FFA043
PSDrive : Cert
PSProvider : Microsoft.PowerShell.Security\Certificate
PSIsContainer : False
EnhancedKeyUsageList : {Client Authentication (1.3.6.1.5.5.7.3.2), Server Authentication (1.3.6.1.5.5.7.3.1)}
DnsNameList : {test.contoso.com}
SendAsTrustedIssuer : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId :
Archived : False
Extensions : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid}
FriendlyName :
IssuerName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter : 05/11/2021 06:19:42
NotBefore : 05/11/2020 05:59:42
HasPrivateKey : True
PrivateKey :
PublicKey : System.Security.Cryptography.X509Certificates.PublicKey
RawData : {48, 130, 3, 45...}
SerialNumber : 6797F5E3F870478D4D3798BEB291DBF3
SubjectName : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm : System.Security.Cryptography.Oid
Thumbprint : 2175A76B10F843676951965F52A718F635FFA043
Version : 3
Handle : 2834444631568
Issuer : CN=test.contoso.com
Subject : CN=test.contoso.com
নোট: একজন সেলফ-সাইনড সার্টিফিকেট এর সৃষ্টির তারিখ থেকে ১ বছর পর এক্সপায়ার হয়। –NotAfter অপশন ব্যবহার করে ভিন্ন ভ্যালিডিটি পিরিয়ড সেট করা যায়। উদাহরণস্বরূপ, তিন বছরের ভ্যালিডিটি পিরিয়ড সহ SSL/TLS সার্টিফিকেট ইস্যু করতে নিচের কমান্ডগুলো ব্যবহার করুন:
$todaydt = Get-Date
$3years = $todaydt.AddYears(3)
New-SelfSignedCertificate -dnsname test.contoso.com -notafter $3years -CertStoreLocation cert:\LocalMachine\My
আপনি একটি সার্টিফিকেট চেইন তৈরি করতে পারেন। প্রথমে একটি রুট সার্টিফিকেট (CA) তৈরি করা হয়, এবং তার ভিত্তিতে একটি SSL সার্ভার সার্টিফিকেট জেনারেট করা হয়:
$rootCert = New-SelfSignedCertificate -Subject 'CN=TestRootCA,O=TestRootCA,OU=TestRootCA' -KeyExportPolicy Exportable -KeyUsage CertSign,CRLSign,DigitalSignature -KeyLength 2048 -KeyUsageProperty All -KeyAlgorithm 'RSA' -HashAlgorithm 'SHA256' -Provider 'Microsoft Enhanced RSA and AES Cryptographic Provider'
New-SelfSignedCertificate -CertStoreLocation cert:\LocalMachine\My -DnsName "test2.contoso.com" -Signer $rootCert -KeyUsage KeyEncipherment,DigitalSignature
জেনারেট করা সার্টিফিকেটকে প্রাইভেট কীসহ পাসওয়ার্ড-প্রোটেক্টেড PFX ফাইল হিসেবে এক্সপোর্ট করতে এর Thumbprint স্পেসিফাই করতে হবে। এটি New-SelfSignedCertificate কমান্ডের রেজাল্ট থেকে কপি করা যায়। আপনাকে সার্টিফিকেট সিকিউরিটি পাসওয়ার্ডও স্পেসিফাই করতে হবে এবং সেটিকে SecureString ফরম্যাটে কনভার্ট করতে হবে:
$CertPassword = ConvertTo-SecureString -String "YourPassword" -Force –AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPassword

সার্টিফিকেট পাবলিক কী নিচের şekilde এক্সপোর্ট করা যায়:
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cer
নির্দিষ্ট ডিরেক্টরিতে *.cer (PFX) সার্টিফিকেট ফাইল তৈরি হয়েছে কিনা নিশ্চিত করুন। এটিকে রাইট-ক্লিক করে "Install Certificate" মেনু আইটেম সিলেক্ট করলে Certificate Import Wizard ব্যবহার করে আপনার কম্পিউটারের ট্রাস্টেড রুট সার্টিফিকেটে সার্টিফিকেট যোগ করা যায়।

Cert Store location → Local Machine, Place all certificates in the following store → Trusted Root Certification Authorities সিলেক্ট করুন।

সার্টিফিকেট তৈরি করে সরাসরি কম্পিউটারের Trusted Root Certificate স্টোরে ইম্পোর্ট করার কমান্ডগুলো:
$SelfSignCert=New-SelfSignedCertificate …..
$certFile = Export-Certificate -Cert $SelfSignCert -FilePath C:\ps\export-certname.cer
Import-Certificate -CertStoreLocation Cert:\LocalMachine\AuthRoot -FilePath $certFile.FullName
এই পাবলিক কী বা সার্টিফিকেট ফাইলটিই সব কম্পিউটার এবং সার্ভারে Active Directory ডোমেনে GPO দিয়ে ডিপ্লয় করা যায় (How to deploy certificates on domain computers using GPO?)।
Subject Alternative Names সহ Self-Signed Certificate তৈরি করা
New-SelfSignedCertificate কমান্ডলেটের একটি উপকারী ফিচার হলো একাধিক ভিন্ন নাম সহ সার্টিফিকেট তৈরি করা, Subject Alternative Names (SAN)।
নোট: Makecert.exe টুল, New-SelfSignedCertificate কমান্ডলেটের বিপরীতে, SAN এবং Wildcard সার্টিফিকেট জেনারেট করতে পারে না।
আপনি যদি একাধিক নাম সহ সার্টিফিকেট তৈরি করতে চান, তবে DnsName প্যারামিটারের প্রথম নামটি সার্টিফিকেটের CN (Common Name) হিসেবে ব্যবহার হবে। উদাহরণস্বরূপ, নিচের নাম সহ একটি সেলফ-সাইনড SAN সার্টিফিকেট তৈরি করা যাক:
- Subject Name (CN): adfs1.contoso.com
- Subject Alternative Name (DNS): web_gw.contoso.com
- Subject Alternative Name (DNS): enterprise_reg.contoso.com
সার্টিফিকেট তৈরির কমান্ড হবে:
New-SelfSignedCertificate -DnsName adfs1.contoso.com,web_gw.contoso.com,enterprise_reg.contoso.com -CertStoreLocation cert:\LocalMachine\My

আপনি পুরো ডোমেন নেমস্পেসের জন্য ওয়াইল্ডকার্ড সার্টিফিকেটও জেনারেট করতে পারেন। সার্ভার নাম হিসেবে *.contoso.com স্পেসিফাই করুন।
New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname *.contoso.com
Windows-এ Code Signing-এর জন্য Self-Signed Certificate জেনারেট করা
PowerShell 3.0-এ New-SelfSignedCertificate কমান্ডলেট শুধু SSL সার্টিফিকেট জেনারেট করে যা ড্রাইভার, অ্যাপ্লিকেশন বা স্ক্রিপ্ট কোড সাইন করার জন্য ব্যবহার করা যায় না (MakeCert ইউটিলিটি দিয়ে জেনারেট করা সার্টিফিকেটের মত নয়)।
PowerShell 5.0 এবং পরবর্তী ভার্সনে New-SelfSignedCertificate কমান্ডলেটের নতুন ভার্সন ব্যবহার করে Code Signing সার্টিফিকেট ইস্যু করা যায়।
সেলফ-সাইনড অ্যাপ্লিকেশন কোড সাইনিং সার্টিফিকেট তৈরি করতে কমান্ড চালান:
$cert = New-SelfSignedCertificate -Subject "My Code Signing Certificate" -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
এখন আপনার PowerShell স্ক্রিপ্টকে সেলফ-সাইনড সার্টিফিকেট দিয়ে সাইন করুন:
Set-AuthenticodeSignature -FilePath C:\PS\my_posh_script.ps1 -Certificate $cert
যদি কমান্ড এক্সিকিউট করার সময় UnknownError ওয়ার্নিং আসে, তবে এর মানে সার্টিফিকেট ট্রাস্টেড নয়, কারণ এটি ইউজারের পার্সোনাল সার্টিফিকেট স্টোরে আছে।

এটিকে Trusted Root Certificate স্টোরে সরিয়ে দিন (Windows সার্টিফিকেট রুট স্টোরে অনট্রাস্টেড এবং সাস্পিশিয়াস সার্টিফিকেটের জন্য পিরিয়ডিক্যালি স্ক্যান করুন এবং ট্রাস্টেড রুট সার্টিফিকেটের লিস্ট আপডেট করুন)।
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"
তারপর এই সেলফ-সাইনড সার্টিফিকেট দিয়ে আপনার PowerShell স্ক্রিপ্ট সাইন করতে পারবেন।
Windows Server IIS-এ SHA-256 Self-Signed SSL Certificate ব্যবহার করা
লক্ষ্য করুন Internet Information Manager কনসোল (Create Self-Signed Certificate অ্যাকশন মেনু আইটেম) দিয়ে IIS-এ সেলফ-সাইনড সার্টিফিকেট তৈরি করলে SSL সার্টিফিকেট SHA-1 এনক্রিপশন অ্যালগরিদম ব্যবহার করে তৈরি হয়। এ ধরনের সার্টিফিকেট অনেক ব্রাউজার অনট্রাস্টেড मानে এবং সিকিউয়ার কানেকশন স্থাপন করতে ব্যবহার করা যায় না (অথবা অন্যান্য SSL এরর দেখতে পাওয়া যায়)। New-SelfSignedCertificate কমান্ডলেট আপনাকে আরও জনপ্রিয় টাইপের সার্টিফিকেট তৈরি করতে দেয় SHA-256 এনক্রিপশন অ্যালগরিদম ব্যবহার করে।

PowerShell দিয়ে তৈরি করা সেলফ-সাইনড SHA-256 সার্টিফিকেটকে Windows Server-এ IIS সাইটে বাইন্ড করা যায়। আপনি PowerShell দিয়ে SSL সার্টিফিকেট তৈরি করে কম্পিউটারের সার্টিফিকেট স্টোরে রাখলে সেটি অটোমেটিক্যালি IIS সাইটগুলোর জন্য উপলব্ধ হয়ে যাবে।

IIS Manager কনসোল শুরু করুন, আপনার সাইট সিলেক্ট করুন, এবং Site Binding অপশনে আপনার তৈরি করা সার্টিফিকেট সিলেক্ট করুন এবং পরিবর্তনগুলো সংরক্ষণ করুন।