Có thể tự động hóa việc này với Let's Encrypt bằng Certbot, nhưng tôi e rằng không có sẵn giải pháp sẵn sàng sử dụng nào cho việc này. Do đó, nó yêu cầu một số kịch bản và bạn có thể cần phải thuê một người nào đó khi bạn đặt câu hỏi này.
tôi sẽ đề nghị một cái gì đó như thế này (ví dụ dành cho máy chủ web Apache 2.4):
Tạo một cấu hình tổng hợp tất cả các điểm http://*/.well-known/acme-challenge/
vào cùng thư mục với bất kỳ tên miền nào và với máy chủ ảo mặc định cho phần còn lại. Điều này là có thể với một toàn cầu bí danh
mà có thể được đặt trong /etc/apache2/conf-enabled/acme-challenge.conf
:
<IfModule alias_module>
Alias /.well-known/acme-challenge/ /var/www/letsencrypt/.well-known/acme-challenge/
</IfModule>
Cho phép khách hàng của bạn nhập miền tùy chỉnh của họ để xác thực và lưu thông tin ở đâu đó, với tham chiếu đến đúng khách hàng. Một cơ sở dữ liệu sẽ là lý tưởng cho việc đó, phải không. Có thể giới hạn điều này ở một tên máy chủ tùy chỉnh (& www) cho mỗi khách hàng.
Hướng dẫn khách hàng của bạn trỏ tên miền của họ đến đúng địa chỉ IP. Trong trường hợp tên miền phụ, một CNAME
bản ghi sẽ hoạt động, nhưng tại đỉnh miền bạn sẽ cần cung cấp hướng dẫn cho một Một
ghi.
Ở đây, các ví dụ đơn giản giả định rằng mọi miền đều có cả hai ví dụ.com
và www.example.com
, nhưng bạn có thể sửa đổi điều này theo yêu cầu của mình.
không khởi chạy thử thách HTTP-01 ngay lập tức, nhưng hãy tạo một tập lệnh được khởi chạy với một công việc lương thấp hoặc một hẹn giờ hệ thống. Trước tiên, tập lệnh phải kiểm tra xem các miền đang chờ xác thực có trỏ đến máy chủ của bạn hay không và chỉ khởi chạy thử thách ACME cho các miền đáp ứng điều kiện. Nếu không, ai đó có thể lạm dụng tính năng này và khiến máy chủ của bạn thực hiện các xác thực Letâs Encrypt không cần thiết.
#!/bin/bash
MYSERVERIP="192.0.2.123"
nếu [ "$#" -ne 1 ]; sau đó
printf "\n%s\n\n" "Sử dụng: $0 example.com" >&2
thoát 1
fi
lưu trữ "$1" 2>&1 > /dev/null
nếu [ $? -ne 0 ]; sau đó
printf "\n%s\n\n" "Miền đã cho không phải là một FQDN hợp lệ." >&2
thoát 1
fi
IPAPEX=$(đào "$1" +ngắn | đuôi -n 1)
IPWWW=$(dig "www.$1" +short | tail -n 1)
nếu [ "$IPAPEX" = "$MYSERVERIP" ]; sau đó
nếu [ "$IPWWW" = "$MYSERVERIP" ]; sau đó
certbot certonly --quiet --webroot -w /var/www/letsencrypt -d $1 -d www.$1
nếu [ $? -ne 0 ]; sau đó
printf "\n%s\n\n" "Certbot thất bại với thử thách HTTP-01." >&2
thoát 1
fi
khác
printf "\n%s\n\n" "Không thành công: www.$1 không trỏ tới $MYSERVERIP." >&2
thoát 1
fi
khác
printf "\n%s\n\n" "Không thành công: $1 không trỏ tới $MYSERVERIP." >&2
thoát 1
fi
Khi quá trình xác thực hoàn tất, tập lệnh cũng có thể thêm cấu hình vào máy chủ web. Bạn có thể sử dụng một vĩ mô, ví dụ. /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>
Trong trường hợp này, việc thêm miền khách hàng mới sẽ đơn giản:
Sử dụng CustomWebShopDomain customerid example.com
Tập lệnh của bạn có thể thêm dòng này vào cấu hình và sau đó tải lại máy chủ web Apache:
printf "%s\n" "Sử dụng CustomWebShopDomain $2 $1" \
>> /etc/apache2/conf-enabled/custdomain-use.conf
systemctl tải lại apache2
Đảm bảo xóa sạch các miền đã hết hạn
Certbot thêm tất cả các miền để gia hạn tự động. Nếu những lần gia hạn đó bắt đầu không thành công, bạn không muốn giữ những miền đó trong cấu hình mãi mãi. Tốt nhất là tự động hóa việc loại bỏ, tức là.
- Xóa cấu hình Certbot
/etc/letsencrypt/renewal/example.com
- Gỡ bỏ
Sử dụng CustomWebShopDomain customerid example.com
dòng.