Apache HTTPS配置中手机端“证书不受信任”的核心原因是证书链不完整,需将域名证书与中间证书按序合并为单个PEM文件(域名证书在前、中间证书在后、根证书不包含),并在SSLCertificateFile中指向该文件,同时禁用旧TLS协议与弱加密套件。
客户端校验失败,核心是 apache 没把完整的信任链交给浏览器或小程序——不是证书无效,而是“没给全”。手机、微信小程序、ios safari 等尤其敏感,必须严格按顺序提供域名证书 + 中间证书,且不能含根证书。
证书文件必须合并为单个 PEM(域名证书在前,中间证书在后)
Apache 2.4.8+ 已彻底弃用 SSLCertificateChainFile。你不能再把中间证书单独放一个文件再引用,否则会报 AH02572 或触发“证书不受信任”警告。
- 用文本编辑器打开你的域名证书(如
example.com.crt),确认以-----BEGIN CERTIFICATE-----开头 - 下载对应 CA 的中间证书(如 Let’s Encrypt 的
ISRG_Root_X1.crt和R3.crt,注意选“intermediate only”,不含根) - 把中间证书内容**追加**到域名证书文件末尾(顺序不能错:域名证书 → 中间证书;根证书绝对不放)
- 保存为
fullchain.pem,并在配置中只写这一行:SSLCertificateFile /path/to/fullchain.pem
验证证书链是否真正完整
光拼对了还不够,得让客户端能走通整条链。最直接的方法是用 OpenSSL 模拟校验:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 运行命令:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt -untrusted intermediate.crt domain.crt(把路径替换成你的真实路径) - 如果返回
OK,说明链结构正确;若提示unable to get local issuer certificate,就是中间证书缺失或顺序错误 - 也可以用 SSL Labs 测试页 输入你的域名,看 “Certificate Chain” 是否显示 Complete
检查私钥是否与证书真正匹配
证书链再完整,私钥不配对也会导致握手失败或 AH02572 报错。这不是命名一致就行,必须数学模数完全相同:
- 执行:
openssl x509 -noout -modulus -in fullchain.pem | openssl md5 - 再执行:
openssl rsa -noout -modulus -in example.com.key | openssl md5 - 两行输出的 MD5 值必须**一字不差**;不一致就说明私钥不是这张证书对应的,需重新生成或找回原始密钥
- 同时确认私钥开头是
-----BEGIN RSA PRIVATE KEY-----或-----BEGIN PRIVATE KEY-----,不能有 BOM、空格或 Windows 换行符
禁用老旧协议和弱加密套件(防 handshake failed)
有些客户端(尤其是新版 iOS/Android)拒绝与使用 TLS 1.0、1.1 或过时加密算法的服务握手,日志里会显示 no shared cipher 或 unknown protocol:
- 在 Apache SSL 配置中明确限定协议版本:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
推荐只开TLSv1.2和TLSv1.3 - 设置强加密套件:
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 - 加上
SSLHonorCipherOrder on确保服务端优先级生效

















