SSL 證書申請教程:免費證書、acme.sh 與自動續期步驟
SSL 證書申請有三條路:只有一兩個網站,在雲服務商控制檯領免費 DV 證書最省事;伺服器能自己跑命令,用 acme.sh 或 certbot 申請 Let's Encrypt 證書,續期全自動,還能籤萬用字元;需要在證書裡寫明單位名稱的,生成 CSR 購買 OV 或 EV 證書。無論哪條路,第一步都是向簽發機構證明你控制這個域名。
SSL 證書申請的流程可以概括為四步:選簽發渠道 → 證明域名歸你控制 → 簽發 → 安裝到伺服器並安排續期。渠道有三種,差別主要在驗證內容、能否籤萬用字元和續期方式上:
| 申請途徑 | 證書型別 | 萬用字元 | 簽發速度 | 續期 | 適合 |
|---|---|---|---|---|---|
| 雲服務商控制檯的免費證書 | DV,多為單域名 | 一般不支援 | 驗證透過後幾分鐘到幾小時 | 多數要到期前手動重新申請 | 網站少、證書要部署到同一家的 CDN 或負載均衡 |
| acme.sh、certbot 申請 Let’s Encrypt 等免費證書 | DV,一張可含多個域名 | 支援,須 DNS 驗證 | 幾十秒 | 定時任務自動續期 | 有 SSH 許可權的雲伺服器、VPS、獨立伺服器 |
| 購買付費證書 | DV、OV、EV | 支援 | DV 很快,OV、EV 需人工稽核,按工作日計 | 服務期內到期前重新簽發 | 需要證書裡顯示單位資訊,或合同、平台明確要求 OV/EV |
加密強度和證書收不收費無關,由金鑰演算法和伺服器的 TLS 配置決定。下面先講三條路共用的域名驗證,再逐條給出操作步驟。
先選驗證方式:檔案、DNS 還是郵件
簽發機構(CA)不會只憑你填的表就簽發證書,必須先完成域名控制權驗證。常用的有三種:
| 驗證方式 | 怎麼證明 | 前提條件 | 能籤萬用字元 | 適合 |
|---|---|---|---|---|
| 檔案驗證(ACME 裡叫 HTTP-01) | CA 從公網存取 http://域名/.well-known/ 下的指定檔案 |
域名已解析到這台伺服器,80 連接埠對公網開放 | 不能 | 網站已上線,只有一台伺服器 |
| DNS 驗證(DNS-01) | 在域名解析裡新增 CA 指定的 TXT 或 CNAME 記錄 | 能修改 DNS 記錄 | 能 | 萬用字元證書、網站還沒上線、多台伺服器、站點在 CDN 後面 |
| 郵件驗證 | CA 向 admin@、administrator@、webmaster@、hostmaster@、postmaster@ 之一發確認郵件 | 能收這些郵箱的信 | 付費證書一般可以 | 正在被淘汰,見下文 |
選擇的原則很簡單:要籤萬用字元、或者 80 連接埠進不來(站點掛在 CDN 後面、內網伺服器),就用 DNS 驗證;其他情況檔案驗證最省事。郵件驗證不要再作為首選:CA/瀏覽器論壇的基線要求規定,2026 年 3 月 15 日起不應再用郵件方式驗證域名,2028 年 3 月 15 日起禁止使用,以前透過郵件完成的驗證屆時也不能再用於簽發。
還有一項容易忽略的檢查:CAA 記錄。它規定哪些 CA 可以為這個域名簽發證書。沒有 CAA 記錄時任何 CA 都能籤;一旦設定了,就必須包含你這次用的 CA,否則簽發會被直接拒絕:
dig +short example.com CAA
# 有輸出且其中沒有 letsencrypt.org,就要先加一條,例如:
# example.com. CAA 0 issue "letsencrypt.org"
方法一:在雲服務商控制檯申請免費 DV 證書
雲廠商的“SSL 證書”產品裡通常有免費證書額度,名稱有“免費證書”“個人測試證書”“DV 單域名證書”等。流程大同小異:
- 領取額度,建立證書申請。免費證書一般一張只繫結一個域名,不支援萬用字元,根域名和 www 是否要分別申請、每年能領多少張、有效期多長,以控制檯說明為準。
- 填寫域名和聯絡人資訊,選擇驗證方式。域名的 DNS 也託管在同一家雲廠商的,選“自動 DNS 驗證”,系統會自己新增驗證記錄;否則按頁面給出的主機記錄(常見為
_dnsauth)和記錄值手動新增 TXT 記錄,或者下載驗證檔案,放到網站根目錄的.well-known/pki-validation/下。 - 提交稽核,等待簽發。驗證記錄生效後點“驗證”,透過後一般幾分鐘到幾小時簽發。
- 按伺服器型別下載。下載包裡按 Nginx、Apache、IIS、Tomcat 分好了格式;證書要用在同一家的 CDN、負載均衡上的,直接用控制檯的“部署”功能,不用下載。
- 記下到期日。免費證書到期前多半要重新申請、重新部署一遍;有的雲廠商提供自動續期或託管部署服務,是否收費以其說明為準。
驗證總是不透過時,用下面兩條命令從外部看 CA 能看到什麼:
# DNS 驗證:記錄要能查到,且值與控制檯給出的完全一致
dig +short TXT _dnsauth.example.com
# 檔案驗證:必須返回 200 和檔案內容,被跳轉到 https 或返回 404 都可能失敗
curl -i http://www.example.com/.well-known/pki-validation/驗證檔名.txt
方法二:用 acme.sh 申請 Let’s Encrypt 證書並自動續期
acme.sh 是一個純 Shell 寫的 ACME 客戶端,不依賴 Python,裝在普通使用者或 root 下都可以。以下以 Nginx、網站目錄 /var/www/example.com 為例。
安裝 acme.sh,切換到 Let’s Encrypt
curl https://get.acme.sh | sh -s [email protected]
source ~/.bashrc
acme.sh --set-default-ca --server letsencrypt
伺服器存取 GitHub 不穩定、安裝指令碼下載失敗的,可以改用國內映象倉庫安裝:
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh && ./acme.sh --install -m [email protected]
檔案驗證申請證書
先在測試環境跑通。Let’s Encrypt 對正式環境有頻率限制:同一帳號對同一個域名每小時最多驗證失敗 5 次,完全相同的一組域名 7 天內最多簽發 5 張,反覆試錯很容易被暫時擋住。
# 測試環境:簽出的證書不受信任,只用來確認流程沒問題
acme.sh --issue --staging -d example.com -d www.example.com -w /var/www/example.com
# 測試透過後正式申請;--force 用來覆蓋剛才的測試證書
acme.sh --issue -d example.com -d www.example.com -w /var/www/example.com --force
-w 填的是 Nginx 中這個站點的 root 目錄,acme.sh 會把驗證檔案寫到它下面的 .well-known/acme-challenge/。站點是反向代理、沒有靜態目錄的,在 80 連接埠的 server 塊裡單獨給驗證路徑指定一個目錄,申請時 -w 填 /var/www/acme:
location ^~ /.well-known/acme-challenge/ {
root /var/www/acme;
}
安裝到 Nginx,續期後自動過載
證書籤發在 ~/.acme.sh/ 目錄下,不要讓 Nginx 直接引用那裡的檔案,用 --install-cert 複製到固定位置,並登記續期後要執行的過載命令:
mkdir -p /etc/nginx/ssl
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.com.key \
--fullchain-file /etc/nginx/ssl/example.com.fullchain.pem \
--reloadcmd "systemctl reload nginx"
Nginx 的 443 server 塊裡引用這兩個檔案:
ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
安裝 acme.sh 時已經新增了一條每天執行的 cron 任務,到了續期時間會自動續期、複製檔案、執行 --reloadcmd。確認一下:
crontab -l | grep acme.sh # 應看到一條帶 --cron 的任務
acme.sh --list # 列出證書、所含域名和續期時間
萬用字元證書:用 DNS API 自動驗證
萬用字元證書只能用 DNS 驗證。acme.sh 能呼叫主流 DNS 服務商的介面自動新增、刪除 TXT 記錄,續期時同樣無人值守。以阿里雲解析為例:
# 用只授予了雲解析許可權的子帳號 AccessKey,不要用主帳號
export Ali_Key="子帳號 AccessKey ID"
export Ali_Secret="子帳號 AccessKey Secret"
acme.sh --issue --dns dns_ali -d example.com -d '*.example.com'
*.example.com 只覆蓋一級子域名,不含 example.com 本身,所以根域名要一起寫上。其他常見 DNS 服務商的引數:
| DNS 服務商 | --dns 引數 |
需要匯出的變數 |
|---|---|---|
| 阿里雲解析 | dns_ali | Ali_Key、Ali_Secret |
| DNSPod(DNSPod Token) | dns_dp | DP_Id、DP_Key |
| 騰訊雲(API 金鑰) | dns_tencent | Tencent_SecretId、Tencent_SecretKey |
| Cloudflare | dns_cf | CF_Token,以及 CF_Account_ID 或 CF_Zone_ID |
第一次申請成功後,這些金鑰會儲存在 ~/.acme.sh/ 下的配置檔案裡(多數在 account.conf)供續期使用,整個目錄都要當作密碼一樣保護。DNS 服務商沒有 API 的,可以用手動 DNS 模式簽發,但續期也得手動加記錄,不適合長期使用。
習慣用 certbot 的寫法
certbot certonly --webroot -w /var/www/example.com -d example.com -d www.example.com \
--deploy-hook "systemctl reload nginx"
systemctl list-timers | grep certbot # 確認續期定時器存在
certbot renew --dry-run # 模擬續期
證書在 /etc/letsencrypt/live/example.com/ 下,Nginx 引用其中的 fullchain.pem 和 privkey.pem。certbot 籤萬用字元要裝對應 DNS 服務商的外掛;用 --manual 手動模式簽出來的證書,沒有配置驗證鉤子指令碼時不能自動續期。
方法三:付費 OV、EV 證書的 CSR 與資料提交
付費證書的流程是:生成私鑰和 CSR → 下單並提交 CSR → 域名驗證 → 單位驗證(OV、EV)→ 下載證書安裝。
私鑰在哪生成,就留在哪。CSR 裡只包含公鑰和申請資訊,私鑰從不發給 CA。在將要使用證書的伺服器上生成:
# ECC P-256 私鑰;要相容很老的客戶端時改用 RSA:openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out example.com.key
openssl req -new -key example.com.key -out example.com.csr \
-subj "/C=CN/ST=Guangdong/L=Shenzhen/O=Example Technology Co., Ltd./CN=www.example.com" \
-addext "subjectAltName=DNS:www.example.com,DNS:example.com"
# 提交前核對主題和域名
openssl req -in example.com.csr -noout -text | grep -E "Subject:|DNS:"
-addext 需要 OpenSSL 1.1.1 或更新版本。各欄位的填法:
| 欄位 | 含義 | 填寫要求 |
|---|---|---|
| C | 國家程式碼 | 中國內地填 CN |
| ST、L | 省、市 | 與營業執照上的註冊地一致,用拼音或英文 |
| O | 單位名稱 | OV、EV 必須與營業執照名稱一致,中英文寫法按簽發機構要求 |
| CN | 主域名 | 如 www.example.com;DV 證書只看域名,O 等欄位不會寫進證書 |
| subjectAltName | 證書覆蓋的全部域名 | 最終以下單時填寫的域名為準 |
| OU | 部門 | 不要填。公開信任的證書自 2022 年 9 月起已不再包含 OU 欄位 |
單位驗證要準備的東西。OV 證書:營業執照、申請人姓名和聯絡方式;CA 會核對單位在公開的企業資訊資料庫裡是否真實存在、處於正常經營狀態,並透過可查證的電話或郵箱聯絡申請人確認。EV 證書在此基礎上核對得更嚴,通常還要提交簽字蓋章的申請材料,確認申請人有權代表單位。資料齊全、電話能接通,稽核會快很多。
簽發後下載證書時選對伺服器型別,安裝時證書要和當初生成 CSR 的那把私鑰配對。如果用的是簽發機構或代理商網站上的“線上生成 CSR”,私鑰由網站代為生成,務必當場下載儲存,丟了就只能重新生成 CSR、重新簽發;對私鑰保管要求高的,還是在自己的伺服器上生成。
crt、key、pem、pfx 檔案格式有什麼區別
證書檔案的副檔名很亂,判斷依據是裡面裝了什麼、用什麼編碼:
| 檔案 | 裡面是什麼 | 編碼 | 用在哪裡 |
|---|---|---|---|
| .pem | 證書、私鑰或證書鏈都可以,只是一個容器名 | Base64 文字,以 -----BEGIN 開頭 |
Nginx、Apache 等 Linux 軟體 |
| .crt、.cer | 證書 | 多數是 PEM 文字;Windows 匯出的 .cer 常是二進位制 DER | Linux 上用 PEM 格式 |
| .key | 私鑰 | PEM 文字 | 與證書配對,許可權設為僅 root 可讀 |
| .csr | 證書籤名請求 | PEM 文字 | 只在申請時用,簽發後就沒用了 |
| fullchain.pem、ca-bundle | 證書鏈 | PEM 文字 | fullchain 是伺服器證書加中間證書;ca-bundle、chain 只有中間證書 |
| .pfx、.p12 | 證書、私鑰和證書鏈打成一個包,帶密碼 | 二進位制 PKCS#12 | IIS、Windows,部分 Java 程式 |
| .jks | Java 金鑰庫 | 二進位制 | 老版本 Tomcat |
Nginx 的 ssl_certificate 要的是“伺服器證書在前、中間證書在後”的完整鏈檔案,只放伺服器證書會導致部分客戶端報證書不受信任。幾個常用的檢視和轉換命令:
head -1 example.com.crt # 有 -----BEGIN CERTIFICATE----- 就是 PEM,亂碼就是 DER
openssl x509 -in example.com.crt -noout -subject -issuer -dates -ext subjectAltName
openssl x509 -inform der -in example.com.cer -out example.com.pem # DER 轉 PEM
openssl pkcs12 -in example.com.pfx -clcerts -nokeys -out example.com.crt # 從 PFX 取出證書
openssl pkcs12 -in example.com.pfx -nocerts -nodes -out example.com.key # 從 PFX 取出私鑰
OpenSSL 3 開啟老版本 Windows 匯出的 PFX 時如果報演算法不支援,在 pkcs12 命令後加 -legacy 再試。
有效期越來越短:用自動續期代替手工換證
按照 CA/瀏覽器論壇的 SC-081 決議,公開信任證書的單張最長有效期在逐步縮短:
| 簽發日期 | 單張證書最長有效期 |
|---|---|
| 2026 年 3 月 15 日起 | 200 天 |
| 2027 年 3 月 15 日起 | 100 天 |
| 2029 年 3 月 15 日起 | 47 天 |
Let’s Encrypt 目前預設簽發 90 天證書,官方公佈的計劃是 2027 年 2 月起預設改為 64 天,2028 年 2 月起改為 45 天。付費證書也因此改成按“服務期”銷售,服務期內每隔一段時間就要重新簽發、重新安裝,具體規則以簽發機構條款為準。
對維運的影響是:手工換證的頻率會越來越高,漏換一次網站就打不開。能自動化的儘量自動化:伺服器上用 acme.sh 或 certbot 的定時任務,CDN 和負載均衡上用雲廠商的託管證書;付費證書至少把到期日寫進監控,按有效期留出足夠的提前量。
自動續期的客戶端也要跟上。Let’s Encrypt 提醒,固定 60 天續期一次的做法,在證書縮短到 64 天、45 天后就不夠用了;新版 acme.sh 已支援 ACME 續期資訊(ARI),由 CA 告訴客戶端什麼時候該續,執行 acme.sh --upgrade 即可升級,certbot 也要保持為新版本。Let’s Encrypt 已經停發證書到期提醒郵件,不要把希望寄託在郵箱上。
常見問題
申請 SSL 證書一定要先有伺服器嗎?
不一定。DNS 驗證只要求你能修改域名解析,證書籤發後再裝到伺服器、CDN 或負載均衡上都可以;只有檔案驗證和 acme.sh 的 webroot 方式,要求域名已經指向一台 80 連接埠能從公網存取的伺服器。
同一張證書能裝在多台伺服器上嗎?
能。證書和私鑰就是兩個檔案,複製到負載均衡後面的每台 Web 伺服器即可。代價是私鑰分發得越多越容易洩露,續期後每台都要同步替換,最好用指令碼統一下發,或者把證書只放在負載均衡上。
acme.sh 預設用的是 Let's Encrypt 嗎?
不是。acme.sh 新版本預設的簽發機構是 ZeroSSL,同樣免費、同樣被主流瀏覽器信任,首次使用需要用郵箱註冊帳號。不切換也能正常申請,只是頻率限制、測試環境等規則要看 ZeroSSL 的說明;域名設定了 CAA 記錄的,要把實際使用的簽發機構加進去。