问题根源:国密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机构更新通知。