使用 Let’s Encrypt 免費申請泛域名 SSL 證書,并實現自動續期
目錄
- 使用 Let’s Encrypt 免費申請泛域名 SSL 證書,并實現自動續期
- 🛠? 環境準備
- 💡 什么是 Let’s Encrypt?
- 🧠 Let’s Encrypt 證書頒發原理
- 1.?域名驗證
- 2.?證書生成
- 3.?證書安裝
- 4.?自動續期
- 🛠? Certbot 的工作原理
- 📦 安裝 Certbot
- Linux 系統
- 其他系統平臺
- 🌐 單域名 SSL 證書
- 🔒 申請單域名 SSL 證書
- 🔄 單域名自動續期
- 🌐 泛域名 SSL 證書
- 🛡? 申請泛域名 SSL 證書
- 使用 DNS 驗證申請泛域名證書
- 🔄 泛域名設置自動續期
- 1.?創建自動化 DNS 腳本
- 2.?配置自動續期命令
- 3.?配置 Crontab 定期續期任務
- 4.?重載 Nginx 配置
- 5.?驗證自動續期配置
- 🔍 深入解讀
- ? 配置完成后的效果
- 🛡? 申請泛域名 SSL 證書
- 📁 申請的 SSL 證書文件所在目錄
- nginx配置證書示例
- 🔍 驗證 HTTPS 配置
- 🛡? 常見問題及解決方法
- 1.?DNS 驗證失敗
- 2.?Nginx 配置沖突
- 🎉 總結
- 🔗 參考鏈接
在如今的互聯網環境中,為網站配置 SSL 證書已成為安全的標配。本文將介紹如何使用?Let’s Encrypt?免費獲取泛域名 SSL 證書,并實現自動續期,為你的網站保駕護航。
🛠? 環境準備
在開始之前,確保你具備以下條件:
- 一臺可以訪問互聯網的服務器(Linux 環境,如 Ubuntu/CentOS)。
- Root?權限或?
sudo
?權限。 - 一個已解析的域名(本文以?
example.com
?為例)。
💡 什么是 Let’s Encrypt?
Let’s Encrypt?是一個免費的、自動化的、開放的證書頒發機構(CA),提供免費 SSL 證書。它的目標是讓所有網站都能輕松實現 HTTPS 加密,保障用戶數據的安全。通過?Let’s Encrypt,你可以為你的主域名、子域名,甚至泛域名配置安全證書,而且過程完全自動化,不需要手動申請和管理證書,官方推薦使用?Certbot。
🧠 Let’s Encrypt 證書頒發原理
Let’s Encrypt 證書的頒發是通過?自動化的認證流程?完成的,以下是基本流程:
1.?域名驗證
在申請證書之前,Let’s Encrypt 必須驗證你對所申請域名的控制權。這是通過以下幾種方式進行的:
- HTTP-01 驗證:Let’s Encrypt 向你請求創建一個特定的文件,并放在你網站的指定路徑下。它通過訪問該文件來驗證你是否控制該域名。
- DNS-01 驗證:Let’s Encrypt 提供一條 DNS TXT 記錄,要求你將其添加到域名的 DNS 設置中。它通過檢查 DNS 記錄來驗證你對域名的控制權。
對于?泛域名證書,必須使用?DNS-01?驗證方式,因為 HTTP 驗證不能跨域名層級進行。
2.?證書生成
一旦驗證成功,Let’s Encrypt 會生成一個 SSL 證書,并將其發放給申請者。這個證書包含了公鑰和域名信息,任何人都可以通過該證書與網站進行安全通信。
3.?證書安裝
證書的安裝你可以選擇自己手動安裝,我自己是手動安裝的,因為我用的是docker版的nginx服務器。你也可以由?Certbot?自動完成,前提是你已經在服務器上安裝?Nginx?或?Apache?等服務器。Certbot 會將證書安裝到 Web 服務器(如 Nginx 或 Apache)上,并配置好相應的加密設置,自動安裝會更方便,動手配置更靈活,比如申請證書和 Web 服務器不在同一臺電腦上就需要手動。
4.?自動續期
Let’s Encrypt 的證書有效期為?90 天,因此需要定期續期。Certbot 自動進行續期驗證,確保你的網站不會因為證書過期而遭到用戶的安全警告。
🛠? Certbot 的工作原理
Certbot?是一個命令行工具,用于自動化整個 SSL 證書的管理流程。它可以做以下幾件事:
- 申請證書:使用 ACME 協議從 Let’s Encrypt 獲取證書。
- 驗證域名所有權:通過 HTTP-01 或 DNS-01 驗證確保你擁有該域名。
- 安裝證書:將證書自動安裝到你的 Web 服務器,并配置相關的加密參數。
- 續期證書:定期自動續期證書,避免證書過期。
Certbot 的核心工作是通過?ACME 協議(自動證書管理環境)與 Let’s Encrypt 通信。ACME 是一套標準協議,用于自動化證書申請、驗證和安裝的過程。Certbot 使用 ACME 協議與 Let’s Encrypt 進行通信,確保你的網站能夠通過安全的 HTTPS 連接。
📦 安裝 Certbot
Certbot?是由?Electronic Frontier Foundation (EFF)?提供的一個開源工具,用于自動化從 Let’s Encrypt 獲取和管理 SSL 證書。Certbot 會自動為你處理證書申請、安裝和續期等過程。
Linux 系統
推薦使用 Linux 的 snap 包管理工具安裝Certbot,支持snap后可以使用如下命令安裝Certbot
sudo snap install --classic certbot?#安裝Certbot | |
sudo?ln -s /snap/bin/certbot /usr/bin/certbot?#創建一個符號鏈接,確保可以執行certbot命令(相當于快捷方式) |
其他系統平臺
參考Certbot官網
🌐 單域名 SSL 證書
🔒 申請單域名 SSL 證書
如果你只需要為單個域名(如?example.com
?和?www.example.com
)申請證書,可以使用以下命令:
sudo certbot --nginx -d example.com -d www.example.com |
--nginx 需要服務器預先安裝nginx,certbot獲取到證書后會自動通過修改nginx的配置將證書安裝到nginx上。
根據提示輸入郵箱地址,并同意服務條款,Certbot 將自動完成證書申請和安裝。
🔄 單域名自動續期
Let’s Encrypt 證書的有效期為?90 天,為了避免證書過期,我們可以使用?Cron Job?設置自動續期。
首先,你可以手動測試續期是否正常:
sudo certbot renew --dry-run |
如果沒有報錯,可以繼續配置自動續期任務:
sudo crontab -e |
在打開的編輯器中添加以下行,表示每天凌晨 2 點執行自動續期任務:
0 2 * * * /usr/bin/certbot renew --quiet |
--quiet
?參數表示靜默模式,不會輸出非錯誤信息。
單域名的操作非常簡單,就說到這里!!!
🌐 泛域名 SSL 證書
🛡? 申請泛域名 SSL 證書
泛域名證書(Wildcard Certificate)可以為同一主域名下的所有子域名提供 HTTPS 支持。例如,*.example.com
?可以覆蓋?blog.example.com
、api.example.com
?等子域名。
使用 DNS 驗證申請泛域名證書
Let’s Encrypt 要求通過?DNS-01?驗證來申請泛域名證書。運行以下命令:
sudo certbot certonly --manual --preferred-challenges dns -d *.example.com -d example.com |
Certbot 會要求你在 DNS 中創建一個特定的?TXT 記錄?記錄以驗證域名的所有權。
_acme-challenge.example.com IN TXT "certbot給出的隨機字符串" |
前往你的域名 DNS 管理頁面,添加該記錄后,返回命令行按下?Enter
。
如圖:
?
大概等幾十秒鐘,確保 DNS 記錄在全網傳播開來,Certbot 可以查詢到。
Certbot 在執行驗證時會發起 DNS 查詢,如果能找到所需的 TXT 記錄并驗證其值,認證就會成功,然后就會頒發證書。證書頒發后,這條?TXT 記錄?就可以刪除了。
這個是手動添加刪除 DNS 對應的 TXT 記錄,這里只是演示Certbot頒發證書的過程,實際情況下最好采用自動化腳本添加和刪除 DNS 的 TXT 解析記錄。
🔄 泛域名設置自動續期
Let’s Encrypt 頒發的 SSL 證書有效期為?90 天,為了避免證書過期導致網站 HTTPS 中斷,自動續期?是必須要配置的。對于?泛域名證書,由于使用了?DNS-01 驗證,因此我們也需要使用相應的自動化腳本來管理 DNS TXT 記錄,從而實現自動續期。由于我購買的是騰訊云域名,這里我們以?騰訊云DNSPod?的 API 為例,來配置自動續期。
1.?創建自動化 DNS 腳本
首先,我們需要編寫兩個腳本用于處理?DNS-01?驗證的 DNS 記錄添加和刪除。假設你已經安裝了?騰訊云 CLI 工具 (tccli),,以下是?dnspod.sh
?腳本的內容:
tccli安裝和使用參考?騰訊云 CLI 工具
#!/bin/bash | |
RECORD_FILE="/tmp/_acme-challenge.${CERTBOT_DOMAIN}_${CERTBOT_VALIDATION}" | |
if !?command -v tccli >/dev/null;?then | |
echo?"TCCLI is required: https://cloud.tencent.com/document/product/440" 1>&2 | |
exit 1 | |
fi | |
if [?"$1" =?"clean" ];?then | |
# 刪除 DNS TXT 記錄 | |
RECORD_ID=$(cat?${RECORD_FILE}) | |
if [ -n?"${RECORD_ID}" ];?then | |
tccli dnspod DeleteRecord --cli-unfold-argument \ | |
--Domain?${CERTBOT_DOMAIN} \ | |
--RecordId?${RECORD_ID} \ | |
>/dev/null | |
fi | |
rm -f?${RECORD_FILE} | |
else | |
# 創建 DNS TXT 記錄 | |
RECORD_ID=$( | |
tccli dnspod CreateRecord --cli-unfold-argument \ | |
--Domain?${CERTBOT_DOMAIN} \ | |
--SubDomain _acme-challenge \ | |
--RecordType TXT \ | |
--RecordLine 默認 \ | |
--Value?${CERTBOT_VALIDATION} \ | |
--TTL 600 \ | |
| grep?"RecordId" | grep -Eo?"[0-9]+" | |
) | |
echo?${RECORD_ID} >?${RECORD_FILE} | |
sleep 20?# 等待 DNS 記錄傳播 | |
fi |
腳本中涉及到一些環境變量比如CERTBOT_DOMAIN
、CERTBOT_VALIDATION
等等,這是由certbot自動將相關的環境變量傳遞給這些腳本的。
參考:Certbot DNS驗證前后的鉤子
2.?配置自動續期命令
我們使用?certbot
?的?--manual-auth-hook
?和?--manual-cleanup-hook
?參數,調用?dnspod.sh
?腳本來自動添加和清理 DNS 記錄:
certbot renew --manual --preferred-challenges=dns \ | |
--manual-auth-hook?"/path/to/dnspod.sh" \ | |
--manual-cleanup-hook?"/path/to/dnspod.sh clean" \ | |
--deploy-hook?"/path/to/renew_and_reload_nginx.sh" |
--manual-auth-hook
:在驗證開始時調用,用于創建 DNS TXT 記錄。--manual-cleanup-hook
:在驗證結束后調用,用于清理 DNS TXT 記錄。--deploy-hook
:在證書更新成功后調用,用于重啟并加載 Nginx 最新配置。
3.?配置 Crontab 定期續期任務
編輯?Crontab?文件,添加以下行,實現每 10 天凌晨 2 點自動嘗試續期證書:
0 2 */10 * * root certbot renew --manual --preferred-challenges=dns \ | |
--manual-auth-hook?"/path/to/dnspod.sh" \ | |
--manual-cleanup-hook?"/path/to/dnspod.sh clean" \ | |
--deploy-hook?"/path/to/renew_and_reload_nginx.sh" >> /var/log/certbot-renew.log 2>&1 |
4.?重載 Nginx 配置
以下是?renew_and_reload_nginx.sh
?的內容,用于在證書續期后重啟 Nginx 服務(假設使用 Docker 運行 Nginx):
#!/bin/bash | |
# 停止 nginx 服務 | |
docker compose -f /path/to/compose.yml stop nginx | |
# 重新啟動 nginx 服務 | |
docker compose -f /path/to/compose.yml up -d nginx |
5.?驗證自動續期配置
在完成配置后,可以運行以下命令來測試續期流程,確保一切正常:
certbot renew --manual --preferred-challenges=dns --manual-auth-hook?"/path/to/dnspod.sh" --manual-cleanup-hook?"/path/to/dnspod.sh clean" --deploy-hook?"/path/to/renew_and_reload_nginx.sh" --dry-run |
如果沒有錯誤提示,說明自動續期配置成功。
加上--dry-run表示使用Let's Encrypt的測試服務器。防止多次使用真實服務器頻繁頒發證書達到速率限制
🔍 深入解讀
-
DNS 驗證和自動化挑戰:
- 泛域名證書使用?DNS-01 驗證,即要求在 DNS 中添加?
_acme-challenge
?的 TXT 記錄。這種方式可以驗證你對整個域名的控制權。 - 使用 API 自動管理 DNS 記錄,可以避免手動添加和刪除 TXT 記錄的繁瑣操作,適合生產環境中的自動化需求。
- 泛域名證書使用?DNS-01 驗證,即要求在 DNS 中添加?
-
Crontab 定時任務:
- 由于 Let’s Encrypt 證書有效期為 90 天,我們配置 Crontab 每 10 天嘗試續期一次,以確保在證書到期前完成續期。
- 任務執行日志會被重定向到?
/var/log/certbot-renew.log
,便于后續檢查和調試。
-
Nginx 重載:
- 證書續期后,需要重新加載 Nginx 配置,以使新的證書生效。通過?
docker compose
?管理的 Nginx 服務,可以使用?up -d
?命令實現無中斷重啟。
- 證書續期后,需要重新加載 Nginx 配置,以使新的證書生效。通過?
? 配置完成后的效果
完成上述配置后,你的服務器將能夠自動管理泛域名 SSL 證書,定期續期并自動應用新的證書配置。這將大大降低證書管理的工作量,同時保證網站的 HTTPS 加密連接始終有效。
你可以隨時使用以下命令檢查現有證書的狀態:
sudo certbot certificates |
如果證書信息顯示正確,并且?expiry date
?在未來日期,說明配置成功。
通過自動化腳本和 Certbot 工具的結合,你已經為你的泛域名 SSL 證書實現了從申請、安裝到續期的全流程自動化,讓你的網站可以輕松保持 HTTPS 安全連接。
📁 申請的 SSL 證書文件所在目錄
當使用?Certbot?成功申請到 SSL 證書后,證書文件將默認保存在以下目錄中:
/etc/letsencrypt/live/your-domain-name/ |
具體包含以下幾個文件:
cert.pem
:這是你的?SSL 證書?文件。privkey.pem
:這是你的?私鑰?文件,務必妥善保管,切勿泄露。chain.pem
:這是?中間證書鏈?文件,用于驗證證書的完整性。fullchain.pem
:這是?完整證書鏈?文件,通常用于 Nginx 或 Apache 的 SSL 配置中。
例如,如果你的域名是?example.com
,則目錄路徑為:
/etc/letsencrypt/live/example.com/ |
你可以使用以下命令查看證書詳細信息:
sudo certbot certificates |
輸出示例:
Certificate Name: example.com | |
Domains: example.com www.example.com | |
Expiry Date: 2024-02-10 14:30:00+00:00 (VALID: 75 days) | |
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem | |
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem |
提示:為了避免證書路徑錯誤,建議在 Nginx 或 Apache 配置中直接使用?
fullchain.pem
?和?privkey.pem
?兩個文件。
nginx配置證書示例
server { | |
listen?80; | |
server_name example.com www.example.com; | |
location / { | |
return?301 https://$host$request_uri; | |
} | |
} | |
server { | |
listen?443 ssl; | |
server_name example.com www.example.com; | |
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; | |
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; | |
location / { | |
proxy_pass http://127.0.0.1:8080; | |
} | |
} |
如果使用docker nginx,可以通過docker掛載卷使用證書,比如我就是這樣使用的:
compose.yml:
services: | |
nginx: | |
image:?nginx:latest | |
networks: | |
-?spy | |
ports: | |
-?"80:80" | |
-?"443:443" | |
environment: | |
-?TZ=Asia/Shanghai?# 設置為上海時區 | |
volumes: | |
# 主配置 | |
-?./nginx/nginx.conf:/etc/nginx/nginx.conf:rw | |
# include配置 | |
-?./nginx/conf.d/:/etc/nginx/conf.d/:rw | |
# 證書 | |
-?/etc/letsencrypt/live/spystudy.cn/fullchain.pem:/etc/ssl/certs/spystudy.cn/fullchain.pem:rw | |
-?/etc/letsencrypt/live/spystudy.cn/privkey.pem:/etc/ssl/certs/spystudy.cn/private.pem:rw | |
# 日志 | |
-?./nginx/logs/:/var/log/nginx/:rw |
然后nginx配置文件:
server { | |
listen 443 ssl; | |
server_name spystudy.cn; | |
ssl_certificate /etc/ssl/certs/spystudy.cn/fullchain.pem; | |
ssl_certificate_key /etc/ssl/certs/spystudy.cn/private.pem; | |
return 301 https://www.spystudy.cn$request_uri; | |
} |
🔍 驗證 HTTPS 配置
證書安裝完成后,可以通過訪問?https://example.com
?檢查是否成功啟用了 HTTPS。你也可以使用以下命令查看證書狀態:
sudo certbot certificates |
如果證書信息顯示正確,并且?expiry date
?在未來日期,說明配置成功。
🛡? 常見問題及解決方法
1.?DNS 驗證失敗
檢查 DNS 記錄是否添加正確,并確保記錄已完全傳播,可以使用以下命令查看 DNS 解析狀態:
nslookup -q=txt _acme-challenge.example.com |
2.?Nginx 配置沖突
如果 Certbot 無法自動修改 Nginx 配置文件,你可以手動更新 Nginx 配置文件(/etc/nginx/sites-available/default
):
server { | |
listen?80; | |
server_name example.com www.example.com; | |
location / { | |
return?301 https://$host$request_uri; | |
} | |
} | |
server { | |
listen?443 ssl; | |
server_name example.com www.example.com; | |
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; | |
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; | |
include /etc/letsencrypt/options-ssl-nginx.conf; | |
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; | |
location / { | |
proxy_pass http://127.0.0.1:8080; | |
} | |
} |
保存并測試 Nginx 配置:
sudo nginx -t | |
sudo systemctl reload nginx |
🎉 總結
通過本文的教程,你已經學會了如何使用?Let’s Encrypt?免費獲取 SSL 證書,包括?單域名?和?泛域名?的配置,并且實現了?自動續期。此外,你還了解了?Certbot?工具的作用及工作原理。現在,你可以輕松為你的網站配置 HTTPS,保障用戶的安全體驗,如果你在配置證書過程中遇到任何問題,歡迎在下方留言。
如果你覺得這篇文章對你有所幫助,歡迎分享給更多需要的朋友!
🔗 參考鏈接
- Let’s Encrypt 官方網站
- Certbot 官方文檔
- ACME 協議介紹