问题描述

当通过互联网请求 https://api.weixin.qq.com 时,签发主体和签发机构如下:

subject: CN=mp.weixin.qq.com, O=Shenzhen Tencent Computer Systems Company Limited, L=Shenzhen, ST=Guangdong Province, C=CN
issuer: CN=DigiCert Secure Site CN CA G3, O=DigiCert Inc, C=US
  • 1.
  • 2.

而在客户机房请求时,签发主体和签发机构如下:

subject: CN=mp.weixin.99.com, O=Shenzhen Tencent Computer Systems Company Limited, L=Shenzhen, ST=Guangdong Province, C=CN
issuer: CN=Verisign Class 1 Extended Validation CA, OU=Terms of use at https://www.verisign.com/rpa, O=Verisign, Inc., C=US
  • 1.
  • 2.

错误信息

* NSS error -8179 (SEC ERROR UNKNOWN ISSUER): Certificate issuer is not recognized
  • 1.

这表明客户端无法识别证书的签发机构,可能是因为证书颁发机构不受信任或未知。

排查步骤

使用以下命令查看证书文件内容,确认机房请求和互联网请求的证书内容是否一致:

openssl s_client -showcerts -connect api.weixin.qq.com:443
  • 1.
原因分析

客户的深信服安全设备对请求域名的证书进行了替换。在某些情况下,类似于深信服这样的安全设备会检查流经的 HTTPS 流量。为了做到这一点,它们可能会替换 SSL/TLS 证书,以便能够解密和检查加密的内容。这种操作被称为 SSL/TLS 中间人攻击。

当这种替换发生时,最终用户收到的证书是由内部 CA(比如深信服)而非原始网站的 CA 签发的��如果客户端不信任这个内部 CA,就会出现证书错误。

解决方案

客户需要从他们的深信服安全设备中导出 CA 证书,然后将这个 CA 证书添加到受信任的根证书库中。

具体步骤
  1. 从深信服安全设备导出 CA 证书
  2. 将 CA 证书添加到受信任的根证书库
    编辑 /etc/pki/tls/certs/ca-bundle.crt 文件,将导出的 CA 证书追加到文件末尾。
sudo vim /etc/pki/tls/certs/ca-bundle.crt
  • 1.

在文件末尾追加 CA 证书。例如:

-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKU0p8uYhFi2MA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
...
...
-----END CERTIFICATE-----
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  1. 验证 CA 证书是否有效
    再次使用以下命令验证证书是否有效:
openssl s_client -showcerts -connect api.weixin.qq.com:443
  • 1.

如果没有错误,并且返回的证书链包含刚刚添加的 CA 证书,则说明配置成功。

总结

通过以上步骤,可以解决由于深信服安全设备导致的证书验证错误问题。主要步骤包括从深信服设备导出 CA 证书并将其添加到受信任的根证书库中,确保客户端能够正确识别并信任该证书。