手机和操作系统

unable to get local issuer certificate:公司代理 SSL 解密所致

作者: · 最后核实

报错信息unable to get local issuer certificate(证书由公司代理签发)

公司 SSL 解密的意思是:公司的防火墙或代理把你的 HTTPS 流量解密、检查,再用公司自己的根证书签发的证书重新加密。 在信任这张根证书的公司电脑上,上网看起来一切正常;不信任它的,比如个人笔记本、Firefox、命令行工具或手机 App,访问每个被解密的网站都会报证书错误。

先判断是网站的问题还是你设备的问题

是网络的问题:网站证书在外部检测正常,公司网络里看到的颁发者却是公司或安全网关。先用 SSL 检测 从外部查网站:

curl ssl.sh/example.com

再在公司网络里的终端上看颁发者:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -issuer

颁发者写的是你们公司、某个安全网关或带“Inspection”字样,而不是检测里看到的公开 CA,就确认是被解密了。

原因

多数情况是这台设备没装解密根证书;即使装了,自带信任库的工具和做了证书固定的 App 仍会失败。

1. 这台设备没装解密根证书

自带的个人设备、新装系统的电脑连上公司网络后没有这张根证书。需要 IT 把设备纳入管理,或者通过正规渠道提供根证书。国内企业常见的上网行为管理、下一代防火墙设备都有 SSL 解密功能,一般会配套提供根证书下载和终端安装指引。

2. 浏览器或工具有自己的信任库

Firefox(除非开启企业根证书)、Java 的 cacerts、Python 的 certifi、Node.js、使用 OpenSSL 的 Git 都不读操作系统的证书库,每一个都要单独配置根证书。

3. 手机 App 忽略用户和管理员 CA

目标 API 24 及以上的安卓 App 忽略用户安装的根证书,很多 iOS App 做了证书固定。见 安卓 App 不信任用户 CA。

4. 证书固定或双向认证的连接

软件更新程序、网银和支付 App、使用客户端证书的服务,一解密就会坏,需要在代理上加例外。

5. 解密设备生成的证书太弱

老旧设备可能用 SHA-1 签名、不带 SAN、处理不好 TLS 1.3,即使是公司管理的电脑也会出现 NET::ERR_CERT_INVALID 或协议错误。

在各浏览器/系统上的样子

客户端 显示内容
Chrome / Edge / 360 / QQ 浏览器(未纳管设备) NET::ERR_CERT_AUTHORITY_INVALID
Firefox MOZILLA_PKIX_ERROR_MITM_DETECTED 或 SEC_ERROR_UNKNOWN_ISSUER
curl、Git、Python、npm unable to get local issuer certificate、CERTIFICATE_VERIFY_FAILED
安卓 / iOS App Trust anchor for certification path not found、NSURLErrorDomain -1202

站长和 IT 怎么修

IT 要做两件事:把解密根证书部署到每个需要它的信任库,并把无法解密的目标排除在外。

1. 把解密根证书部署到所有需要的地方: 操作系统证书库用域控组策略或终端管理软件;Firefox 用 Certificates 策略(ImportEnterpriseRoots);Java 用 keytool -importcert 导入运行时的 cacerts;开发工具按文档配置环境变量。

2. 把无法解密的目标加入例外: 做了证书固定的 App、系统和软件更新服务、网银和医疗网站、使用客户端证书的服务。

3. 保持解密设备固件最新,让它生成的证书符合浏览器规则(SHA-256、带 SAN、有效期合理),并支持 TLS 1.3。

4. 对公开网站的站长来说,只要 curl ssl.sh/example.com 显示证书链有效,服务器就不用改;客服可以建议受影响的用户联系他们公司的 IT 部门。

常见问题

能绕过公司的 SSL 解密吗?

不要尝试。它通常是安全和合规要求的一部分,绕过去可能违反公司制度。请 IT 在你的设备上正确安装解密根证书,或者把出问题的程序加入例外。

怎么让 Git、npm、Python 信任公司根证书?

向 IT 要根证书文件,然后分别配置:git config --global http.sslCAInfo、npm config set cafile、NODE_EXTRA_CA_CERTS,Python 用 SSL_CERT_FILE 或 REQUESTS_CA_BUNDLE。另见 Python certificate verify failed 和 npm unable to get local issuer certificate。

根证书装好了,为什么有些 App 还是失败?

它们固定了预期的证书或公钥,或者用自己的根证书库、不认系统的。这类流量只能在代理上加例外,客户端怎么设置都没用。

资料来源

  1. Mozilla Support: Set up Certificate Authorities (CAs) in Firefox
  2. Android Developers:网络安全配置
  3. Chrome Enterprise 政策列表
  4. RFC 5280: X.509 certificate profile