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

ASP.NET Core中OpenIddict集成的自签名证书错误排查

解决Next-Auth对接OpenIddict时的自签名证书错误

问题原因

开发环境下,ASP.NET Core的OpenIddict使用自动生成的自签名证书做加密和签名,但Node.js(Next.js运行环境)默认不信任未被权威CA签发的证书,导致Next-Auth在请求OpenIddict的OIDC端点(如well-known配置、token接口)时触发SSL验证失败,抛出self-signed certificate错误。

解决方法

方法1:临时禁用SSL验证(仅开发环境使用)

在Next.js项目的启动命令中添加环境变量,强制Node.js跳过SSL证书验证:
修改package.json中的dev脚本:

"scripts": {
  "dev": "NODE_TLS_REJECT_UNAUTHORIZED=0 next dev",
  "build": "next build",
  "start": "next start"
}

⚠️ 注意:此方法仅限本地开发测试,绝对不能用于生产环境,会带来严重的安全风险。

方法2:让Node.js信任ASP.NET Core的开发证书

  1. 找到ASP.NET Core开发证书的位置:
    • Windows:C:\Users\<你的用户名>\.aspnet\https\<项目名称>.pfx
    • macOS/Linux:~/.aspnet/https/<项目名称>.pfx
  2. 导出证书为PEM格式:
    执行以下命令(替换路径和密码,ASP.NET Core开发证书默认密码为localhost):
    # Windows(需安装OpenSSL)
    openssl pkcs12 -in C:\Users\<用户名>\.aspnet\https\YourProject.pfx -clcerts -nokeys -out localhost.crt -passin pass:localhost
    
    # macOS/Linux
    openssl pkcs12 -in ~/.aspnet/https/YourProject.pfx -clcerts -nokeys -out localhost.crt -passin pass:localhost
    
  3. 将证书导入系统信任根证书库:
    • Windows:打开控制面板→证书→导入生成的localhost.crt到「受信任的根证书颁发机构」
    • macOS:执行security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain localhost.crt
    • Linux:将localhost.crt复制到/usr/local/share/ca-certificates/,然后执行update-ca-certificates

完成后重启Next.js服务,Node.js会自动信任该证书。

方法3:在Next-Auth配置中自定义HTTP客户端(跳过SSL验证)

在Next-Auth的OAuth provider配置中,添加自定义HTTP客户端选项,针对该provider跳过SSL验证:

import type { NextAuthOptions } from "next-auth";
import https from "https";

export const options: NextAuthOptions = {
    providers: [
        {
            id: "chirp-spa",
            name: "Chirp SPA client",
            type: "oauth",
            wellKnown:"https://localhost:7277/.well-known/openid-configuration",
            async profile(profile, tokens) {
                return {
                    id: profile.sub,
                    email: profile.email,
                }
            },
            clientId: process.env.IDENTITY_ID,
            clientSecret: process.env.IDENTITY_SECRET,
            // 添加自定义HTTP选项,跳过SSL验证
            httpOptions: {
                agent: new https.Agent({
                    rejectUnauthorized: false
                })
            }
        }
    ],
} 

⚠️ 同样,此方法仅限开发环境,生产环境必须使用可信CA签发的证书。

额外建议

生产环境中,务必使用由正规CA机构签发的SSL证书,避免自签名证书带来的安全问题和兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:41