1. 程式人生 > >基於Let's Encrypt生成免費證書-支援多域名泛域名證書

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

[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