# AH02572：Apache 证书和私钥配置失败的修法

> Apache 启动报 AH02572 Failed to configure at least one certificate and key，说明 mod_ssl 没加载到可用的证书私钥对。看它上一行的具体原因，再修私钥、格式或路径。

Source: https://ssl.sh/zh/errors/apache-ah02572-failed-to-configure-certificate/
Last updated: 2026-11-10

**AH02572 的意思是：mod_ssl 没能给这个虚拟主机配出哪怕一对可用的证书和私钥，Apache 因此停止启动。** 这条日志只是汇总，具体原因记在它前面的那一行，最常见的是私钥和证书不是一对。

## 快速修复

多数 AH02572 是私钥和证书不匹配。先看前面几行日志，再比对两者的公钥哈希：

```bash
sudo apachectl configtest
sudo grep -B5 AH02572 /var/log/apache2/error.log      # CentOS/RHEL：/var/log/httpd/ssl_error_log
sudo openssl x509 -in /etc/ssl/example.com/fullchain.pem -noout -pubkey | openssl sha256
sudo openssl pkey -in /etc/ssl/example.com/privkey.pem -pubout | openssl sha256
```

两个哈希不同，说明私钥和证书不是一对；相同的话按下面的其他原因排查。`configtest` 显示 `Syntax OK` 后再执行 `sudo systemctl restart apache2`（或 `httpd`）。

## 原因

证书和私钥不匹配是最常见的原因；其余 4 种是私钥加了密码、格式不对、文件读不到和密钥类型不受支持。

### 1. 证书和私钥不匹配

AH02572 前面通常会有一行 `AH02565: Certificate and private key ... do not match`。

- **确认：** 上面两个哈希不一样，或者用 [私钥匹配检测](https://ssl.sh/zh/tools/key-matcher/) 核对。
- **修复：** 换成为这张证书生成 CSR 时的那把私钥；私钥丢了就重新生成私钥和 CSR，请 CA 重新签发。同时确认 SSLCertificateFile 文件里的第一张证书是你的站点证书，不是中间证书。

### 2. 私钥加了密码

加密私钥（开头是 `BEGIN ENCRYPTED PRIVATE KEY`）需要输入密码，用 systemd 启动时没人输入，加载就会失败。

- **确认：** 日志提到 encrypted private key，或者 `head -1 privkey.pem` 能看到 `ENCRYPTED`。
- **修复：** 配置 `SSLPassPhraseDialog exec:/usr/local/sbin/ssl-pass.sh`；或者用 `openssl pkey -in enc.key -out privkey.pem` 解密一次，再 `chmod 600`。

### 3. 文件格式不对或引用错了文件

DER 二进制文件、PKCS#12（`.pfx`）包，或者把 CA 证书包写成了 SSLCertificateFile，都会加载失败。给 IIS/Tomcat 准备的证书格式直接拿来用，也是常见原因。

- **确认：** `openssl x509 -in <文件> -noout -subject` 解析失败，或者显示的是 CA 的名字而不是你的域名。
- **修复：** 转成 PEM：`openssl pkcs12 -in site.pfx -nokeys -out fullchain.pem`，私钥用 `-nocerts -nodes -out privkey.pem`。格式说明见 [SSL 格式转换工具](https://ssl.sh/zh/tools/ssl-converter/)。

### 4. 文件不存在或读不到

- **确认：** 日志里有 `No such file or directory` 或 `Permission denied`；CentOS/RHEL 系统上 `ls -Z` 显示 SELinux 标签不对。
- **修复：** 修正路径，私钥由 root 所有、权限 600，然后执行 `sudo restorecon -Rv /etc/pki/tls`（或你的证书目录）。

### 5. 私钥类型不被支持

很老的 OpenSSL 或开启 FIPS 模式的系统可能拒绝某些密钥类型或长度。

- **修复：** 使用 RSA 2048 位以上，或 ECDSA P-256/P-384。

## 各环境修法

不管用哪种环境，`SSLCertificateFile` 都要指向站点证书在前、中间证书在后的 PEM 文件，`SSLCertificateKeyFile` 要指向与它匹配的私钥。

**Debian / Ubuntu**

```apache
<VirtualHost *:443>
    ServerName example.com
    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
```

用 `a2enmod ssl`、`a2ensite` 启用模块和站点，再 `systemctl reload apache2`。

**CentOS / Rocky / AlmaLinux：** 安装 `mod_ssl` 后自带的 `/etc/httpd/conf.d/ssl.conf` 里有一个 `_default_:443` 虚拟主机，引用 `localhost.crt`。如果这些文件不存在，这个默认主机本身就会触发 AH02572，修正它的路径或删掉这一段。

**宝塔面板（Apache）：** 在站点“SSL”里重新粘贴证书和私钥，“证书(PEM格式)”一栏要包含站点证书和中间证书，站点证书在前，可以用 [证书链工具](https://ssl.sh/zh/tools/chain-builder/) 拼好。保存后面板会自动重载；若仍失败，到站点配置文件里确认 `SSLCertificateFile` 指向的路径存在。

**Windows（Apache Lounge、phpStudy 等）：** 路径用正斜杠；Windows 不支持 `SSLPassPhraseDialog builtin`，私钥必须不加密或使用 `exec:` 脚本。

**Certbot：** Apache 插件会另写一个 `-le-ssl.conf` 文件。如果你还保留着同一个域名的旧 443 虚拟主机，删掉重复的那份。

**RSA + ECDSA 双证书：** 每个 `SSLCertificateFile` 后面紧跟与它匹配的 `SSLCertificateKeyFile`，顺序一一对应。

## 不要这样做

这 3 种做法会让 HTTPS 失效、私钥泄露，或者让整台服务器下线。

- **注释掉 `SSLEngine on` 让 Apache 先跑起来。** 443 端口会变成明文 HTTP，所有 HTTPS 访问都会报 [ERR_SSL_PROTOCOL_ERROR](https://ssl.sh/zh/errors/err-ssl-protocol-error/)。
- **把私钥改成所有人可读来绕过权限错误。** Apache 启动时以 root 身份读私钥，不需要放宽权限。
- **配置坏着就反复重启。** 重启失败会让服务器上的所有网站一起下线，每次先执行 `apachectl configtest`。
