ค้นหาเว็บไซต์

New-SelfSignedCertificate: การสร้างใบรับรองด้วย PowerShell


คุณต้องการใบรับรอง SSL สำหรับการพัฒนาเว็บไซต์หรือการทดสอบแอปพลิเคชันหรือไม่? แทนที่จะซื้อใบรับรองดิจิทัลราคาแพงจากผู้ให้บริการบุคคลที่สาม ทำไมไม่สร้างใบรับรองที่ลงนามเองด้วยตัวเองล่ะ ไม่ต้องกังวล; PowerShell ช่วยให้คุณได้รับ New-SelfSignedCertificate cmdlet

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีสร้างใบรับรองที่ลงนามด้วยตนเองใหม่ใน PowerShell โดยใช้ตัวอย่างต่างๆ ในตอนท้าย คุณจะได้สร้างใบรับรองที่ลงนามด้วยตนเองพร้อมคุณสมบัติที่แตกต่างกันและเพื่อวัตถุประสงค์ที่แตกต่างกัน มาเริ่มกันเลย!

ข้อกำหนดเบื้องต้น

หากคุณต้องการปฏิบัติตามบทช่วยสอนนี้แบบลงมือปฏิบัติจริง ตรวจสอบให้แน่ใจว่าคุณมีคุณสมบัติตามข้อกำหนดต่อไปนี้

  • คอมพิวเตอร์ Windows ที่ใช้ Windows PowerShell 5.1 หรือ PowerShell 7 ล่าสุด (v7.1.3 ตามที่เขียนบทความนี้) บทช่วยสอนนี้จะใช้ Windows 10 เวอร์ชัน 2004 และ Windows PowerShell 5.1
  • บัญชีผู้ใช้ของคุณต้องมีสิทธิ์ของผู้ดูแลระบบในเครื่องท้องถิ่น
  • ตลอดบทความนี้ คุณจะใช้เซสชัน PowerShell ที่ยกระดับ (เรียกใช้ในฐานะผู้ดูแลระบบ) และถือว่าคุณได้เปิดเซสชันไว้แล้ว

การสร้างใบรับรองด้วยหัวเรื่องเดียว

เมื่อคุณต้องการสร้างใบรับรองที่ลงนามด้วยตนเองใน PowerShell cmdlet New-SelfSignedCertificate จะเป็นเพื่อนของคุณ cmdlet นี้จะช่วยคุณสร้างใบรับรองสำหรับวัตถุประสงค์ที่แตกต่างกัน เช่น การลงนามโค้ด การรับรองความถูกต้องของเซิร์ฟเวอร์ และการเข้ารหัสเอกสาร และอื่นๆ อีกมากมาย

หากต้องการสร้างใบรับรองที่ลงนามด้วยตนเองโดยมีเพียงเรื่องเดียว เช่น URL ของเว็บไซต์เดียวหรือเซิร์ฟเวอร์ FQDN หนึ่งรายการ New-SelfSignedCertificate cmdlet ต้องการเพียงพารามิเตอร์ Subject เท่านั้น คุณสามารถมองว่าหัวเรื่องเป็นป้ายกำกับเฉพาะสำหรับใบรับรองที่แตกต่างจากใบรับรองอื่นๆ

ตัวอย่างเช่น เรียกใช้คำสั่งด้านล่างใน PowerShell เพื่อสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับเว็บไซต์ชื่อ LocalSite.com ตัวอย่างนี้จะสร้างใบรับรองในที่เก็บใบรับรองส่วนบุคคลของเครื่องท้องถิ่นสำหรับการรับรองความถูกต้องของเซิร์ฟเวอร์ สำหรับบริการบนเว็บ เป็นเรื่องปกติที่จะใช้ URL ของเว็บไซต์ที่ใบรับรองจะป้องกันเป็นชื่อเรื่อง

