# Let's Encrypt 证书配置文件：classic、tlsserver、shortlived

> 选择 Let's Encrypt 证书配置文件（classic、45 天 tlsserver、6 天 shortlived），并在 Certbot、acme.sh、lego、Caddy、Traefik、cert-manager 中配置。

Source: https://ssl.sh/zh/guides/lets-encrypt-certificate-profiles/
Last updated: 2026-11-10

Let's Encrypt 的证书配置文件（profile）有三种：默认的 classic、45 天的 tlsserver 和 160 小时的 shortlived。在 ACME 客户端里写上配置文件名就能切换，续期时间要跟着有效期调整。

配置文件选择基于 IETF 的 ACME profiles 草案，支持的客户端版本：Certbot 4.0+、acme.sh 3.1.2+、lego v5、Caddy 2（实验性选项）、Traefik v3、cert-manager 1.18+、Nginx ACME 模块 0.3.0+。

## 前提条件

配置文件决定证书多短命，所以续期必须已经全自动。

- ACME 客户端版本不低于上面列出的版本。
- 续期任务至少每天运行一次；用 `shortlived` 时每天两次更稳妥。
- 业务系统不依赖证书主题里的 Common Name（对 `tlsserver` 和 `shortlived` 而言）。

## 第一步：对比三种配置文件

三种配置文件的区别在有效期、名称数量和是否包含 Common Name，不指定时用 `classic`。

| 配置文件 | 有效期 | 名称数量 | Common Name | 说明 |
|---|---|---|---|---|
| `classic` | 90 天；2027-02-10 起 64 天；2028-02-16 起 45 天 | 最多 100 个 DNS 名称 | 包含 | 不指定时的默认值 |
| `tlsserver` | 45 天 | 最多 25 个 DNS 名称 | 不含 | 域名验证结果只复用 7 小时 |
| `shortlived` | 160 小时 | 最多 25 个 DNS 名称或 IP | 不含 | 不需要吊销信息 |

原来的 `tlsclient` 配置文件已于 2026 年 7 月 8 日下线，`classic` 从 2026 年 2 月 11 日起不再包含 TLS 客户端认证 EKU。客户端证书请改用私有 CA。

## 第二步：查看服务器提供的配置文件

ACME 目录的 `profiles` 字段列出服务器当前提供的配置文件：

```bash
curl -s https://acme-v02.api.letsencrypt.org/directory | python3 -m json.tool | grep -A6 '"profiles"'
```

测试环境目录 `https://acme-staging-v02.api.letsencrypt.org/directory` 提供同样的配置文件，可以先在那里测试。

## 第三步：在客户端里配置

每个客户端都用一个参数或配置项指定配置文件名，示例统一用 `tlsserver`。

**Certbot 4.0+**（4.1 起会把选择保存到续期配置）：

```bash
sudo certbot certonly --nginx -d example.com --preferred-profile tlsserver
```

用 `--required-profile` 时，服务器不提供该配置文件就直接报错，而不是退回默认值。

**acme.sh 3.1.2+**：

```bash
acme.sh --issue --server letsencrypt -d example.com --dns dns_ali --cert-profile tlsserver
```

**lego v5**：

```bash
lego run --accept-tos --path /etc/lego --dns alidns -d example.com --profile tlsserver
```

**Caddy**（官方标为实验性）：

```caddy
example.com {
    tls {
        issuer acme {
            profile tlsserver
        }
    }
}
```

**Traefik v3** 静态配置（同时把 `certificatesDuration` 设为有效期小时数，续期时间才对得上）：

```yaml
certificatesResolvers:
  le:
    acme:
      email: admin@example.com
      storage: /letsencrypt/acme.json
      profile: tlsserver
      certificatesDuration: 1080
      httpChallenge:
        entryPoint: web
```

**cert-manager 1.18+**（Issuer 或 ClusterIssuer 的 `spec.acme.profile`）：

```yaml
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    profile: tlsserver
```

**Nginx ACME 模块 0.3.0+**，写在 `acme_issuer` 块里：

```nginx
profile tlsserver;
```

## 验证

切换到 `tlsserver` 后，新证书的有效期是 45 天，主题为空（没有 CN）。下次签发后，用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 或终端确认：

```bash
curl ssl.sh/example.com
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -dates
```

[有效期计算器](https://ssl.sh/zh/tools/validity-calculator/) 可以算出应该何时续期。

## 自动续期

配置文件越短，续期调度越关键。Certbot 4.0+ 在剩余三分之一有效期时续期（有效期不足 10 天时为一半），4.1+ 按 ARI 续期；acme.sh 3.1.4+ 和 lego v5 默认按 ARI；Caddy 也支持 ARI。删掉写死的“到期前 30 天续期”设置：对 45 天证书几乎每次都会续期，对 6 天证书则做不到。acme.sh 3.1.5 起显式的 `--days` 会覆盖 ARI，没有必要就不要设置。把域名加到 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中），续期卡住时几天内就能发现。

## 常见问题排查

- **account is not permitted to use certificate profile**：这个配置文件没有对你的账户或环境开放，查看目录列表和 Let's Encrypt 公告。
- **unrecognized arguments: --preferred-profile** 之类：客户端版本太旧，不支持配置文件，升级即可。
- **6 天证书显示下次续期在 60 天后**：客户端按 90 天有效期估算，依靠 ARI 或显式设置续期时间，并用监控确认。
- **老系统提示证书主题为空**：它在读 CN，修改程序，或在 2027 年 2 月前继续用 `classic`。
- **客户端证书认证失效**：见 [客户端认证 EKU 被移除](https://ssl.sh/zh/errors/client-auth-eku-removed/)。
- **测试时订单太多被限制**：改用测试环境，见 [Let's Encrypt 频率限制](https://ssl.sh/zh/errors/lets-encrypt-rate-limit/)。
