基于Let's Encrypt生成免費證書-支持多域名泛域名證書
Let’s Encrypt是一個由非營利性組織互聯(lián)網(wǎng)安全研究小組(ISRG)提供的免費、自動化和開放的證書頒發(fā)機構(gòu)(CA)。
簡單的說,借助Let’s Encrypt頒發(fā)的證書可以為我們的網(wǎng)站免費啟用HTTPS(SSL/TLS)
客戶端
Let’s Encrypt 使用 ACME 協(xié)議來驗證您對給定域名的控制權(quán)并向您頒發(fā)證書。要獲得 Let’s Encrypt 證書,您需要選擇一個要使用的 ACME 客戶端軟件。Let’s Encrypt 不控制或?qū)彶榈谌娇蛻舳耍膊荒鼙WC其安全性或可靠性。
官方提供了幾種證書的申請方式方法
certbot
它既可以僅為您獲取證書,也可以幫助您安裝證書(如果您需要的話)。它易于使用,適用于許多操作系統(tǒng),并且具有出色的文檔。
acme.sh
目前 Let's Encrypt 免費證書客戶端最簡單、最智能的 shell 腳本,可以自動發(fā)布和續(xù)訂 Let's Encrypt 中的免費證書
安裝acme.sh
1. 自動安裝
curl https://get.acme.sh | sh (網(wǎng)絡(luò)問題可能失敗)
2. 手動安裝
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
安裝過程如下:
-
默認安裝到當前用戶的主目錄$HOME下的.acme.sh文件夾中,即
~/.acme.sh/,之后所有生成的證書也會按照域名放在這個目錄下; -
創(chuàng)建指令別名: alias acme.sh=~/.acme.sh/acme.sh, 通過
acme.sh命令方便快速地使用 acme.sh 腳本 -
自動創(chuàng)建cronjob定時任務(wù),每天 0:00 點自動檢測所有的證書,如果快過期了,則會自動更新證書
#每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書 0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null
3. 測試收否安裝成功
user@owen-ubuntu:~$ acme.sh --version
https://github.com/acmesh-official/acme.sh
v2.8.8
如有版本信息輸出則表示環(huán)境正常;如果提示命令未找到,執(zhí)行source ~/.bashrc命令重載一下環(huán)境配置文件。
整個安裝過程不會污染已有的系統(tǒng)任何功能和文件,所有的修改都限制在安裝目錄~/.acme.sh/中。
使用acme.sh生成證書
1. HTTP 方式
http 方式需要在你的網(wǎng)站根目錄下放置一個文件, 以此來驗證你的域名所有權(quán),完成驗證,只需要指定域名, 并指定域名所在的網(wǎng)站根目錄,acme.sh 會全自動的生成驗證文件, 并放到網(wǎng)站的根目錄, 然后自動完成驗證,該方式較適合獨立域名的站點使用,比如博客站點等
./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
- issue 是acme.sh腳本用來頒發(fā)證書的指令;
- d是 --domain的簡稱,其后面須填寫已備案的域名;
- w是 --webroot的簡稱,其后面須填寫網(wǎng)站的根目錄。
示例:
./acme.sh --issue -d devopsing.site -d www.devopsing.site --webroot /var/www/html/blog/
證書簽發(fā)成功會有如下輸出:

執(zhí)行成功,默認為生成如下證書:
root@ecs-ubuntu18:/etc/nginx/sites-available# ls ~/.acme.sh/devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 12:34 ca.cer
-rw-r--r-- 1 root root 1866 Dec 16 12:34 devopsing.site.cer
-rw-r--r-- 1 root root 642 Dec 16 12:34 devopsing.site.conf
-rw-r--r-- 1 root root 1001 Dec 16 12:33 devopsing.site.csr
-rw-r--r-- 1 root root 232 Dec 16 12:33 devopsing.site.csr.conf
-rw-r--r-- 1 root root 1679 Dec 16 12:33 devopsing.site.key
-rw-r--r-- 1 root root 3453 Dec 16 12:34 fullchain.cer
如果用的apache/nginx服務(wù)器, acme.sh 還可以智能的從 nginx的配置中自動完成驗證, 不需要指定網(wǎng)站根目錄:
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx
2. DNS 方式
適合用于生成范解析證書
優(yōu)勢:不需要任何服務(wù)器, 不需要任何公網(wǎng) ip, 只需要 dns 的解析記錄即可完成驗證
劣勢:如果不同時配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動更新證書,每次都需要手動再次重新解析驗證域名所有權(quán)`
1. 生成證書記錄
注意,第一次執(zhí)行時使用 --issue,-d 指定需要生成證書的域名
./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
參數(shù)解釋:
--dns [dns_hook] Use dns manual mode or dns api. Defaults to manual mode when argument is omitted.
--yes-I-know-dns-manual-mode-enough-go-ahead-please Force use of dns manual mode.
See: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
2. 在域名解析中手動添加TXT記錄
如果第一次添加該域名,會提示如下信息,需要在DNS解析中添加TXT記錄,用作判斷你是否擁有域名使用權(quán)
[Wed Dec 16 16:04:49 CST 2020] Add the following TXT record:
[Wed Dec 16 16:04:49 CST 2020] Domain: '_acme-challenge.devopsing.site'
[Wed Dec 16 16:04:49 CST 2020] TXT value: '-jEWdpI**************EVh01_a3ywrW426wmppjuDqXOs'
[Wed Dec 16 16:04:49 CST 2020] Please be aware that you prepend _acme-challenge. before your domain
[Wed Dec 16 16:04:49 CST 2020] so the resulting subdomain will be: _acme-challenge.devopsing.site
[Wed Dec 16 16:04:49 CST 2020] Please add the TXT records to the domains, and re-run with --renew.
[Wed Dec 16 16:04:49 CST 2020] Please add '--debug' or '--log' to check more details.
[Wed Dec 16 16:04:49 CST 2020] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

驗證解析生效
user@owen-ubuntu:~$ nslookup -q=TXT _acme-challenge.devopsing.site
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
_acme-challenge.devopsing.site text = "-jEWdpI****************1_a3ywrW426wmppjuDqXOs"
Authoritative answers can be found from:
3. 重新生成證書
注意,這里第二次執(zhí)行是用的是 --renew
./acme.sh --renew -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
示例:
./acme.sh --issue -d *.devopsing.site --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

root@ecs-ubuntu18:/var/log/nginx# ls ~/.acme.sh/\*.devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 16:09 ca.cer
-rw-r--r-- 1 root root 1846 Dec 16 16:09 '*.devopsing.site.cer'
-rw-r--r-- 1 root root 613 Dec 16 16:09 '*.devopsing.site.conf'
-rw-r--r-- 1 root root 980 Dec 16 16:09 '*.devopsing.site.csr'
-rw-r--r-- 1 root root 211 Dec 16 16:09 '*.devopsing.site.csr.conf'
-rw-r--r-- 1 root root 1679 Dec 16 16:04 '*.devopsing.site.key'
-rw-r--r-- 1 root root 3433 Dec 16 16:09 fullchain.cer
4. 使用DNS API的模式進行證書申請 (支持自動更新)
dns 方式的真正強大之處在于可以使用域名解析商提供的 api 自動添加 txt 記錄完成驗證,acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等數(shù)十種解析商的自動集成。
阿里云DNS API
首先獲取阿里云的操作API 的 AccessKey ID和AccessKey Secret
export Ali_Key="key值"
export Ali_Secret="key Secret"
# 給出的 api id 和 api key 會被自動記錄下,下次就不用再次執(zhí)行上述命令
acme.sh --issue --dns dns_ali -d *.example.com --force
示例:
export Ali_Key="LTAI4F****i8qEeKeRios2r"
export Ali_Secret="nIpymix0s****a0bJNgERE0QzjSrkF"
acme.sh --issue --dns dns_ali -d *.devopsing.site --force
DnsPod API
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d *.example.com
查看/刪除證書
查看安裝證書 acme.sh --list

刪除證書 acme.sh remove <SAN_Domains>
user@ecs-ubuntu18:~$ acme.sh remove devopsing.site
[Thu Dec 17 14:05:53 CST 2020] devopsing.site is removed, the key and cert files are in /home/user/.acme.sh/devopsing.site
[Thu Dec 17 14:05:53 CST 2020] You can remove them by yourself.
使用acme.sh安裝證書
上面生成的證書放在了~/.acem.sh/<domain>目錄,使用--installcert命令,指定目標位置,可將證書copy 到相應(yīng)的位置
Nginx 示例
acme.sh --installcert -d <domain>.com \
--key-file /etc/nginx/ssl/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
如果要直接加載配置,可以使用 --reloadcmd "service nginx force-reload",但是由于nginx 的配置可能不盡相同,所以一般選擇手動 reload nginx
注意:Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/
server {
listen 443 ssl;
server_name demo.com;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/<domain>.key;
Apache 示例
./acme.sh --install-cert -d *.example.com
--cert-file /path/to/certfile/in/apache/cert.pem
--key-file /path/to/keyfile/in/apache/key.pem
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem
--reloadcmd "service apache2 force-reload"
更新證書
目前 Let's Encrypt 的證書有效期是90天,時間到了會自動更新,無需任何操作。但是,也可以強制續(xù)簽證書:
acme.sh --renew -d example.com --force
注:手動添加DNS獲取證書的方式無法自動更新,但是使用DNS API的方式進行獲取證書可以在證書有效期后自動更新, 你無需任何操作
強制執(zhí)行更新任務(wù) acme.sh --cron -f

更新acme.sh
acme 協(xié)議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經(jīng)常更新以保持同步。
手動更新: acme.sh --upgrade
開啟自動更新:acme.sh --upgrade --auto-upgrade
取消自動更新: acme.sh --upgrade --auto-upgrade 0
刪除acme.sh
user@owen-ubuntu:~$ acme.sh --uninstall
[2020年 12月 18日 星期五 15:55:11 CST] Removing cron job
[2020年 12月 18日 星期五 15:55:11 CST] LE_WORKING_DIR='/home/user/.acme.sh'
[2020年 12月 18日 星期五 15:55:11 CST] Uninstalling alias from: '/home/user/.bashrc'
[2020年 12月 18日 星期五 15:55:11 CST] The keys and certs are in "/home/user/.acme.sh", you can remove them by yourself.

浙公網(wǎng)安備 33010602011771號