ใบรับรองในที่เก็บใบรับรองของเครื่องท้องถิ่นนั้นพร้อมใช้งานทั่วโลกสำหรับผู้ใช้ทั้งหมดในคอมพิวเตอร์ท้องถิ่น ในการเปรียบเทียบ ใบรับรองในที่เก็บใบรับรองผู้ใช้ปัจจุบันจะพร้อมใช้งานสำหรับผู้ใช้ปัจจุบันเท่านั้น

# Create a self-signed certificate in the local machine personal certificate store and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -Subject localsite.com
# Display the new certificate properties
$cert | Format-List -Property *

หากต้องการสร้างใบรับรองใหม่ในที่เก็บใบรับรองส่วนบุคคลของผู้ใช้ปัจจุบัน (Cert:\CurrentUser\My) ให้เพิ่มพารามิเตอร์ -Certstorelocation Cert:\CurrentUser\My หรือในร้านค้าผู้ออกใบรับรองรูทที่เชื่อถือได้ ให้ใช้ Cert:\LocalMachine\Root

ภาพหน้าจอด้านล่างแสดงผลลัพธ์ที่คาดหวังหลังจากสร้างใบรับรองและแสดงคุณสมบัติทั้งหมด คุณจะเห็นว่า selfsignedcertificate cmdlet จะเพิ่มคำนำหน้า CN= ให้กับชื่อเรื่องโดยอัตโนมัติ

การสร้างใบรับรองหัวเรื่องทางเลือก (SAN)

คุณได้สร้างใบรับรองที่มีชื่อเรื่องเดียว ซึ่งถือว่าดีหากคุณปรับใช้ใบรับรองดังกล่าวกับเว็บไซต์เดียว แต่ถ้าคุณมีหลายเว็บไซต์ เช่น localsite.com, content.localsite.com, และ apps.localsite.com

แทนที่จะสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับแต่ละเว็บไซต์ คุณสามารถสร้างใบรับรองเดียวที่มีชื่อทางเลือก (SAN) หลายเรื่องได้ ใบรับรองประเภทนี้เรียกว่าใบรับรอง SAN

หากต้องการสร้างใบรับรอง SAN ให้เรียกใช้ New-SelfSignedCertificate ด้วยพารามิเตอร์ DnsName พารามิเตอร์ DnsName ยอมรับชื่อเรื่องอย่างน้อยหนึ่งชื่อที่คุณต้องการรวมไว้ในใบรับรอง

เมื่อคุณระบุค่าหลายค่าให้กับพารามิเตอร์ DnsName สตริงแรกในพารามิเตอร์ DnsName จะปรากฏเป็นชื่อเรื่องหลักของใบรับรอง ชื่ออื่นๆ จะเป็นชื่อสำรอง ไม่ว่าชื่อเรื่องใดก็ตามจะเป็นชื่อหลักจะไม่ส่งผลกระทบต่อการใช้งานของใบรับรองและจะทำงานเหมือนเดิม

ตัวอย่างเช่น หากต้องการสร้างใบรับรอง SAN สำหรับ localsite.com, content.localsite.com และ apps.localsite.com ให้เรียกใช้คำสั่ง ด้านล่างใน PowerShell

# Create a self-signed SAN certificate in the local machine personal certificate store and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -DnsName localsite.com,content.localsite.com,apps.localsite.com
# Display the new certificate properties
$cert | Format-List -Property *

ดังที่คุณเห็นด้านล่าง cmdlet ได้สร้างใบรับรองใหม่ที่มีชื่อเรื่องหลายชื่อ ดังที่แสดงในคุณสมบัติ DnsNameList

การสร้างใบรับรองที่มีระยะเวลามีผลเฉพาะ

ตามค่าเริ่มต้น ใบรับรองที่ลงนามด้วยตนเองจะมีอายุการใช้งานหนึ่งปี ซึ่งอาจเพียงพอสำหรับกรณีการใช้งานส่วนใหญ่ แต่หากคุณต้องการระบุช่วงเวลาที่มีผลบังคับใช้เมื่อสร้างใบรับรองที่ลงนามด้วยตนเอง คุณสามารถเพิ่มพารามิเตอร์ NotBefore และ NotAfter ได้

