一. Let’s Encrypt 介紹
Let’s Encrypt 是當前最常用的免費 HTTPS 證書生成工具之一。該服務由非營利組織提供,致力于為全球范圍內的網站提供便捷的自動化證書頒發服務。雖然 Let’s Encrypt 證書的有效期只有90天,但是可以自動續期,這使得 Let’s Encrypt 更加易于使用和部署。
在使用 Let’s Encrypt 生成證書時,可以使用 Certbot 工具來執行此任務。下面是一個示例命令,用于生成證書:
首先確保你有一個合法可用的域名,example.com替換為你的域名
sudo certbot certonly \ --email example@qq.com \--server https://acme-v02.api.letsencrypt.org/directory \--agree-tos \--manual \--preferred-challenges=dns \-d example.com \-d www.example.com
- certbot: Certbot 工具名稱,certonly: Certbot 工具的插件,用于生成 SSL/TLS 證書。
- –email example@qq.com: Let’s Encrypt 要求在生成 SSL 證書時提供有效的聯系電子郵件地址。
- –server https://acme-v02.api.letsencrypt.org/directory: Certbot 生成證書的 ACME 服務器。這里使用 Let’s Encrypt v2 API 端點。
- –agree-tos:同意 Let’s Encrypt 的服務條款。
- –manual:指定使用手動模式生成證書。這意味著您需要在命令提示符下手動操作來驗證您擁有該域名。
- –preferred-challenges=dns:指定 Certbot 使用 DNS 驗證方式進行證書頒發。這表示您需要將一個特定的 TXT 記錄添加到 DNS 進行驗證。
- -d ‘example.com’:指定您想要為其生成 SSL 證書的域名。你可以通過添加多個 -d 選項來同時為多個域名生成證書。
請注意,由于 --manual 選項需要手動操作,因此它可能比其他選項耗費更多時間。另外,使用 DNS 驗證時需要在 DNS 服務商處添加 TXT 記錄以實現驗證,這在某些情況下可能會比較困難,也需要等待 DNS 緩存刷新。在選擇選項時,請根據您的需求和特定情況來作出最合適的選擇。
我們可以把 --manual --preferred-challenges=dns 替換成–preferred-challenges http-01并配置 Nginx 服務器的相應設置,使用 HTTP 驗證方式生成證書。
二. 生成證書的詳細流程
在 Linux 上使用 Certbot 來獲取并自動續期 Let’s Encrypt 的 SSL 證書是一個很好的選擇,因為 Certbot 是由 Electronic Frontier Foundation (EFF) 支持的官方客戶端。下面是詳細的步驟:
1. 安裝 Certbot
首先,你需要在你的 Linux 系統上安裝 Certbot。安裝方法取決于你使用的 Linux 發行版。以下是一些常見的 Linux 發行版的安裝指令:
對于 Ubuntu/Debian 系統:
sudo apt updatesudo apt install certbot
對于 CentOS/RHEL 系統:
sudo yum install epel-releasesudo yum install certbot
對于 Fedora 系統:
sudo dnf install certbot
2. 使用以下命令生成證書:
sudo certbot certonly \
--email example@qq.com \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos \
--manual \
--preferred-challenges=dns \
-d example.com \
-d *.example.com
請將 example@qq.com 替換為您自己的電子郵件地址,并使用您要生成證書的域名把 example.com 和 www.example.com替換成你自己的。
這里輸入它并等待幾分鐘以允許記錄傳播并進行驗證。一旦您添加了DNS記錄,該命令將在 /etc/letsencrypt 目錄中生成通配符證書。
注意: Certbot將提示您為該域名添加DNS TXT記錄。請使用您的DNS提供商或托管服務提供商的管理面板或API添加記錄, 你國內買的域名就在公有云廠商控制臺域名管理上配置,自己登錄界面多找找,我是在注冊域名服務商這里添加的DNS TXT記錄
如果成功的話,它會生成兩個文件:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem
3. 手動續期
Certbot 是申請的Let’s Encrypt的免費證書,有效期 3 個月,到期之后我們可以再次續期,達到永久免費的效果。
你只需要在到期前,再手動執行生成證書的命令,也就是以上步驟2,就ok啦。
4. 自動續期
4.1 方法1:使用DNS插件
如果你的 DNS 提供商支持 API 訪問,最好的解決方案是使用 Certbot 的 DNS 插件,這些插件可以自動處理 DNS 記錄的更改。例如,如果你使用的是 Cloudflare,你可以安裝和使用 Certbot 的 Cloudflare 插件:
-
安裝插件:
sudo apt-get install python3-certbot-dns-cloudflare
-
配置 DNS API:
創建一個 API 令牌并保存到一個安全的配置文件中,比如 cloudflare.ini,并設置適當的權限:
如果使用全局 API 密鑰:dns_cloudflare_email = your-email@example.comdns_cloudflare_api_key = your-api-key
如果使用 API 令牌:
dns_cloudflare_api_token = your-api-token
-
確保文件權限正確:
chmod 600 cloudflare.ini
-
修改續期命令:
使用 DNS 插件重新獲取證書,并設置自動續期:certbot renew --dns-cloudflare --dns-cloudflare-credentials /path/to/cloudflare.ini
驗證:
4.2 方法2:提供認證鉤子腳本
如果你沒有使用支持 API 的 DNS 提供商,或者你更愿意繼續使用手動模式,你需要創建一個腳本來自動處理 DNS 記錄的驗證。以下是一個來自cloudflare DNS提供商簡單的示例:
- 創建認證腳本(例如 auth-hook.sh):
#!/bin/bash
# Cloudflare API 設置
API_TOKEN="your_cloudflare_api_token"
ZONE_ID="your_zone_id" # Cloudflare Zone ID
DNS_RECORD_NAME="_acme-challenge.$CERTBOT_DOMAIN."
# 創建或更新 DNS TXT 記錄
RESPONSE=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \-H "Authorization: Bearer $API_TOKEN" \-H "Content-Type: application/json" \--data '{"type":"TXT","name":"'"$DNS_RECORD_NAME"'","content":"'"$CERTBOT_VALIDATION"'","ttl":120}')
# 檢查 Cloudflare API 是否成功響應
SUCCESS=$(echo $RESPONSE | jq .success)
if [[ $SUCCESS != "true" ]]; then
echo "Failed to update DNS records."
echo "API Response: $RESPONSE"
exit 1
fi
# 休眠以等待 DNS 更改傳播
sleep 30
腳本說明
腳本使用 Cloudflare 的 API 接口創建一個 TXT 記錄,用于 Let’s Encrypt 的 DNS-01 驗證。
-使用 curl 發送 HTTP POST 請求到 Cloudflare 的 API 端點,以添加 DNS 記錄。
-使用 jq 解析 JSON 響應以檢查操作是否成功。
-在驗證之前等待 30 秒,以確保 DNS 更改已足夠傳播。
-
設置腳本權限
給腳本文件設置執行權限:chmod +x auth-hook.sh
-
使用腳本續訂證書
在 Certbot 命令中指定這個腳本作為認證鉤子:certbot certonly --manual --preferred-challenges=dns \--manual-auth-hook /path/to/auth-hook.sh -d "example.com" -d "*.example.com"
以上都可以在命令后加上 --dry-run 后綴進行測試,測試完成后刪除 --dry-run
4.3 使用crontab 進行調度
我這邊nginx用的是docker環境,需要把生成的證書同步到容器內。
- 編輯腳本 automatic_certificate_renewal.sh
#!/bin/bash
# 更新證書
# 方法1
/usr/bin/certbot renew --dns-cloudflare --dns-cloudflare-credentials /opt/cmd/cloudflare/cloudflare.ini
# 方法2
# /usr/bin/certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /opt/cmd/cloudflare/auth-hook.sh -d "byteromance.com" -d "*.byteromance.com"
# 覆蓋證書文件
cp /etc/letsencrypt/live/byteromance.com/privkey.pem /data/wordpress/wp_nginx/certs
cp /etc/letsencrypt/live/byteromance.com/fullchain.pem /data/wordpress/wp_nginx/certs
docker restart wp_nginx
- 設置crontab調度
0 0 1 * * bash /opt/cmd/automatic_certificate_renewal.sh > /opt/cmd/log/cert/logfile_$(date "+\%Y\%m\%d").log 2>&1
三. 配置HTTPS
在生成證書后,使用以下方法之一來配置您的HTTPS,這里不作詳細的介紹。
-
對于Apache服務器:
# 在您的虛擬主機文件中添加以下行: SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
-
對于NGINX服務器:
# 在您的虛擬主機文件中添加以下行: ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
🔥運維干貨分享
-
系統規劃與管理師備考經驗分享
-
軟考高級系統架構設計師備考學習資料
-
軟考中級數據庫系統工程師學習資料
-
軟考高級網絡規劃設計師備考學習資料
-
Kubernetes CKA認證學習資料分享
-
AI大模型學習資料合集
-
免費文檔翻譯工具(支持word、pdf、ppt、excel)
-
PuTTY中文版安裝包
-
MobaXterm中文版安裝包
-
pinginfoview網絡診斷工具中文版
-
Xshell、Xsftp、Xmanager中文版安裝包
-
辦公室摸魚神器,偽裝電腦系統更新中
-
Typora簡單易用的Markdown編輯器
-
Window進程監控工具,能自動重啟進程和卡死檢測
-
畢業設計高質量畢業答辯 PPT 模板分享
-
IT行業工程師面試簡歷模板分享