Apache SSL证书校验失败本质是TLS握手验证环节中断,需依error.log错误类型精准定位:如“unable to get local issuer certificate”为证书链不完整,“error:0B080074”为证书与私钥模数不匹配,“no shared cipher”为加密套件不兼容,并通过OpenSSL校验模数、showcerts验证链完整性、SAN字段核对域名覆盖。

Apache SSL 证书校验失败,本质是 TLS 握手过程中某一个验证环节中断。它不是“配置写错了”,而是证书、密钥、链路或环境之间存在不兼容或不一致。排查要从日志出发,逐层验证,不能只看浏览器提示。
先看 error.log 锁定错误类型
打开 Apache 错误日志(/var/log/apache2/error.log 或 /var/log/httpd/error_log),找最靠近启动或请求时的报错行:
- 出现 “unable to get local issuer certificate” → 证书链不完整
- 出现 “no shared cipher” 或 “sslv3 alert handshake failure” → 加密套件或 TLS 版本不匹配
- 出现 “SSL Library Error: error:0B080074” → 证书与私钥模数不匹配
- 出现 “SSLCertificateFile: file ... does not exist” → 路径错误或文件为空
- 出现 “Server certificate does NOT include an ID which matches the server name” → 域名未被证书 SAN 覆盖
验证证书与私钥是否真正配对
文件名一致(如 server.crt + server.key)不代表它们是一对。必须用 OpenSSL 校验数学模数:
- 执行:
openssl x509 -noout -modulus -in server.crt | openssl md5 - 执行:
openssl rsa -noout -modulus -in server.key | openssl md5 - 两行输出的 MD5 值必须完全相同;不一致就说明私钥不是这个证书对应的,需重新生成或找回原始私钥
- Windows 下务必使用 XAMPP 自带的 openssl.exe(如 C:\xampp\apache\bin\openssl.exe),避免格式兼容问题
检查证书链是否完整下发
浏览器信任依赖完整链路:域名证书 → 中间证书 → 根证书。中间证书缺失是最常被忽略的原因:
- 运行:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts 2>/dev/null - 输出中应看到至少两个证书块(服务器证书 + 至少一个中间证书);如果只有一块,说明链不全
- 修复方式:将中间证书内容追加到域名证书末尾,生成 fullchain.crt(顺序不能颠倒)
- Apache 配置中,2.4+ 推荐只用
SSLCertificateFile fullchain.crt,不再单独设SSLCertificateChainFile
确认域名是否被证书真正覆盖
现代浏览器只认 Subject Alternative Names(SAN),不再依赖 Common Name(CN):
- 执行:
openssl x509 -in server.crt -text -noout | grep -A1 "Subject Alternative Name" - 访问的域名(如 api.example.com、www.example.com)必须全部出现在 SAN 列表里
- *.example.com 不包含 example.com,若需两者都支持,必须显式加入根域名
- 同时检查虚拟主机中的
ServerName和ServerAlias是否与 SAN 完全一致


















