You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

本地调用API时出现net::ERR_CERT_AUTHORITY_INVALID问题求助

解决AngularJS跨环境请求Apache API的证书错误问题

我之前帮不少开发者排查过这类场景,你的问题核心是Chrome浏览器不认可Apache服务器的SSL证书——虽然跨域(协议+端口不同)是请求场景,但直接触发net::ERR_CERT_AUTHORITY_INVALID错误的原因是证书信任问题。下面分步骤给你解决思路:

一、优先解决SSL证书信任问题(消除证书错误)

这个错误说明你的Apache使用的是自签名证书——这类证书没有经过浏览器默认信任的权威CA机构签发,所以Chrome会直接拦截请求,认为连接不安全。

方案1:配置本地可信任的证书(推荐本地开发+生产通用思路)

如果是本地开发,可以用mkcert工具快速生成被Chrome信任的本地证书,步骤很简单:

  1. 安装mkcert:根据你的系统选择方式,比如Mac用brew install mkcert,Windows可以用Chocolatey或者直接下载二进制文件
  2. 生成本地根CA并添加到系统信任库:mkcert -install
  3. localhost生成证书:mkcert localhost
  4. 修改Apache的SSL配置文件(通常是httpd-ssl.conf),替换证书路径:
    SSLCertificateFile "/path/to/your/localhost.pem"
    SSLCertificateKeyFile "/path/to/your/localhost-key.pem"
    
  5. 重启Apache,之后Chrome就会信任这个证书了。

方案2:临时绕过Chrome的证书校验(仅本地开发应急用)

如果只是临时调试,不想折腾证书,可以直接让Chrome信任localhost的无效证书:

  1. 在Chrome地址栏输入 chrome://flags/#allow-insecure-localhost
  2. 找到「Allow invalid certificates for resources loaded from localhost」选项,设置为Enabled
  3. 重启Chrome,这个时候再发起请求就不会触发证书错误了。

注意:这个方法绝对不能用在生产环境,只是本地开发的临时方案!

二、跨域请求的补充配置(证书问题解决后可能需要)

因为你的AngularJS应用在http://localhost:4200(非SSL+非标准端口),API在https://localhost(SSL+默认443端口),属于跨域请求,解决证书问题后可能会遇到CORS错误,需要在Apache里配置跨域允许规则:

  1. 先确保Apache启用了mod_headers模块:打开httpd.conf,取消下面这行的注释(如果没开启的话):
    LoadModule headers_module modules/mod_headers.so
    
  2. 在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"
    
  3. 处理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>
    
  4. 重启Apache,跨域请求就可以正常发起了。

最后提醒

生产环境绝对不能使用自签名证书或者绕过证书校验,必须使用正规CA机构颁发的证书,比如Let's Encrypt的免费证书,同时CORS规则要根据实际生产域名配置,不要直接用localhost。

内容的提问来源于stack exchange,提问作者Imri Barr

火山引擎 最新活动