服务器和代理
AH02572:Apache 证书和私钥配置失败的修法
AH02572: Failed to configure at least one certificate and key for example.com:443AH02572 的意思是:mod_ssl 没能给这个虚拟主机配出哪怕一对可用的证书和私钥,Apache 因此停止启动。 这条日志只是汇总,具体原因记在它前面的那一行,最常见的是私钥和证书不是一对。
快速修复
多数 AH02572 是私钥和证书不匹配。先看前面几行日志,再比对两者的公钥哈希:
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。
- 确认: 上面两个哈希不一样,或者用 私钥匹配检测 核对。
- 修复: 换成为这张证书生成 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 格式转换工具。
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
<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格式)”一栏要包含站点证书和中间证书,站点证书在前,可以用 证书链工具 拼好。保存后面板会自动重载;若仍失败,到站点配置文件里确认 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。 - 把私钥改成所有人可读来绕过权限错误。 Apache 启动时以 root 身份读私钥,不需要放宽权限。
- 配置坏着就反复重启。 重启失败会让服务器上的所有网站一起下线,每次先执行
apachectl configtest。
常见问题
AH02572 前面那一行在哪里看?
在虚拟主机的 SSL 错误日志或主错误日志里:Debian/Ubuntu 是 /var/log/apache2/error.log,CentOS/RHEL 是 /var/log/httpd/ssl_error_log 或 error_log,启动失败时也可以看 journalctl -u httpd(或 apache2)。宝塔的 Apache 日志在 /www/wwwlogs/ 下。
还需要配置 SSLCertificateChainFile 吗?
Apache 2.4.8 及以上不需要。把站点证书和中间证书按顺序放进 SSLCertificateFile 即可。SSLCertificateChainFile 仍然能用,但已被标记为不推荐。阿里云、腾讯云下载的 Apache 格式证书包里通常是三个文件,可以把 public 证书和 chain 证书拼成一个。
Apache 启动时要求输入 pass phrase,是同一个问题吗?
可能是。这个提示没人能回答时(比如用 systemd 启动),就是同一个根因。要么配置 SSLPassPhraseDialog exec:/脚本路径,要么去掉私钥密码,再把私钥权限设为 600。