บ่อยครั้งเราต้องทำงานกับใบรับรอง SSL จำกระบวนการสร้างและติดตั้งใบรับรอง (ในกรณีทั่วไปส่วนใหญ่)
- ค้นหาผู้ให้บริการ (ไซต์ที่เราสามารถซื้อ SSL)
- สร้าง CSR
- ส่งไปยังผู้ให้บริการของคุณ
- ยืนยันความเป็นเจ้าของโดเมน
- รับใบรับรอง
- แปลงใบรับรองเป็นรูปแบบที่ต้องการ (ไม่บังคับ) ตัวอย่างเช่น จาก pem ถึง PKCS #12
- ติดตั้งใบรับรองบนเว็บเซิร์ฟเวอร์
ค่อนข้างรวดเร็ว ไม่ซับซ้อน และเข้าใจง่าย ตัวเลือกนี้ค่อนข้างเหมาะสมหากเรามีโครงการสูงสุดสิบโครงการ จะเกิดอะไรขึ้นถ้ามีมากกว่านั้น และพวกเขามีสภาพแวดล้อมอย่างน้อยสามแห่งล่ะ? การพัฒนาแบบคลาสสิก - การจัดเตรียม - การผลิต ในกรณีนี้ ควรคำนึงถึงการทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ ฉันเสนอให้เจาะลึกปัญหาอีกเล็กน้อยและค้นหาวิธีแก้ปัญหาที่จะช่วยลดเวลาที่ใช้ในการสร้างและบำรุงรักษาใบรับรองให้เหลือน้อยที่สุด บทความนี้จะมีการวิเคราะห์ปัญหาและคำแนะนำเล็กๆ น้อยๆ ในการทำซ้ำ
ฉันขอจองล่วงหน้า: ความเชี่ยวชาญหลักของบริษัทของเราคือ .net และ IIS และผลิตภัณฑ์อื่นๆ ที่เกี่ยวข้องกับ Windows ดังนั้นไคลเอนต์ ACME และการดำเนินการทั้งหมดจะถูกอธิบายจากมุมมองของการใช้ Windows
สิ่งนี้เกี่ยวข้องกับใครและข้อมูลเบื้องต้นบางส่วน
บริษัท K เป็นตัวแทนโดยผู้เขียน URL (ตัวอย่าง): company.tld
โปรเจ็กต์ X เป็นหนึ่งในโปรเจ็กต์ของเรา ในขณะที่ทำงานอยู่ ซึ่งฉันได้ข้อสรุปว่าเรายังต้องก้าวไปสู่การประหยัดเวลาสูงสุดเมื่อทำงานกับใบรับรอง โปรเจ็กต์นี้มีสภาพแวดล้อมสี่แบบ: การพัฒนา การทดสอบ การจัดเตรียม และการใช้งานจริง การพัฒนาและการทดสอบอยู่ฝั่งเรา ส่วนการจัดเตรียมและการใช้งานจริงอยู่ฝั่งไคลเอ็นต์
คุณสมบัติพิเศษของโครงการคือมีโมดูลจำนวนมากที่สามารถใช้เป็นโดเมนย่อยได้
นั่นคือเรามีภาพดังต่อไปนี้:
dev
ทดสอบ
การแสดงละคร
การผลิต
โครงการX.dev.company.tld
โครงการX.test.company.tld
การแสดงละคร.projectX.tld
projectX.tld
module1.projectX.dev.company.tld
module1.projectX.test.company.tld
module1.staging.projectX.tld
module1.projectX.tld
module2.projectX.dev.company.tld
module2.projectX.test.company.tld
module2.staging.projectX.tld
module2.projectX.tld
...
...
...
...
โมดูลN.projectX.dev.company.tld
moduleN.projectX.test.company.tld
moduleN.staging.projectX.tld
โมดูลN.projectX.tld
สำหรับการผลิต จะใช้ใบรับรองไวด์การ์ดที่ซื้อมา โดยไม่มีคำถามเกิดขึ้นที่นี่ แต่ครอบคลุมเฉพาะระดับแรกของโดเมนย่อยเท่านั้น ดังนั้น หากมีใบรับรองสำหรับ *.projectX.tld ใบรับรองนั้นจะใช้ได้กับ staging.projectX.tld แต่ไม่ใช่สำหรับ module1.staging.projectX.tld แต่อย่างใดฉันไม่ต้องการซื้อแยกต่างหาก
และนี่เป็นเพียงตัวอย่างจากโครงการหนึ่งของบริษัทเดียวเท่านั้น และแน่นอนว่ามีมากกว่าหนึ่งโครงการ
สาเหตุทั่วไปที่ทุกคนต้องแก้ไขปัญหานี้มีลักษณะดังนี้:
- ล่าสุด
Google เสนอให้ลดระยะเวลาความถูกต้องสูงสุดของใบรับรอง SSL . ด้วยผลที่ตามมาทั้งหมด - อำนวยความสะดวกในกระบวนการออกและบำรุงรักษา SSL สำหรับความต้องการภายในของโครงการและบริษัทโดยรวม
- การจัดเก็บบันทึกใบรับรองแบบรวมศูนย์ ซึ่งแก้ปัญหาการตรวจสอบโดเมนโดยใช้ DNS และการต่ออายุอัตโนมัติในภายหลังได้บางส่วน และยังช่วยแก้ปัญหาความไว้วางใจของลูกค้าอีกด้วย ถึงกระนั้น CNAME บนเซิร์ฟเวอร์ของหุ้นส่วน/บริษัทนักแสดงก็น่าเชื่อถือมากกว่าทรัพยากรของบุคคลที่สาม
- ในที่สุด ในกรณีนี้ วลี "มีดีกว่าไม่มี" ก็เข้ากันได้อย่างลงตัว
การเลือกผู้ให้บริการ SSL และขั้นตอนการเตรียมการ
ในบรรดาตัวเลือกที่มีให้สำหรับใบรับรอง SSL ฟรี มีการพิจารณา cloudflare และ Letencrypt DNS สำหรับสิ่งนี้ (และโครงการอื่น ๆ ) โฮสต์โดย cloudflare แต่ฉันไม่ชอบใช้ใบรับรองของพวกเขา ดังนั้นจึงตัดสินใจใช้ Letsencrypt
หากต้องการสร้างใบรับรอง Wildcard SSL คุณต้องยืนยันความเป็นเจ้าของโดเมน ขั้นตอนนี้เกี่ยวข้องกับการสร้างระเบียน DNS (TXT หรือ CNAME) จากนั้นตรวจสอบความถูกต้องเมื่อออกใบรับรอง Linux มียูทิลิตี้ -
และบันทึกสำหรับโดเมนได้ถูกสร้างขึ้นแล้ว มาดูการสร้างใบรับรองกันดีกว่า:
เราสนใจข้อสรุปสุดท้าย กล่าวคือ ตัวเลือกที่ใช้ได้สำหรับการยืนยันความเป็นเจ้าของโดเมนในการออกใบรับรองตัวแทน:
- สร้างบันทึก DNS ด้วยตนเอง (ไม่รองรับการอัปเดตอัตโนมัติ)
- การสร้างบันทึก DNS โดยใช้เซิร์ฟเวอร์ acme-dns (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ
ที่นี่ . - การสร้างบันทึก DNS โดยใช้สคริปต์ของคุณเอง (คล้ายกับปลั๊กอิน cloudflare สำหรับ certbot)
เมื่อเห็นแวบแรกจุดที่สามก็ค่อนข้างเหมาะสม แต่จะเกิดอะไรขึ้นถ้าผู้ให้บริการ DNS ไม่รองรับฟังก์ชันนี้ แต่เราจำเป็นต้องมีกรณีทั่วไป แต่กรณีทั่วไปคือระเบียน CNAME เนื่องจากทุกคนสนับสนุนระเบียนเหล่านั้น ดังนั้นเราจึงหยุดที่จุดที่ 2 และไปกำหนดค่าเซิร์ฟเวอร์ ACME-DNS ของเรา
การตั้งค่าเซิร์ฟเวอร์ ACME-DNS และกระบวนการออกใบรับรอง
ตัวอย่างเช่น ฉันสร้างโดเมน 2nd.pp.ua และจะใช้ในอนาคต
acmens.2nd.pp.ua. IN A 35.237.128.147
acme.2nd.pp.ua. IN NS acmens.2nd.pp.ua.
ในขั้นตอนนี้เจ้าบ้านของเราควรจะแก้ไข acmens.2nd.pp.ua
.
$ ping acmens.2nd.pp.ua
PING acmens.2nd.pp.ua (35.237.128.147) 56(84) bytes of data
แต่ acme.2nd.pp.ua
จะไม่สามารถแก้ไขได้ เนื่องจากเซิร์ฟเวอร์ DNS ที่ให้บริการยังไม่ได้ทำงาน
สร้างบันทึกแล้ว เราดำเนินการตั้งค่าและเปิดใช้งานเซิร์ฟเวอร์ ACME-DNS มันจะอยู่บนเซิร์ฟเวอร์ Ubuntu ของฉัน
สร้างไดเร็กทอรีและไฟล์ที่จำเป็น:
$ mkdir config
$ mkdir data
$ touch config/config.cfg
ลองใช้ vim กับโปรแกรมแก้ไขข้อความที่คุณชื่นชอบและวางตัวอย่างลงใน config.cfg
เพื่อให้การดำเนินการประสบความสำเร็จ การแก้ไขส่วนทั่วไปและส่วน API ก็เพียงพอแล้ว:
[general]
listen = "0.0.0.0:53"
protocol = "both"
domain = "acme.2nd.pp.ua"
nsname = "acmens.2nd.pp.ua"
nsadmin = "admin.2nd.pp.ua"
records =
"acme.2nd.pp.ua. A 35.237.128.147",
"acme.2nd.pp.ua. NS acmens.2nd.pp.ua.", ]
...
[api]
...
tls = "letsencrypt"
…
นอกจากนี้ หากต้องการ เราจะสร้างไฟล์นักเทียบท่าเขียนในไดเร็กทอรีบริการหลัก:
version: '3.7'
services:
acmedns:
image: joohoi/acme-dns:latest
ports:
- "443:443"
- "53:53"
- "53:53/udp"
- "80:80"
volumes:
- ./config:/etc/acme-dns:ro
- ./data:/var/lib/acme-dns
พร้อม. คุณสามารถเรียกใช้ได้
$ docker-compose up -d
ในขั้นตอนนี้เจ้าบ้านควรเริ่มแก้ไขปัญหา acme.2nd.pp.ua
และ 404 ก็ปรากฏขึ้น https://acme.2nd.pp.ua
$ ping acme.2nd.pp.ua
PING acme.2nd.pp.ua (35.237.128.147) 56(84) bytes of data.
$ curl https://acme.2nd.pp.ua
404 page not found
หากสิ่งนี้ไม่ปรากฏขึ้น - docker logs -f <container_name>
เพื่อช่วย โชคดีที่บันทึกสามารถอ่านได้ค่อนข้างดี
เราสามารถเริ่มสร้างใบรับรองได้ เปิด PowerShell ในฐานะผู้ดูแลระบบและเรียกใช้ winacme เราสนใจการเลือกตั้ง:
- M: สร้างใบรับรองใหม่ (ตัวเลือกทั้งหมด)
- 2: ป้อนข้อมูลด้วยตนเอง
- 2: [dns-01] สร้างบันทึกการตรวจสอบด้วย acme-dns (
https://github.com/joohoi/acme-dns ) - เมื่อถามเกี่ยวกับลิงก์ไปยังเซิร์ฟเวอร์ ACME-DNS ให้ป้อน URL ของเซิร์ฟเวอร์ที่สร้างขึ้น (https) ในคำตอบ URL ของเซิร์ฟเวอร์ acme-dns:
https://acme.2nd.pp.ua
ในการเปิด ไคลเอ็นต์จะออกบันทึกที่ต้องเพิ่มลงในเซิร์ฟเวอร์ DNS ที่มีอยู่ (ขั้นตอนแบบครั้งเดียว):
[INFO] Creating new acme-dns registration for domain 1nd.pp.ua
Domain: 1nd.pp.ua
Record: _acme-challenge.1nd.pp.ua
Type: CNAME
Content: c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
Note: Some DNS control panels add the final dot automatically.
Only one is required.
เราสร้างบันทึกที่จำเป็นและตรวจสอบให้แน่ใจว่าสร้างขึ้นอย่างถูกต้อง:
$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.
เรายืนยันว่าเราได้สร้างรายการที่จำเป็นใน winacme และดำเนินการตามกระบวนการสร้างใบรับรองต่อไป:
มีการอธิบายวิธีใช้ certbot ในฐานะไคลเอนต์
ขั้นตอนการสร้างใบรับรองจะเสร็จสมบูรณ์ คุณสามารถติดตั้งบนเว็บเซิร์ฟเวอร์และใช้งานได้ หากเมื่อสร้างใบรับรอง คุณสร้างงานในตัวกำหนดเวลาด้วย ดังนั้นในอนาคต กระบวนการต่ออายุใบรับรองจะเกิดขึ้นโดยอัตโนมัติ
ที่มา: will.com