问题根源:国密SSL证书部署时中间证书遗漏,本质上是因为服务器只下发了终端域名证书,而没有下发完整的中间证书链,导致浏览器无法通过根证书逐级验证服务器证书的信任路径。国密证书的信任链要求全程SM2贯通——根证书、中间证书、服务器证书全部采用SM2签名。而国密CA根证书在大多数浏览器中并未预置,因此服务器端必须主动下发完整的中间证书链,否则浏览器会因“无法追溯根证书”而判定证书不可信。
解决方案
第一步:确认证书链是否缺失
在修改配置前,先用以下命令验证当前证书链状态:
bash
openssl s_client -connect yourdomain.com:443 -showcerts
观察输出中是否出现多个 `-----BEGIN CERTIFICATE-----` 块:
首块应为你的域名证书
后续块应为中间证书(至少一块,常见为一到两块)
若只看到一块证书,或提示 `unable to get local issuer certificate`,说明证书链确实不完整
也可使用在线工具如 [SSL Labs](https://www.ssllabs.com/ssltest/) 检测,它会明确标出证书链问题。
第二步:获取完整的中间证书文件
从证书颁发机构(CA)重新下载完整的证书包,通常包含:
终端服务器证书(如 `yourdomain.crt`)
中间证书文件(如 `intermediate.pem` 或 `bundle.crt`)
根证书(一般无需配置,由客户端内置)
注意:不同CA品牌的中间证书不能混用,必须使用配套的专属中间证书。
第三步:合并证书文件(核心操作)
根据Apache版本选择正确的配置方式:
Apache 2.4.8 及以上版本(推荐)
`SSLCertificateChainFile` 指令已在 Apache 2.4.8+ 中废弃,功能已合并进 `SSLCertificateFile`。必须将服务器证书和中间证书合并成一个 PEM 文件:
bash
cat yourdomain.crt intermediate.pem > yourdomain.chained.pem
关键注意事项:
顺序必须正确:域名证书必须在最前,中间证书紧随其后
根证书不要加入(根证书由客户端内置)
设置权限:`chmod 644 yourdomain.chained.pem`
Apache 2.4.8 以下版本(旧版)
可使用单独的 `SSLCertificateChainFile` 指令指定中间证书路径:
apache
SSLCertificateFile /etc/httpd/ssl/your_certificate.crt
SSLCertificateKeyFile /etc/httpd/ssl/your_private_key.key
SSLCertificateChainFile /etc/httpd/ssl/your_intermediate.crt
第四步:更新Apache SSL配置
编辑虚拟主机配置文件(如 `/etc/apache2/sites-available/default-ssl.conf` 或 `/etc/httpd/conf/extra/httpd-ssl.conf`):
新版Apache(2.4.8+)配置示例:
apache
SSLCertificateFile /path/to/yourdomain.chained.pem
SSLCertificateKeyFile /path/to/yourdomain.key
删除所有已废弃的 `SSLCertificateChainFile`、`SSLCACertificateFile` 等指令。
保存后重启Apache:
bash
systemctl restart apache2 # Debian/Ubuntu
systemctl restart httpd # CentOS/RHEL
验证修复
配置完成后,再次运行验证命令:
bash
openssl s_client -connect yourdomain.com:443 -showcerts
确认输出中包含完整的证书链(服务器证书 + 中间证书)。同时用浏览器访问网站,检查是否不再出现“证书不受信任”的警告。
国密场景特别注意事项
1. Apache需支持国密算法:官方版Apache + OpenSSL不支持国密算法,需要重新编译Apache并指定国密SM2模块(如Wotrus的 `wotrus_ssl` 模块)。
2. OpenSSL版本要求:OpenSSL需为1.1.1及以上版本,且编译时需包含 `enable-sm2` 选项。
3. 双证书方案:国密证书仅能在国密浏览器中访问,国际浏览器无法识别。如需同时满足国际和国密浏览器访问,需部署SM2/RSA双证书方案,通过ALPN协议协商动态选择证书。
4. 自动化工具:可使用 Let's Encrypt、Certbot 等自动化工具,或 GmSSL 自助式域名证书服务,避免手动配置时遗漏中间证书。
5. 定期检查:建议每月通过SSL Labs等工具检测证书链状态,特别关注CA机构更新通知。