Như các bạn đã biết thì SSL Let’s Encrypt là tổ chức cấp phát chứng chỉ miễn phí, tuy nhiên nó có giới hạn số lần Request (yêu cầu). Và tôi đang gặp vấn đề khi yêu cầu SSL với số lượng lớn.
Trong case này tôi có 1 domain chính và gần 200 subdomain, khi tôi request trong cPanel thì rất dễ bị fail và limit request. Điều này gây khó khăn cho các website của tôi.
Chính vì vậy tôi sử dụng giải pháp bên thứ 3 là Deploy SSL có sẵn. Nếu bạn chưa có sẵn SSL wildcard bạn có thể xem bài này để tạo.
Yêu cầu:
- Phải có sẵn chứng chỉ SSL wildcard.
- Có quyền SSH
- Thiết lập SSL vào một sub bất kỳ để chứng chỉ được ghi vào
/home/$user/ssl
Sau khi đã thoả mãn được yêu cầu, bạn hãy SSH vào bên trong. Nếu bạn sử dụng cPanel thì vào mục Terminal như ảnh bên dưới.
Tiếp theo bạn tạo một script sau đó sao chép và dán nội dung bên dưới vào script và tiếp hành chạy
Ví dụ:
vi run-caissl.sh
bash run-caissl.sh
#!/bin/bash
# Requirement: this script uses EXISTING wildcard certificates and
# applies them to subdomains as cPanel does not do that automatically
# this script would benefit from error and dependency checking
printf "\nScript started.\n"
# Get list of subdomains, not tested when there is no subdomains. Output (each subdomain) is saved in array.
# https://documentation.cpanel.net/display/DD/UAPI+Functions+-+DomainInfo%3A%3Alist_domains
subdomains=(`uapi DomainInfo list_domains --output=yaml 2>/dev/null | awk '/sub_domains/{f=1;next} /errors/{f=0} f' | sed 's/ *- //g'`)
# Go over each subdomain
for subdomain in "${subdomains[@]}"
do
echo "Subdomain: $subdomain"
# store the best certificate, private key and ca bundle for the subdomain
# https://documentation.cpanel.net/display/DD/UAPI+Functions+-+SSL%3A%3Afetch_best_for_domain
subdomainxml=`uapi SSL fetch_best_for_domain domain=$subdomain --output=xml 2>/dev/null`
# extract those to their own variable
cert=`echo "$subdomainxml" | xmllint --xpath '//crt/text()' -`
key=`echo "$subdomainxml" | xmllint --xpath '//key/text()' -`
cab=`echo "$subdomainxml" | xmllint --xpath '//cab/text()' -`
# urlencode variables as required by the following install SSL function
# https://stackoverflow.com/questions/11876353/url-encoding-a-string-in-bash-script/11876446#11876446
urlcert=$(php -r "echo urlencode(\"$cert\");")
urlkey=$(php -r "echo urlencode(\"$key\");")
urlcab=$(php -r "echo urlencode(\"$cab\");")
# install the best certificate for the subdomain
# note: no action taken if best certifiate is already present
# https://documentation.cpanel.net/display/DD/UAPI+Functions+-+SSL%3A%3Ainstall_ssl
uapi SSL install_ssl domain=$subdomain cert=$urlcert key=$urlkey cabundle=$urlcab
printf "\n\n\n"
done
printf "\nScript completed.\n"
Đây là kết quả khi chạy bash run-caissl.sh
Sau ít phút script chạy thì SSL đã nhận đầy đủ.
Chúc bạn thực hiện thành công.
- Tài liệu tham khảo: https://github.com/acmesh-official/acme.sh/issues/2992