本地调用API时出现net::ERR_CERT_AUTHORITY_INVALID问题求助
解决AngularJS跨环境请求Apache API的证书错误问题
我之前帮不少开发者排查过这类场景,你的问题核心是Chrome浏览器不认可Apache服务器的SSL证书——虽然跨域(协议+端口不同)是请求场景,但直接触发net::ERR_CERT_AUTHORITY_INVALID错误的原因是证书信任问题。下面分步骤给你解决思路:
一、优先解决SSL证书信任问题(消除证书错误)
这个错误说明你的Apache使用的是自签名证书——这类证书没有经过浏览器默认信任的权威CA机构签发,所以Chrome会直接拦截请求,认为连接不安全。
方案1:配置本地可信任的证书(推荐本地开发+生产通用思路)
如果是本地开发,可以用mkcert工具快速生成被Chrome信任的本地证书,步骤很简单:
- 安装mkcert:根据你的系统选择方式,比如Mac用
brew install mkcert,Windows可以用Chocolatey或者直接下载二进制文件 - 生成本地根CA并添加到系统信任库:
mkcert -install - 为
localhost生成证书:mkcert localhost - 修改Apache的SSL配置文件(通常是
httpd-ssl.conf),替换证书路径:SSLCertificateFile "/path/to/your/localhost.pem" SSLCertificateKeyFile "/path/to/your/localhost-key.pem" - 重启Apache,之后Chrome就会信任这个证书了。
方案2:临时绕过Chrome的证书校验(仅本地开发应急用)
如果只是临时调试,不想折腾证书,可以直接让Chrome信任localhost的无效证书:
- 在Chrome地址栏输入
chrome://flags/#allow-insecure-localhost - 找到「Allow invalid certificates for resources loaded from localhost」选项,设置为Enabled
- 重启Chrome,这个时候再发起请求就不会触发证书错误了。
注意:这个方法绝对不能用在生产环境,只是本地开发的临时方案!
二、跨域请求的补充配置(证书问题解决后可能需要)
因为你的AngularJS应用在http://localhost:4200(非SSL+非标准端口),API在https://localhost(SSL+默认443端口),属于跨域请求,解决证书问题后可能会遇到CORS错误,需要在Apache里配置跨域允许规则:
- 先确保Apache启用了
mod_headers模块:打开httpd.conf,取消下面这行的注释(如果没开启的话):LoadModule headers_module modules/mod_headers.so - 在API的虚拟主机配置中添加CORS规则:
# 允许指定 origin 的请求 Header set Access-Control-Allow-Origin "http://localhost:4200" # 允许的请求方法 Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" # 允许的请求头 Header set Access-Control-Allow-Headers "Content-Type, Authorization" - 处理OPTIONS预检请求:如果你的请求包含自定义头或者非简单方法,浏览器会先发OPTIONS预检,需要单独配置允许:
<Limit OPTIONS> Require all granted Header set Access-Control-Allow-Origin "http://localhost:4200" Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type, Authorization" Header set Access-Control-Max-Age "86400" # 缓存预检结果24小时 </Limit> - 重启Apache,跨域请求就可以正常发起了。
最后提醒
生产环境绝对不能使用自签名证书或者绕过证书校验,必须使用正规CA机构颁发的证书,比如Let's Encrypt的免费证书,同时CORS规则要根据实际生产域名配置,不要直接用localhost。
内容的提问来源于stack exchange,提问作者Imri Barr




