本地HTTPS Node服务NextAuth调用getSession报unsupported certificate purpose错误
错误根因
该报错是本地使用的自签证书缺少TLS Web 服务端认证扩展属性导致的。Node.js 运行时发起内部请求调用 /api/auth/session 接口时,会校验证书的用途属性,你直接用根CA证书作为服务端证书使用,根CA默认只有签发证书的权限,没有服务端证书的使用权限,因此校验不通过抛出该错误。
解决方案
方案1:开发环境临时快速修复
仅适合本地开发场景使用,生产环境禁止配置:
在启动服务的命令前添加环境变量 NODE_TLS_REJECT_UNAUTHORIZED=0 即可全局关闭Node.js的TLS证书校验,例如你的启动命令为node server.js,修改为:
NODE_TLS_REJECT_UNAUTHORIZED=0 node server.js
也可以直接在你的server.js文件最顶部添加一行代码:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
方案2:规范修复,重新生成符合要求的自签证书
通过openssl生成带正确扩展属性的服务端证书,步骤如下:
- 新建扩展配置文件
server.ext,内容如下:
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = localhost
- 用你已有的根CA证书签发新的服务端证书时,添加
-extfile server.ext参数,即可生成带服务端认证属性的证书 - 将
server.js中httpsOptions配置的证书替换为新生成的服务端证书即可
方案3:NextAuth专属配置,仅关闭NextAuth内部请求的证书校验
不需要全局修改Node.js TLS配置,仅针对NextAuth的内部请求跳过证书校验,修改你的[...nextauth].js配置文件即可:
import NextAuth from "next-auth" import https from "https" export default NextAuth({ // 保留你原有的providers、callbacks等所有配置不变 providers: [/* 原有配置 */], callbacks: {/* 原有配置 */}, // 新增以下配置 httpOptions: { agent: new https.Agent({ rejectUnauthorized: false }) } })
内容的提问来源于stack exchange,提问作者Vpp Man
相关产品推荐
相关产品推荐

