ควรทำให้สิ่งนี้เป็นอัตโนมัติด้วย Let's Encrypt โดยใช้ Certbot แต่ฉันเกรงว่าจะไม่มีวิธีแก้ปัญหาที่พร้อมใช้งานสำหรับสิ่งนี้ ดังนั้นจึงต้องมีการเขียนสคริปต์ และคุณอาจต้องจ้างใครสักคน เนื่องจากคุณถามคำถามนี้
ฉันจะแนะนำสิ่งนี้ (ตัวอย่างสำหรับเว็บเซิร์ฟเวอร์ Apache 2.4):
สร้างการกำหนดค่า catch-all ที่ชี้ http://*/.well-known/acme-challenge/
ไปยังไดเร็กทอรีเดียวกันกับโดเมนใดๆ และกับโฮสต์เสมือนเริ่มต้นสำหรับส่วนที่เหลือ สิ่งนี้เป็นไปได้ด้วยโกลบอล นามแฝง
ที่สามารถวางไว้ใน /etc/apache2/conf-enabled/acme-challenge.conf
:
<IfModule alias_module>
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>
ให้ลูกค้าของคุณป้อนโดเมนที่กำหนดเองเพื่อตรวจสอบความถูกต้องและบันทึกข้อมูลไว้ที่ใดที่หนึ่งโดยอ้างอิงถึงลูกค้าที่ถูกต้อง ฐานข้อมูลจะเหมาะสำหรับสิ่งนั้นใช่ไหม อาจจำกัดชื่อโฮสต์ที่กำหนดเอง (& www) หนึ่งรายการต่อลูกค้าหนึ่งราย
แนะนำลูกค้าให้ชี้โดเมนของตนไปยังที่อยู่ IP ที่ถูกต้อง ในกรณีของโดเมนย่อย a CNAME
บันทึกจะทำงาน แต่ ที่จุดสูงสุดของโดเมน คุณจะต้องให้คำแนะนำสำหรับ ก
บันทึก.
ในที่นี้ ตัวอย่างจะถือว่าทุกโดเมนมีทั้งสองอย่าง ตัวอย่าง.คอม
และ www.example.com
แต่คุณสามารถแก้ไขได้ตามความต้องการของคุณ
อย่าเปิดตัว ความท้าทาย HTTP-01 ทันที แต่สร้างสคริปต์ที่เปิดตัวด้วย a ครอนจ็อบ หรือ ก จับเวลาระบบ. สคริปต์ควรตรวจสอบก่อนว่าโดเมนที่รอการตรวจสอบชี้ไปที่เซิร์ฟเวอร์ของคุณหรือไม่ และเปิดใช้ความท้าทาย ACME สำหรับโดเมนที่ตรงตามเงื่อนไขเท่านั้น มิฉะนั้น อาจมีคนใช้ฟีเจอร์นี้ในทางที่ผิดและทำให้เซิร์ฟเวอร์ของคุณดำเนินการตรวจสอบความถูกต้องของ Letâs Encrypt โดยไม่จำเป็น
#!/bin/bash
MYSERVERIP="192.0.2.123"
ถ้า [ "$#" -ne 1 ]; แล้ว
printf "\n%s\n\n" "การใช้งาน: $0 example.com" >&2
ทางออก 1
ไฟ
โฮสต์ "$1" 2>&1 > /dev/null
ถ้า [ $? -เน่ 0 ]; แล้ว
printf "\n%s\n\n" "โดเมนที่ระบุไม่ใช่ FQDN ที่ถูกต้อง" >&2
ทางออก 1
ไฟ
IPAPEX=$(ขุด "$1" +short | หาง -n 1)
IPWWW=$(ขุด "www.$1" +short | หาง -n 1)
ถ้า [ "$IPAPEX" = "$MYSERVERIP" ]; แล้ว
ถ้า [ "$IPWWW" = "$MYSERVERIP" ]; แล้ว
certbot certonly --quiet --webroot -w /var/www/letsencrypt -d $1 -d www.$1
ถ้า [ $? -เน่ 0 ]; แล้ว
printf "\n%s\n\n" "Certbot ล้มเหลวด้วยการทดสอบ HTTP-01" >&2
ทางออก 1
ไฟ
อื่น
printf "\n%s\n\n" "ล้มเหลว: www.$1 ไม่ได้ชี้ไปที่ $MYSERVERIP" >&2
ทางออก 1
ไฟ
อื่น
printf "\n%s\n\n" "ล้มเหลว: $1 ไม่ได้ชี้ไปที่ $MYSERVERIP" >&2
ทางออก 1
ไฟ
เมื่อการตรวจสอบเสร็จสิ้น สคริปต์อาจเพิ่มการกำหนดค่าไปยังเว็บเซิร์ฟเวอร์ คุณอาจใช้ มาโคร, เช่น. /etc/apache2/conf-enabled/custdomain-macro.conf
:
<Macro CustomWebShopDomain $customer $domain>
<VirtualHost *:80>
ServerName $domain
ServerAlias www.$domain
Redirect permanent / https://$domain/
</VirtualHost>
<VirtualHost *:443>
ServerName $domain
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
SSLVerifyClient None
DocumentRoot /path/to/webshop/$customer
</VirtualHost>
<VirtualHost *:443>
ServerName www.$domain
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
SSLVerifyClient None
Redirect permanent / https://$domain/
</VirtualHost>
</Macro>
ในกรณีนี้ การเพิ่มโดเมนลูกค้าใหม่จะทำได้ง่าย:
ใช้ CustomWebShopDomain รหัสลูกค้า example.com
สคริปต์ของคุณอาจเพิ่มบรรทัดนี้ในการกำหนดค่า จากนั้นโหลดเว็บเซิร์ฟเวอร์ Apache ซ้ำ:
printf "%s\n" "ใช้ CustomWebShopDomain $2 $1" \
>> /etc/apache2/conf-enabled/custdomain-use.conf
systemctl โหลด apache2 ใหม่
อย่าลืมล้างโดเมนที่หมดอายุแล้ว
Certbot เพิ่มโดเมนทั้งหมดสำหรับการต่ออายุอัตโนมัติ หากการต่ออายุเริ่มล้มเหลว คุณคงไม่ต้องการเก็บโดเมนเหล่านั้นไว้ในการกำหนดค่าตลอดไป วิธีที่ดีที่สุดคือการลบโดยอัตโนมัติ เช่น
- ลบการกำหนดค่า Certbot
/etc/letsencrypt/renewal/example.com
- ลบ
ใช้ CustomWebShopDomain รหัสลูกค้า example.com
ไลน์.