手机和操作系统
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 还是失败?
它们固定了预期的证书或公钥,或者用自己的根证书库、不认系统的。这类流量只能在代理上加例外,客户端怎么设置都没用。