伺服器租用與託管

SSL 證書申請教程:免費證書、acme.sh 與自動續期步驟

SSL 證書申請有三條路:只有一兩個網站,在雲服務商控制檯領免費 DV 證書最省事;伺服器能自己跑命令,用 acme.sh 或 certbot 申請 Let's Encrypt 證書,續期全自動,還能籤萬用字元;需要在證書裡寫明單位名稱的,生成 CSR 購買 OV 或 EV 證書。無論哪條路,第一步都是向簽發機構證明你控制這個域名。

作者 頂聯產品團隊發布於 7 分鐘閱讀

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 單域名證書”等。流程大同小異:

  1. 領取額度,建立證書申請。免費證書一般一張只繫結一個域名,不支援萬用字元,根域名和 www 是否要分別申請、每年能領多少張、有效期多長,以控制檯說明為準。
  2. 填寫域名和聯絡人資訊,選擇驗證方式。域名的 DNS 也託管在同一家雲廠商的,選“自動 DNS 驗證”,系統會自己新增驗證記錄;否則按頁面給出的主機記錄(常見為 _dnsauth)和記錄值手動新增 TXT 記錄,或者下載驗證檔案,放到網站根目錄的 .well-known/pki-validation/ 下。
  3. 提交稽核,等待簽發。驗證記錄生效後點“驗證”,透過後一般幾分鐘到幾小時簽發。
  4. 按伺服器型別下載。下載包裡按 Nginx、Apache、IIS、Tomcat 分好了格式;證書要用在同一家的 CDN、負載均衡上的,直接用控制檯的“部署”功能,不用下載。
  5. 記下到期日。免費證書到期前多半要重新申請、重新部署一遍;有的雲廠商提供自動續期或託管部署服務,是否收費以其說明為準。

驗證總是不透過時,用下面兩條命令從外部看 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 記錄的,要把實際使用的簽發機構加進去。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88