สู่ระบบอัตโนมัติของการออก SSL

บ่อยครั้งเราต้องทำงานกับใบรับรอง 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 มียูทิลิตี้ - certbotซึ่งช่วยให้คุณสามารถดำเนินการขั้นตอนนี้เป็นอัตโนมัติบางส่วน (หรือทั้งหมดสำหรับผู้ให้บริการ DNS บางราย) สำหรับ Windows จาก พบและตรวจสอบแล้ว ตัวเลือกไคลเอนต์ ACME ที่ฉันตัดสินใจ WinACME.

และบันทึกสำหรับโดเมนได้ถูกสร้างขึ้นแล้ว มาดูการสร้างใบรับรองกันดีกว่า:

สู่ระบบอัตโนมัติของการออก SSL

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

  1. สร้างบันทึก DNS ด้วยตนเอง (ไม่รองรับการอัปเดตอัตโนมัติ)
  2. การสร้างบันทึก DNS โดยใช้เซิร์ฟเวอร์ acme-dns (คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ ที่นี่.
  3. การสร้างบันทึก DNS โดยใช้สคริปต์ของคุณเอง (คล้ายกับปลั๊กอิน cloudflare สำหรับ certbot)

เมื่อเห็นแวบแรกจุดที่สามก็ค่อนข้างเหมาะสม แต่จะเกิดอะไรขึ้นถ้าผู้ให้บริการ DNS ไม่รองรับฟังก์ชันนี้ แต่เราจำเป็นต้องมีกรณีทั่วไป แต่กรณีทั่วไปคือระเบียน CNAME เนื่องจากทุกคนสนับสนุนระเบียนเหล่านั้น ดังนั้นเราจึงหยุดที่จุดที่ 2 และไปกำหนดค่าเซิร์ฟเวอร์ ACME-DNS ของเรา

การตั้งค่าเซิร์ฟเวอร์ ACME-DNS และกระบวนการออกใบรับรอง

ตัวอย่างเช่น ฉันสร้างโดเมน 2nd.pp.ua และจะใช้ในอนาคต

ข้อกำหนดบังคับ เพื่อให้เซิร์ฟเวอร์ทำงานได้อย่างถูกต้อง จำเป็นต้องสร้างระเบียน NS และ A สำหรับโดเมนของตน และช่วงเวลาที่ไม่พึงประสงค์แรกที่ฉันพบคือ cloudflare (อย่างน้อยก็ในโหมดใช้งานฟรี) ไม่อนุญาตให้คุณสร้างบันทึก NS และ A สำหรับโฮสต์เดียวกันพร้อมกัน ไม่ใช่ว่านี่เป็นปัญหา แต่โดยผูกมัดก็เป็นไปได้ ฝ่ายสนับสนุนตอบว่าแผงควบคุมของพวกเขาไม่อนุญาตให้ทำเช่นนี้ ไม่มีปัญหา มาสร้างเรกคอร์ดสองรายการกันดีกว่า:

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 ของฉัน นักเทียบท่า คอนเทนเนอร์ แต่คุณสามารถเรียกใช้ได้ทุกที่ที่มี golang Windows ก็ค่อนข้างเหมาะสม แต่ฉันยังชอบเซิร์ฟเวอร์ Linux มากกว่า

สร้างไดเร็กทอรีและไฟล์ที่จำเป็น:

$ 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.

สู่ระบบอัตโนมัติของการออก SSL

เราสร้างบันทึกที่จำเป็นและตรวจสอบให้แน่ใจว่าสร้างขึ้นอย่างถูกต้อง:

สู่ระบบอัตโนมัติของการออก SSL

$ dig CNAME _acme-challenge.1nd.pp.ua +short
c82a88a5-499f-464f-96e4-be7f606a3b47.acme.2nd.pp.ua.

เรายืนยันว่าเราได้สร้างรายการที่จำเป็นใน winacme และดำเนินการตามกระบวนการสร้างใบรับรองต่อไป:

สู่ระบบอัตโนมัติของการออก SSL

มีการอธิบายวิธีใช้ certbot ในฐานะไคลเอนต์ ที่นี่.

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

ที่มา: will.com

เพิ่มความคิดเห็น