You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中getServerSideProps调用Supabase遇自签名证书链错误求助

Next.js getServerSideProps中Supabase自签名证书问题解决方案

你遇到的问题是因为yarn/npm的cafile配置仅作用于包安装阶段,Node.js运行时发起HTTP请求时不会读取这些配置。以下是针对Next.js服务端场景的有效解决方案:

方案1:设置Node.js运行时环境变量

Node.js提供NODE_EXTRA_CA_CERTS环境变量,用于指定额外的可信CA证书文件。

  • 临时启动时指定:
    NODE_EXTRA_CA_CERTS=/path/to/certificate/file npm run dev
    
  • 永久配置(项目内):
    在项目根目录的.env.local文件中添加:
    NODE_EXTRA_CA_CERTS=/path/to/certificate/file
    
    保存后重启Next.js开发服务即可生效。

方案2:自定义Supabase客户端的Fetch配置

通过创建自定义HTTPS Agent,在Supabase客户端初始化时传入证书,实现请求层面的证书信任:

import https from 'https';
import fs from 'fs';
import { createServerSupabaseClient } from '@supabase/auth-helpers-nextjs';

export const getServerSideProps = async ({ req, res }) => {
  // 加载自定义CA证书
  const caCert = fs.readFileSync('/path/to/certificate/file');
  
  // 创建HTTPS Agent
  const httpsAgent = new https.Agent({
    ca: caCert,
    rejectUnauthorized: true // 保持证书验证逻辑,仅信任指定CA
  });

  const supabase = createServerSupabaseClient({
    req, res,
    options: {
      global: {
        // 覆盖默认fetch,对HTTPS请求使用自定义Agent
        fetch: (url, options = {}) => fetch(url, {
          ...options,
          agent: url.startsWith('https://') ? httpsAgent : undefined
        })
      }
    }
  });

  const { data: { user }, error } = await supabase.auth.getUser();

  if (error) console.error(error);

  return {
    props: { user }
  };
};

方案3:临时禁用证书验证(仅开发环境测试用)

注意:此方案不安全,严禁在生产环境使用,仅用于开发阶段临时排查问题:

import https from 'https';
import { createServerSupabaseClient } from '@supabase/auth-helpers-nextjs';

export const getServerSideProps = async ({ req, res }) => {
  const httpsAgent = new https.Agent({
    rejectUnauthorized: false
  });

  const supabase = createServerSupabaseClient({
    req, res,
    options: {
      global: {
        fetch: (url, options = {}) => fetch(url, {
          ...options,
          agent: url.startsWith('https://') ? httpsAgent : undefined
        })
      }
    }
  });

  const { data: { user }, error } = await supabase.auth.getUser();

  if (error) console.error(error);

  return {
    props: { user }
  };
};

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:10:41