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

无法绕过SequelizeConnectionError:无法获取本地颁发者证书求助

问题

我使用如下Sequelize连接参数:

const sequelize = new Sequelize(
  process.env.RDS_DB_NAME,
  process.env.RDS_USERNAME,
  process.env.RDS_PASSWORD,
  {
    dialect: 'mysql',
    socketPath: '/var/run/mysqld/mysqld.sock',
    host: process.env.RDS_HOSTNAME,
    port: process.env.RDS_PORT,
    dialectOptions: {
      ssl: {
        'Amazon RDS': {
          require: true,
          rejectUnauthorized: false,
          authPlugins: {
            mysql_clear_password: () => () => signer.getAuthToken(),
          },
        },
      },
    },
  },
);

运行node server.js后得到如下日志:

Server is running on port 8080.
Unable to create table :  ConnectionError [SequelizeConnectionError]: unable to get local issuer certificate
    at ConnectionManager.connect (/Path/To/Project/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:102:17)

 at TLSSocket.emit (events.js:400:28)
      at TLSSocket.emit (domain.js:475:12)
      at TLSSocket._finishInit (_tls_wrap.js:937:8)
      at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:709:12) {
    code: 'HANDSHAKE_SSL_ERROR',
    fatal: true
  },

Executing (default): SELECT 1+1 AS result
Executing (default): SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'saves' AND TABLE_SCHEMA = 'db_schema'
Connection has been established successfully.
Executing (default): SHOW INDEX FROM `saves`
Saves table created successfully!

当我尝试访问服务器上的任何路由时,返回信息:

{"message":"unable to get local issuer certificate"}

我已经尝试过以下方法,但都无效:

  • 在Sequelize配置参数中添加:
ssl:{
  require: true,
  rejectUnauthorized: false,
}
  • 运行node server.js前执行export NODE_TLS_REJECT_UNAUTHORIZED='0'
  • 使用sslmode=no-verify

而且我不想通过不验证证书来牺牲安全性,请问问题出在哪里?


分析与解决

1. SSL配置层级错误

你当前把Amazon RDS作为ssl对象的子属性,不符合Sequelize+MySQL的配置规范。正确做法是直接在ssl对象下配置参数,同时指定Amazon RDS的根证书路径完成安全验证,而非关闭验证。

先下载Amazon RDS的根证书(如rds-ca-2019-root.pem),再修改配置:

const fs = require('fs');
const sequelize = new Sequelize(
  process.env.RDS_DB_NAME,
  process.env.RDS_USERNAME,
  process.env.RDS_PASSWORD,
  {
    dialect: 'mysql',
    host: process.env.RDS_HOSTNAME,
    port: process.env.RDS_PORT,
    dialectOptions: {
      ssl: {
        require: true,
        ca: fs.readFileSync('/path/to/rds-ca-2019-root.pem'), // 替换为你的证书实际路径
        authPlugins: {
          mysql_clear_password: () => () => signer.getAuthToken(),
        },
      },
    },
  },
);

2. SocketPath与远程RDS冲突

你同时配置了socketPath(本地MySQL套接字)和host/port(远程RDS地址),Sequelize会优先使用本地套接字连接,而本地MySQL未配置匹配远程RDS的SSL规则,因此抛出证书错误。

如果是连接远程Amazon RDS,必须移除socketPath配置,确保通过TCP连接应用SSL设置。

3. 连接池或重复连接问题

日志显示"Connection has been established successfully"但路由访问仍报错,可能是初始连接失败后,后续连接复用了错误配置,或连接池存在失效连接。可添加连接池参数优化:

const sequelize = new Sequelize(
  // ... 其他参数
  {
    // ... 其他配置
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    }
  }
);

4. 环境变量生效问题

如果用export NODE_TLS_REJECT_UNAUTHORIZED='0'临时排查,需确保环境变量在Node进程启动前正确设置,比如在同一终端执行:

NODE_TLS_REJECT_UNAUTHORIZED=0 node server.js

注意:这仅为临时排查手段,生产环境必须使用根证书验证,不能关闭证书校验。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:45:57