ตัวอย่างเช่น หากต้องการสร้างใบรับรองที่ลงนามด้วยตนเองซึ่งใช้ได้ NotBefore วันนี้และ NotAfter 24 เดือนนับจากนี้ ให้รันคำสั่งด้านล่างใน PowerShell

# Create a self-signed certificate in the local machine personal certificate store valid for 24 months and store the result in the $cert variable.
$cert = New-SelfSignedCertificate -DnsName localsite.com -NotAfter (Get-Date).AddMonths(24)

เพื่อยืนยันใบรับรองใหม่ ให้รันคำสั่งด้านล่างเพื่อแสดงคุณสมบัติที่เลือกของใบรับรอง รวมถึงวันที่เริ่มต้นและวันหมดอายุ

$cert | Select-Object -Property Subject,Thumbprint,NotBefore,NotAfter

จากผลลัพธ์คุณจะเห็นได้ว่าขณะนี้คุณมีใบรับรองที่ลงนามด้วยตนเองซึ่งมีอายุการใช้งาน 24 เดือน

การโคลนใบรับรองที่ลงนามด้วยตนเองที่มีอยู่

สมมติว่าใบรับรองที่ลงนามด้วยตนเองของคุณกำลังจะหมดอายุ หากคุณยังคงต้องการใบรับรอง การดำเนินการเชิงตรรกะคือการต่ออายุใบรับรอง แต่ไม่มีวิธีต่ออายุใบรับรองโดยตรง คุณทำงานอะไร? สร้างใบรับรองที่ลงนามด้วยตนเองใหม่ตั้งแต่ต้นหรือจำลองใบรับรองที่มีอยู่

การโคลนใบรับรองเก่าจะทำให้ใบรับรองใหม่สืบทอดคุณสมบัติของใบรับรองเก่า ไม่รวมคีย์สาธารณะ รหัสประจำตัว หมายเลขซีเรียล และวันหมดอายุ ด้วยเหตุนี้ การโคลนใบรับรองเก่าจึงเป็นตัวเลือกที่รวดเร็วกว่า

หากต้องการโคลนใบรับรอง ให้เพิ่มพารามิเตอร์ CloneCert ลงในคำสั่ง New-SelfSignedCertificate ทำตามขั้นตอนด้านล่าง:

1. ขั้นแรก ค้นหาใบรับรองที่คุณต้องการโคลน หากต้องการดำเนินการดังกล่าว ให้เรียกใช้คำสั่ง Get-ChildItem เพื่อแสดงรายการใบรับรองที่มีอยู่ในที่เก็บใบรับรอง ในตัวอย่างด้านล่างนี้ PowerShell กำลังค้นหาที่เก็บใบรับรองของเครื่องในเครื่องเพื่อค้นหาใบรับรองทั้งหมดที่มีหัวเรื่องที่ลงท้ายด้วยสตริง localsite.com และส่งคืนแอตทริบิวต์ใบรับรองบางส่วน

# Get all certificates whose Subject name is like localsite.com.
 Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*localsite.com"} | Select-Object Subject,DnsNameList,Thumbprint,NotBefore,NotAfter

ดังที่คุณเห็นด้านล่าง อาจมีใบรับรองมากกว่าหนึ่งใบที่ตรงกับชื่อเรื่องที่คุณค้นหา ในกรณีนี้ ให้ตรวจสอบรายการใบรับรองเพื่อพิจารณาว่าใบรับรองใดที่จะโคลน หลังจากที่คุณตัดสินใจแล้ว ให้คัดลอกรหัสประจำตัวของใบรับรอง

2. เมื่อคุณได้กำหนดใบรับรองที่จะโคลนและคัดลอกรหัสประจำตัวแล้ว ให้รันคำสั่งด้านล่างเพื่อดึงใบรับรองเก่า ตรวจสอบให้แน่ใจว่าได้เปลี่ยนค่า Thumbprint เป็นรหัสประจำตัวที่คุณคัดลอกไว้ในขั้นตอนก่อนหน้า

# Get the certificate and store it in the $certToClone variable
 $certToClone = Get-Item Cert:\LocalMachine\My\

