基於Let's Encrypt生成免費證書-支援多域名泛域名證書

IT胖發表於2021-01-01

Let’s Encrypt是一個由非營利性組織網際網路安全研究小組(ISRG)提供的免費、自動化和開放的證書頒發機構(CA)。
簡單的說,藉助Let’s Encrypt頒發的證書可以為我們的網站免費啟用HTTPS(SSL/TLS)

客戶端

Let’s Encrypt 使用 ACME 協議來驗證您對給定域名的控制權並向您頒發證書。要獲得 Let’s Encrypt 證書,您需要選擇一個要使用的 ACME 客戶端軟體。Let’s Encrypt 不控制或審查第三方客戶端,也不能保證其安全性或可靠性。

官方提供了幾種證書的申請方式方法

certbot

它既可以僅為您獲取證書,也可以幫助您安裝證書(如果您需要的話)。它易於使用,適用於許多作業系統,並且具有出色的文件。

https://certbot.eff.org/

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

安裝過程如下:

  1. 預設安裝到當前使用者的主目錄$HOME下的.acme.sh資料夾中,即~/.acme.sh/,之後所有生成的證書也會按照域名放在這個目錄下;

  2. 建立指令別名: alias acme.sh=~/.acme.sh/acme.sh, 通過acme.sh命令方便快速地使用 acme.sh 指令碼

  3. 自動建立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/

證書籤發成功會有如下輸出:

acme-http

執行成功,預設為生成如下證書:

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

aliyun-dns

驗證解析生效

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-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/.cer ,否則 SSL Labs 的測試會報 Chain issues Incomplete 錯誤

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-cron

更新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.

相關文章