基於Let's Encrypt生成免費證書-支援多域名泛域名證書
阿新 • • 發佈:2021-01-02
[TOC]
Let’s Encrypt是一個由非營利性組織網際網路安全研究小組(ISRG)提供的免費、自動化和開放的證書頒發機構(CA)。
簡單的說,藉助Let’s Encrypt頒發的證書可以為我們的網站免費啟用HTTPS(SSL/TLS)
- https://letsencrypt.org/zh-cn/docs/
## 客戶端
Let’s Encrypt 使用 ACME 協議來驗證您對給定域名的控制權並向您頒發證書。要獲得 Let’s Encrypt 證書,您需要選擇一個要使用的 ACME 客戶端軟體。Let’s Encrypt 不控制或審查第三方客戶端,也不能保證其安全性或可靠性。
官方提供了幾種證書的申請方式方法
- https://letsencrypt.org/zh-cn/docs/client-options/
### certbot
它既可以僅為您獲取證書,也可以幫助您安裝證書(如果您需要的話)。它易於使用,適用於許多作業系統,並且具有出色的文件。
https://certbot.eff.org/
### acme.sh
目前 Let's Encrypt 免費證書客戶端最簡單、最智慧的 shell 指令碼,可以自動釋出和續訂 Let's Encrypt 中的免費證書
- https://github.com/acmesh-official/acme.sh
## 安裝acme.sh
### 1. 自動安裝
`curl https://get.acme.sh | sh` (網路問題可能失敗)
### 2. 手動安裝
``` shell
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
```
安裝過程如下:
1. 預設安裝到當前使用者的主目錄$HOME下的.acme.sh資料夾中,即`~/.acme.sh/`,之後所有生成的證書也會按照域名放在這個目錄下;
2. 建立指令別名: alias acme.sh=~/.acme.sh/acme.sh, 通過`acme.sh`命令方便快速地使用 acme.sh 指令碼
3. 自動建立cronjob定時任務,每天 0:00 點自動檢測所有的證書,如果快過期了,則會自動更新證書
``` shell
#每天 0:00 點自動檢測所有的證書, 如果快過期了, 需要更新, 則會自動更新證書
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null
```
### 3. 測試收否安裝成功
``` shell
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 會全自動的生成驗證檔案, 並放到網站的根目錄, 然後自動完成驗證,該方式較適合獨立域名的站點使用,比如部落格站點等
``` shell
./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/`
證書籤發成功會有如下輸出:
![acme-http](https://gitee.com/owen2016/pic-hub/raw/master/pics/20210101222026.png)
執行成功,預設為生成如下證書:
``` shell
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. 生成證書記錄
- https://github.com/acmesh-official/acme.sh/wiki/DNS-manual-mode
注意,第一次執行時使用 --issue,-d 指定需要生成證書的域名
`./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please`
**引數解釋:**
``` shell
--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`記錄,用作判斷你是否擁有域名使用權
``` shell
[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
```
![aliyun-dns](https://gitee.com/owen2016/pic-hub/raw/master/pics/20210101215207.png)
驗證解析生效
``` shell
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`
![](https://gitee.com/owen2016/pic-hub/raw/master/pics/20210101222244.png)
``` shell
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 等數十種解析商的自動整合。
- https://github.com/acmesh-official/acme.sh/wiki/dnsapi
##### 阿里雲DNS API
首先獲取阿里雲的操作API 的 AccessKey ID和AccessKey Secret
``` shell
export Ali_Key="key值"
export Ali_Secret="key Secret"
# 給出的 api id 和 api key 會被自動記錄下,下次就不用再次執行上述命令
acme.sh --issue --dns dns_ali -d *.example.com --force
```
**示例:**
``` shell
export Ali_Key="LTAI4F****i8qEeKeRios2r"
export Ali_Secret="nIpymix0s****a0bJNgERE0QzjSrkF"
acme.sh --issue --dns dns_ali -d *.devopsing.site --force
```
##### DnsPod API
``` shell
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d *.example.com
```
## 檢視/刪除證書
檢視安裝證書 `acme.sh --list`
![acme-list](https://gitee.com/owen2016/pic-hub/raw/master/pics/20210101222307.png)
刪除證書 `acme.sh remove `
``` shell
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/`目錄,使用`--installcert`命令,指定目標位置,可將證書copy 到相應的位置
### Nginx 示例
``` shell
acme.sh --installcert -d .com \
--key-file /etc/nginx/ssl/.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/.cer ,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤
``` conf
server {
listen 443 ssl;
server_name demo.com;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/.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-cron](https://gitee.com/owen2016/pic-hub/raw/master/pics/20210101222329.png)
## 更新acme.sh
acme 協議和 letsencrypt CA 都在頻繁的更新, 因此 acme.sh 也經常更新以保持同步。
手動更新: `acme.sh --upgrade`
開啟自動更新:`acme.sh --upgrade --auto-upgrade`
取消自動更新: `acme.sh --upgrade --auto-upgrade 0`
## 刪除acme.sh
``` shell
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 yourse