3. จากนั้น สร้างใบรับรองใหม่โดยการโคลนต้นฉบับโดยเรียกใช้ New-SelfSignedCertificate ด้วยพารามิเตอร์ CloneCert

# Create cloned self-signed certificate
 $cert = New-SelfSignedCertificate -CloneCert $certToClone

หากไม่มีการระบุพารามิเตอร์ NotBefore และ NotAfter ใบรับรองใหม่จะมีระยะเวลาที่มีผลบังคับใช้เหมือนกับใบรับรองเก่า (นั่นคือ สองปี) ค่า NotBefore จะเป็นวันที่และเวลาปัจจุบันลบสิบนาที

หรืออีกทางหนึ่ง หากต้องการให้ใบรับรองใหม่มีช่วงระยะเวลาที่มีผลบังคับใช้อื่น ให้รันคำสั่งเดียวกันแต่เพิ่มพารามิเตอร์ NotAfter ตัวอย่างเช่น หากต้องการให้ใบรับรองมีอายุสี่ปี ให้รันคำสั่งด้านล่าง

# Create cloned self-signed certificate valid for four years
 $cert = New-SelfSignedCertificate -CloneCert $certToClone -NotAfter (Get-Date).AddYears(4)

4. สุดท้าย ให้รันคำสั่งด้านล่างเพื่อตรวจสอบใบรับรองใหม่ที่คุณสร้างขึ้น

# Display the cloned certificate properties
 $cert | Select-Object Subject,DnsNameList,Thumbprint,NotBefore,NotAfter

ดังที่คุณเห็นด้านล่าง คุณได้คัดลอกใบรับรองที่ลงนามด้วยตนเองซึ่งมีหัวเรื่องและชื่ออื่นเหมือนกับต้นฉบับแล้ว รหัสประจำตัว วันที่เริ่มต้น และวันหมดอายุเป็นข้อมูลใหม่

การสร้างใบรับรองการลงนามโค้ด

เพื่อให้แน่ใจว่าสคริปต์หรือโค้ดของคุณมีลายเซ็นดิจิทัล คุณต้องลงนามสคริปต์โดยใช้ใบรับรองการลงนามโค้ด New-SelfSignedCertificate cmdlet ก็สามารถสร้างใบรับรองการลงนามโค้ดได้เช่นกัน

หากต้องการสร้างใบรับรองการลงนามโค้ดที่ลงนามด้วยตนเอง ให้เรียกใช้คำสั่ง New-SelfSignedCertificate ด้านล่างใน PowerShell พารามิเตอร์ Type ระบุเพื่อสร้างประเภทใบรับรอง CodeSigningCert ใบรับรองจะมีอายุ 24 เดือน โปรดทราบว่าการกำหนดระยะเวลาที่มีผลใช้ได้นั้นเป็นทางเลือกด้วยพารามิเตอร์ NotAfter

# Create a self-signed code signing certificate valid for 24 months.
$cert = New-SelfSignedCertificate -Subject CodeSigningCert -NotAfter (Get-Date).AddMonths(24) -Type CodeSigningCert

หลังจากสร้างใบรับรองการลงนามโค้ดแล้ว ให้รันคำสั่งด้านล่างเพื่อยืนยันว่าค่า EnhancedKeyUsageList แสดงการใช้คีย์ที่ถูกต้องของใบรับรองคือ การลงนามโค้ด

$cert | Select-Object Subject,EnhancedKeyUsageList

การสร้างใบรับรองการเข้ารหัสเอกสาร

เมื่อคุณมีเนื้อหาที่ต้องการปกป้องจากการสอดรู้สอดเห็น เช่น เอกสารหรืออีเมล การเข้ารหัสเป็นวิธีหนึ่งในการปกป้องเนื้อหาเหล่านั้น แต่ก่อนอื่น คุณต้องมีใบรับรองประเภทหนึ่งสำหรับการเข้ารหัสเอกสาร ซึ่งคุณสามารถสร้างได้โดยใช้ cmdlet New-SelfSignedCertificate

