วิธีสร้างใบรับรองที่ลงนามด้วยตนเองบน Windows
ผู้ดูแลระบบ Windows ส่วนใหญ่ที่คุ้นเคยกับ PKI ทราบเกี่ยวกับ
MakeCert.exeเครื่องมือซึ่งอนุญาตให้สร้างใบรับรองที่ลงนามด้วยตนเอง เครื่องมือนี้เป็นส่วนหนึ่งของ Microsoft .NET Framework SDK และ Microsoft Windows SDK ในเวอร์ชัน Windows สมัยใหม่ (Windows 11/10/8.1 และ Windows Server 2022/2019/2016/2012R2) คุณสามารถสร้างใบรับรองที่ลงนามด้วยตนเองได้โดยใช้ PowerShell cmdlet ในตัว
New-SelfSignedCertificateโดยไม่ต้องใช้เครื่องมือเพิ่มเติม
Self-SignedCertificate ใหม่: การสร้างใบรับรองที่ลงนามด้วยตนเองด้วย PowerShell
หากต้องการสร้างใบรับรองที่ลงนามด้วยตนเองด้วย PowerShell คุณสามารถใช้ cmdlet New-SelfSignedCertificate ในตัว ซึ่งเป็นส่วนหนึ่งของโมดูล PKI ของ PowerShell (โครงสร้างพื้นฐานคีย์สาธารณะ):
หากต้องการแสดงรายการ cmdlet ที่มีทั้งหมดในโมดูล PKI ให้รันคำสั่ง:
Get-Command -Module PKI
ขอแนะนำให้ใช้ใบรับรองที่ลงนามเองสำหรับการทดสอบ/พัฒนางาน หรือเพื่อจัดเตรียมใบรับรองสำหรับบริการอินทราเน็ตภายใน (IIS, Exchange, Web Application Proxy, LDAPS, ADRMS, DirectAccess เป็นต้น) หากคุณไม่สามารถปรับใช้โครงสร้างพื้นฐาน PKI/CA หรือซื้อได้ ใบรับรองที่เชื่อถือได้จากผู้ให้บริการภายนอก
เคล็ดลับ อย่าลืมว่าคุณสามารถรับใบรับรอง SSL ฟรีได้ง่ายๆ จาก Let’s Encrypt ต่อไปนี้คือตัวอย่างการออกใบรับรอง Let’s Encrypt SSL และผูกเข้ากับไซต์ IIS บน Windows Server
หากต้องการสร้างใบรับรอง คุณต้องระบุค่าของ -DnsName (ชื่อเซิร์ฟเวอร์ ชื่ออาจเป็นชื่อที่กำหนดเองและแตกต่างจากชื่อโฮสต์ปัจจุบัน) และ -CertStoreLocation (ที่เก็บใบรับรองในเครื่องที่จะวางใบรับรองที่สร้างขึ้น)
หากต้องการสร้างใบรับรอง SSL ใหม่ (ด้วยประเภท SSLServerAuthentication เริ่มต้น) สำหรับชื่อ DNS test.contoso.com (ใช้ชื่อ FQDN) และวางลงในใบรับรองส่วนบุคคลบนคอมพิวเตอร์ ให้รันคำสั่งต่อไปนี้:
New-SelfSignedCertificate -DnsName test.contoso.com -CertStoreLocation cert:\LocalMachine\Myคำสั่งจะส่งคืน Thumbprint, Subject และ EnhancedKeyUsageList ของใบรับรองใหม่ ตามค่าเริ่มต้น ใบรับรองดังกล่าวสามารถใช้สำหรับการรับรองความถูกต้องของไคลเอนต์ (1.3.6.1.5.5.7.3.2) หรือการรับรองความถูกต้องของเซิร์ฟเวอร์ (1.3.6.1.5.5.7.3.1)
หากคุณเรียกใช้คำสั่งนี้ในพรอมต์ 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) มิฉะนั้น ข้อผิดพลาดจะปรากฏขึ้น:
New-SelfSignedCertificate: CertEnroll::CX509Enrollment::_CreateRequest: Provider type not defined. 0x80090017 (-2146893801 NTE_PROV_TYPE_NOT_DEF).ตามค่าเริ่มต้น ใบรับรองที่ลงนามด้วยตนเองจะถูกสร้างขึ้นโดยมีการตั้งค่าต่อไปนี้:
อัลกอริทึมการเข้ารหัส: RSA;
ความยาวคีย์: 2048 บิต;
การใช้คีย์ที่ยอมรับได้: การตรวจสอบไคลเอ็นต์ และ การตรวจสอบความถูกต้องของเซิร์ฟเวอร์;
สามารถใช้ใบรับรองสำหรับ: ลายเซ็นดิจิทัล, การเข้ารหัสคีย์;
ระยะเวลาใบรับรอง: 1 ปี;
ผู้ให้บริการ Crypto: ผู้ให้บริการที่เก็บคีย์ซอฟต์แวร์ของ Microsoft
คำสั่งนี้สร้างใบรับรองใหม่และนำเข้าไปยังที่เก็บใบรับรองส่วนบุคคลของคอมพิวเตอร์ เปิดสแน็ปอิน certlm.msc MMC และตรวจสอบให้แน่ใจว่าใบรับรองใหม่ปรากฏในส่วน ส่วนตัว ของที่เก็บใบรับรองของคอมพิวเตอร์
การใช้ cmdlet Get-ChildItem คุณสามารถแสดงพารามิเตอร์ทั้งหมดของใบรับรองที่สร้างขึ้นด้วยรหัสประจำตัว:
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 : 12/4/2023 5:35:15 PM
NotBefore : 12/4/2022 5:15:15 PM
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
หมายเหตุ ใบรับรองที่ลงนามด้วยตนเองนี้จะหมดอายุภายใน 1 ปีหลังจากสร้าง คุณสามารถตั้งค่าอายุใบรับรองอื่นได้โดยใช้ตัวเลือก -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หากต้องการเปลี่ยนความยาวของคีย์ใบรับรองและอัลกอริทึมการเข้ารหัส คุณต้องใช้
-KeyAlgorithm,
-KeyLength, และ
-HashAlgorithmตัวเลือก. ตัวอย่างเช่น:
New-SelfSignedCertificate -KeyAlgorithm RSA -KeyLength 2048 -HashAlgorithm "SHA256" …Microsoft Platform Crypto Provider ช่วยให้คุณใช้ชิป Trusted Platform Module (TPM 2.0) ของอุปกรณ์เพื่อป้องกันคีย์
New-SelfSignedCertificate -Type Custom -Provider "Microsoft Platform Crypto Provider" ...คุณสามารถสร้างใบรับรองการเข้ารหัสเอกสารเพื่อปกป้องเอกสารและอีเมลของคุณ ใช้
DocumentEncryptionCertพิมพ์เมื่อสร้างใบรับรอง:
$Params = @{
"DnsName" = "myhostname"
"CertStoreLocation" = "Cert:\\CurrentUser\\My"
"KeyUsage" = "KeyEncipherment","DataEncipherment","KeyAgreement"
"Type" = "DocumentEncryptionCert"
}
$doccert=New-SelfSignedCertificate @Paramsตรวจสอบค่าใบรับรอง EnhancedKeyUsageList:
$doccert|select EnhancedKeyUsageList{Document Encryption (1.3.6.1.4.1.311.80.1)}สร้างใบรับรองด้วยชื่อเรื่องอื่น (SAN) โดยใช้ PowerShell
cmdlet SelfSignedCertificate ใหม่ช่วยให้คุณสร้างใบรับรองที่มี Subject Alternative Names (SANs) ที่แตกต่างกันหลายรายการ
หมายเหตุ เดอะ
Makecert.exeเครื่องมือซึ่งแตกต่างจาก cmdlet SelfSignedCertificate ใหม่ไม่สามารถสร้างใบรับรอง SAN และ Wildcard
หากคุณต้องการสร้างใบรับรองที่มีหลายชื่อ ชื่อแรกของพารามิเตอร์ DnsName จะถูกใช้เป็น CN (ชื่อสามัญ) ของใบรับรอง ตัวอย่างเช่น มาสร้างใบรับรอง SAN ที่ลงนามด้วยตนเองด้วยชื่อต่อไปนี้:
ชื่อเรื่อง (CN):
adfs1.contoso.comชื่อเรื่องทางเลือก (DNS):
web_gw.contoso.comชื่อเรื่องทางเลือก (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คุณสามารถสร้างใบรับรองที่ลงนามเอง ไม่เพียงแต่สำหรับชื่อโฮสต์ DNS เท่านั้น แต่ยังสำหรับที่อยู่ IP อีกด้วย ในการทำเช่นนี้คุณต้องใช้
-TextExtensionแทนพารามิเตอร์ -DnsName ตัวอย่างเช่น:
New-SelfSignedCertificate -TextExtension @("2.5.29.17={text}IPAddress=10.1.2.3&DNS=TESTServer1&DNS=TESTServer1.local")อย่างที่คุณเห็น ตอนนี้ช่อง Subject Alternative Name มีที่อยู่ IP ของโฮสต์และชื่อ DNS
จะส่งออกใบรับรองที่ลงนามด้วยตนเองบน Windows ได้อย่างไร
ในการส่งออกใบรับรองที่สร้างขึ้นด้วยคีย์ส่วนตัวไปยังไฟล์ PFX ที่ป้องกันด้วยรหัสผ่าน คุณต้องระบุรหัสประจำตัว สามารถคัดลอกได้จากผลลัพธ์ของคำสั่ง New-SelfSignedCertificate คุณต้องระบุรหัสผ่านความปลอดภัยของใบรับรองและแปลงเป็นรูปแบบ SecureString:
$CertPassword = ConvertTo-SecureString -String “YourPassword” -Force -AsPlainText
Export-PfxCertificate -Cert cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\test.pfx -Password $CertPasswordคุณสามารถส่งออกคีย์สาธารณะของใบรับรองดังต่อไปนี้ (คีย์ส่วนตัวไม่รวมอยู่ในการส่งออก):
Export-Certificate -Cert Cert:\LocalMachine\My\2779C7928D055B21AAA0Cfe2F6BE1A5C2CA83B30 -FilePath C:\tstcert.cerตรวจสอบให้แน่ใจว่าไฟล์ใบรับรอง *.CER (PFX) ปรากฏในไดเร็กทอรีที่ระบุ หากคุณคลิกขวาและเลือกรายการเมนู “ติดตั้งใบรับรอง” คุณสามารถใช้ ตัวช่วยสร้างการนำเข้าใบรับรอง เพื่อเพิ่มใบรับรองไปยังใบรับรองหลักที่เชื่อถือได้บนคอมพิวเตอร์ของคุณ
เลือกตำแหน่งที่เก็บใบรับรอง -> เครื่องท้องถิ่น วางใบรับรองทั้งหมดไว้ในที่เก็บต่อไปนี้ -> ผู้ออกใบรับรองหลักที่เชื่อถือได้
คุณสามารถสร้างใบรับรองและนำเข้าสู่ที่เก็บ 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 (จะปรับใช้ใบรับรองกับผู้ใช้ที่มี GPO ได้อย่างไร)
การสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับการลงนามรหัสบน Windows
ใน PowerShell 3.0 cmdlet SelfSifgnedCertificate ใหม่จะสร้างเฉพาะใบรับรอง SSL ซึ่งไม่สามารถใช้เพื่อลงนามในรหัสไดรเวอร์ แอปพลิเคชัน หรือสคริปต์ได้ (ไม่เหมือนกับใบรับรองที่สร้างโดยยูทิลิตี้ MakeCert)
คุณสามารถใช้ cmdlet SelfSifgnedCertificate ใหม่เพื่อออกใบรับรอง การเซ็นชื่อรหัส ใน PowerShell รุ่น 5.0 และใหม่กว่า
คุณสามารถอัปเดตเวอร์ชัน PowerShell ของคุณได้ตามคำแนะนำ
ในการสร้างใบรับรองที่ลงนามเองสำหรับรหัสแอปพลิเคชันลงนาม ให้รันคำสั่ง:
$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 เมื่อดำเนินการคำสั่ง หมายความว่าใบรับรองไม่น่าเชื่อถือ เนื่องจากอยู่ในที่เก็บใบรับรองส่วนตัวของผู้ใช้
คุณต้องย้ายไปยังที่เก็บใบรับรองรูทที่เชื่อถือได้ (อย่าลืมสแกนที่เก็บรูทใบรับรอง Windows เป็นระยะๆ เพื่อหาใบรับรองที่ไม่น่าเชื่อถือและน่าสงสัย และอัปเดตรายการใบรับรองรูทที่เชื่อถือได้)
Move-Item -Path $cert.PSPath -Destination "Cert:\CurrentUser\Root"ตอนนี้ คุณสามารถใช้ใบรับรองที่ลงนามด้วยตนเองนี้เพื่อลงนามสคริปต์ PowerShell ไดรเวอร์ หรือแอปพลิเคชันของคุณ
การสร้างใบรับรอง SSL แบบลงนามด้วยตนเอง SHA-256 ใน IIS บน Windows Server
โปรดทราบว่าเมื่อสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับ IIS ผ่านคอนโซล Internet Information Manager (โดยใช้รายการเมนูการดำเนินการ สร้างใบรับรองที่ลงนามเอง) ใบรับรอง SSL จะถูกสร้างขึ้นโดยใช้อัลกอริทึมการเข้ารหัส SHA-1 เบราว์เซอร์จำนวนมากถือว่าใบรับรองดังกล่าวไม่น่าเชื่อถือและไม่สามารถใช้เพื่อสร้างการเชื่อมต่อที่ปลอดภัยได้ (หรือคุณอาจเห็นคำเตือนและข้อผิดพลาด SSL อื่นๆ) cmdlet SelfSignedCertificate ใหม่ช่วยให้คุณสร้างใบรับรองประเภทที่ได้รับความนิยมมากขึ้นโดยใช้อัลกอริทึมการเข้ารหัส SHA-256
คุณสามารถผูกใบรับรอง SHA-256 ที่ลงนามด้วยตนเองซึ่งสร้างด้วย PowerShell กับไซต์ IIS บน Windows Server หากคุณสร้างใบรับรอง SSL โดยใช้ PowerShell และวางไว้ในที่เก็บใบรับรองของคอมพิวเตอร์ ใบรับรองนั้นจะพร้อมใช้งานสำหรับไซต์ IIS โดยอัตโนมัติ
เปิดคอนโซลตัวจัดการ IIS (
inetmgr.exe) เลือกไซต์ของคุณ จากนั้นเลือกใบรับรองที่คุณสร้างขึ้นในตัวเลือก การผูกไซต์ บันทึกการเปลี่ยนแปลงของคุณ
คุณยังสามารถผูกใบรับรอง SSL โดยใช้รหัสประจำตัวกับไซต์ IIS:
New-IISSiteBinding -Name "Default Web Site" -BindingInformation "*:443:" -CertificateThumbPrint $yourCert.Thumbprint -CertStoreLocation "Cert:\LocalMachine\My" -Protocol https











