服务器租用与托管

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