หากต้องการสร้างใบรับรองการเข้ารหัสเอกสาร New-SelfSignedCertificate cmdlet จำเป็นต้องมีชุดค่า KeyUsage เฉพาะ ค่าเหล่านี้คือ:

  • DataEncipherment - ใบรับรองจะใช้ได้สำหรับการเข้ารหัสข้อมูล
  • KeyEncipherment - ใบรับรองจะใช้ได้กับการเข้ารหัสลับ/คีย์ส่วนตัว
  • KeyAgreement - ใบรับรองจะใช้ได้กับการรับคีย์การเข้ารหัส เช่น ในการเข้ารหัส Elliptic Curve

นอกจากนี้ ค่าพารามิเตอร์ Type ต้องเป็น DocumentEncryptionCert

เรียกใช้คำสั่งด้านล่างเพื่อสร้างใบรับรองที่ลงนามด้วยตนเองสำหรับการเข้ารหัสเอกสาร ใบรับรองจะมีอายุสองปี เพื่อให้คำสั่งอ่านง่ายขึ้น โค้ดด้านล่างใช้การสลับเพื่อกำหนดค่าพารามิเตอร์

เนื่องจากโดยทั่วไปแล้วการเข้ารหัสเนื้อหามีไว้สำหรับการใช้งานส่วนตัว การสร้างใบรับรองการเข้ารหัสเอกสารในที่เก็บใบรับรองส่วนบุคคลของผู้ใช้ปัจจุบันจึงมีความเหมาะสม การทำเช่นนี้จะจำกัดใบรับรองให้กับผู้ใช้ปัจจุบัน (คุณ) เพื่อเข้ารหัสและถอดรหัสเนื้อหา

# Define the certificate parameter values
$certSplat = @{
	DnsName = 'DocEncCert'
	KeyUsage = @('KeyEncipherment','DataEncipherment','KeyAgreement')
	Type = 'DocumentEncryptionCert'
	CertStoreLocation = 'Cert:\\CurrentUser\\My'
	NotAfter = (Get-Date).AddYears(2)
}
# Create the self-signed document encryption certificate
$cert = New-SelfSignedCertificate @certSplat

ถัดไป เพื่อตรวจสอบว่าใบรับรองที่ลงนามด้วยตนเองนั้นถูกต้องสำหรับการลงนามโค้ด ให้เรียกใช้คำสั่งด้านล่างเพื่อรับค่า EnhancedKeyUsageList ของใบรับรอง

$cert | Select-Object Subject,EnhancedKeyUsageList

ดังที่คุณเห็นจากผลลัพธ์ด้านล่าง ใบรับรองจะแสดงรายการ การเข้ารหัสเอกสาร ซึ่งหมายความว่าใบรับรองนั้นใช้สำหรับการเข้ารหัสเอกสารได้

ขณะนี้คุณมีใบรับรองการเข้ารหัสเอกสารแล้ว คุณสามารถเข้ารหัสและถอดรหัสเนื้อหาได้โดยใช้ cmdlets Protect-CmsMessage และ Unprotect-CmsMessage

บทสรุป

บทความนี้มีจุดมุ่งหมายเพื่อสอนวิธีรับใบรับรองที่ลงนามด้วยตนเองอย่างรวดเร็วสำหรับความต้องการด้านการทดสอบและการพัฒนาของคุณ คุณได้เรียนรู้วิธีสร้างใบรับรองที่ลงนามด้วยตนเองโดยใช้พารามิเตอร์ที่แตกต่างกันและเพื่อวัตถุประสงค์ที่แตกต่างกัน

มีพารามิเตอร์เพิ่มเติมที่คุณสามารถสำรวจได้ว่าบทความนี้ไม่ครอบคลุมถึง ลองสร้างใบรับรอง S/MIME สำหรับการรักษาความปลอดภัยอีเมลหรือใบรับรองด้วยอัลกอริธึมที่แข็งแกร่งกว่าดูไหม คุณอาจต้องการเรียนรู้วิธีส่งออกและนำเข้าใบรับรองเหล่านั้นด้วย ขอให้โชคดี!