Let’s Encrypt是一個由非營利性組織網際網路安全研究小組(ISRG)提供的免費、自動化和開放的證書頒發機構(CA)。
簡單的說,藉助Let’s Encrypt頒發的證書可以為我們的網站免費啟用HTTPS(SSL/TLS)
客戶端
Let’s Encrypt 使用 ACME 協議來驗證您對給定域名的控制權並向您頒發證書。要獲得 Let’s Encrypt 證書,您需要選擇一個要使用的 ACME 客戶端軟體。Let’s Encrypt 不控制或審查第三方客戶端,也不能保證其安全性或可靠性。
官方提供了幾種證書的申請方式方法
certbot
它既可以僅為您獲取證書,也可以幫助您安裝證書(如果您需要的話)。它易於使用,適用於許多作業系統,並且具有出色的文件。
acme.sh
目前 Let's Encrypt 免費證書客戶端最簡單、最智慧的 shell 指令碼,可以自動釋出和續訂 Let's Encrypt 中的免費證書
安裝acme.sh
1. 自動安裝
curl https://get.acme.sh | sh
(網路問題可能失敗)
2. 手動安裝
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
安裝過程如下:
-
預設安裝到當前使用者的主目錄$HOME下的.acme.sh資料夾中,即
~/.acme.sh/
,之後所有生成的證書也會按照域名放在這個目錄下; -
建立指令別名: alias acme.sh=~/.acme.sh/acme.sh, 通過
acme.sh
命令方便快速地使用 acme.sh 指令碼 -
自動建立cronjob定時任務,每天 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
如有版本資訊輸出則表示環境正常;如果提示命令未找到,執行source ~/.bashrc命令過載一下環境配置檔案。
整個安裝過程不會汙染已有的系統任何功能和檔案,所有的修改都限制在安裝目錄~/.acme.sh/中。
使用acme.sh生成證書
1. HTTP 方式
http 方式需要在你的網站根目錄下放置一個檔案, 以此來驗證你的域名所有權,完成驗證,只需要指定域名, 並指定域名所在的網站根目錄,acme.sh 會全自動的生成驗證檔案, 並放到網站的根目錄, 然後自動完成驗證,該方式較適合獨立域名的站點使用,比如部落格站點等
./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
- issue 是acme.sh指令碼用來頒發證書的指令;
- d是 --domain的簡稱,其後面須填寫已備案的域名;
- w是 --webroot的簡稱,其後面須填寫網站的根目錄。
示例:
./acme.sh --issue -d devopsing.site -d www.devopsing.site --webroot /var/www/html/blog/
證書籤發成功會有如下輸出:
執行成功,預設為生成如下證書:
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伺服器, acme.sh 還可以智慧的從 nginx的配置中自動完成驗證, 不需要指定網站根目錄:
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx
2. DNS 方式
適合用於生成範解析證書
優勢:不需要任何伺服器, 不需要任何公網 ip, 只需要 dns 的解析記錄即可完成驗證
劣勢:如果不同時配置 Automatic DNS API,使用這種方式 acme.sh 將無法自動更新證書
,每次都需要手動再次重新解析驗證域名所有權`
1. 生成證書記錄
注意,第一次執行時使用 --issue,-d 指定需要生成證書的域名
./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
引數解釋:
--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
記錄,用作判斷你是否擁有域名使用權
[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. 重新生成證書
注意,這裡第二次執行是用的是 --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 等數十種解析商的自動整合。
阿里雲DNS API
首先獲取阿里雲的操作API 的 AccessKey ID和AccessKey Secret
export Ali_Key="key值"
export Ali_Secret="key Secret"
# 給出的 api id 和 api key 會被自動記錄下,下次就不用再次執行上述命令
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 到相應的位置
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天,時間到了會自動更新,無需任何操作。但是,也可以強制續簽證書:
acme.sh --renew -d example.com --force
注:手動新增DNS獲取證書的方式無法自動更新,但是使用DNS API的方式進行獲取證書可以在證書有效期後自動更新, 你無需任何操作
強制執行更新任務 acme.sh --cron -f
更新acme.sh
acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步。
手動更新: 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.