证书链不完整是curl报错35的常见原因,即apache未在tls握手时发送中间证书,导致curl无法构建完整信任链而终止连接。
apache 配置了 ssl 证书,但用 curl 访问时仍报 (35) ssl connect error,常见原因不是证书本身无效,而是**证书链不完整**——即服务器没把中间证书(intermediate ca)一并发送给客户端。curl 默认严格验证整条信任链,缺一级就断开连接。
为什么证书链缺失会导致 curl 报错 35
浏览器通常自带较全的根+中间证书库,能“补全”链路;而 curl(尤其系统自带旧版本)只依赖本地 CA 包,且完全依赖服务器在 TLS 握手中主动发送完整的证书链。如果 Apache 只配置了域名证书(your_domain.crt),没附上中间证书,curl 就无法向上追溯到受信根 CA,直接终止握手,表现为 error 35。
检查当前证书链是否完整
执行以下命令,查看服务器实际返回的证书链:
基于5000余部现行法律法规进行的高质量专业合同审查,一键输出审查意见书,并附有参考法条原文,满足专业溯源核查要求。由accurLex知法提供技术支持。 Use when users ask for 合同审查, 审查意见书, 合同风险分析, 条款审查,知法,accurLex or 站在甲方/乙方角度审查合同 through accurLex direct API. China law only, plaintext only, review mode limited to 审查意见书.
openssl s_client -connect your-domain.com:443 -showcerts- 观察输出中是否包含至少两段
BEGIN CERTIFICATE—— 第一段是你的域名证书,第二段(或更多)应为中间证书 - 若只有你自己的证书,说明链不完整
在 Apache 中正确配置证书链
关键不是“多放一个文件”,而是让 Apache 在响应时把它们按正确顺序拼成一条链。操作分两步:
-
合并证书文件:把你的域名证书和中间证书(通常由 CA 提供,如 R3、ISRG X1 等)按顺序写入同一个
.crt文件,域名证书在前,中间证书紧随其后(根证书不要放进这个文件):cat your_domain.crt intermediate.crt > fullchain.crt -
更新 Apache 配置:在虚拟主机的 SSL 配置段中,确保使用的是这个合并后的文件:
SSLCertificateFile /path/to/fullchain.crtSSLCertificateKeyFile /path/to/your_domain.key
(不再使用单独的SSLCertificateChainFile,该指令在 Apache 2.4.8+ 已废弃)
额外要确认的三个点
光配对证书链还不够,这三个环节任一出错也会触发 error 35:
-
CA 根证书包是否更新:运行
sudo update-ca-certificates(Ubuntu/Debian)或sudo yum update ca-certificates(CentOS/RHEL),确保系统信任库含最新根证书 -
系统时间是否准确:差几分钟就可能让证书被判定“未生效”或“已过期”,用
timedatectl status检查,必要时启用 NTP 同步 -
SSL 协议与加密套件是否兼容:老版本 curl(如 7.29)不支持 TLS 1.3 或某些新算法。可在 Apache 的
ssl.conf中显式启用兼容组合,例如:SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256










