MySQL xdevapi 节点错误:SELF_SIGNED_CERT_IN_CHAIN

Posted

技术标签:

【中文标题】MySQL xdevapi 节点错误:SELF_SIGNED_CERT_IN_CHAIN【英文标题】:MySQL xdevapi Node Error: SELF_SIGNED_CERT_IN_CHAIN 【发布时间】:2021-03-31 18:45:46 【问题描述】: Windows 10 专业版 mysql8.0 node.js v14.15.5 openssl 1.1.1c

我正在尝试使用节点连接到 MySQL 数据库,我可以在没有 TLS 的情况下进行连接。我使用 openssl 创建私钥和自签名证书。当我尝试在我的节点应用程序中使用 TLS 时,我不断收到以下错误:

$ NODE_TLS_REJECT_UNAUTHORIZED=0 node index.js
(node:15480) Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.
(Use `node --trace-warnings ...` to show where the warning was created)
Error: self signed certificate in certificate chain       
    at TLSSocket.onConnectSecure (_tls_wrap.js:1497:34)   
    at TLSSocket.emit (events.js:315:20)
    at TLSSocket._finishInit (_tls_wrap.js:932:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:706:12) 
  code: 'SELF_SIGNED_CERT_IN_CHAIN'

TypeError: Cannot read property 'sql' of undefined
    at C:\Users\gregb\Desktop\PROGRAMMING\VS Code Workspace\xdevapi2\index.js:40:32
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
[]
[]

索引.js

let mysqlx = require('@mysql/xdevapi');
let fs = require('fs'); 
require('dotenv').config();

let rows = [];
let columns = [];

// Works without TLS
// let config = 
//     host: 'localhost',
//     port: 33060,
//     user: 'root',
//     database: 'user',
//     password: process.env.password
// ;

const config = 
    host: 'localhost', 
    port: 33060,     
    user: 'root',
    database: 'user',    
    password: process.env.password,
    ssl: true,
    tls: 
      rejectUnauthorized: false,
      key: fs.readFileSync('./privatekey2.pem'), 
      cert: fs.readFileSync('./example.crt'),
      ca: './cacert.pem'
    
;

(async function () 
    let session;
try 
    session = await mysqlx.getSession(config);
 catch(err) 
    console.log(err);
  

try 
    let result = await session.sql('SELECT "firstName" AS c1, "lastName" AS c2')       
    .execute(row => rows.push(row), column => columns = columns.concat(column));
    session.close();
 catch(err) 
    console.log(err);
    
    console.log(rows); // [['foo', 'bar']]
    console.log(columns.map(column => column.getColumnLabel())); // ['c1', 'c2']        
)();

我也试过了:

NODE_TLS_REJECT_UNAUTHORIZED='0' node index.js

我是如何使用 openssl 的:

    创建公钥/私钥文件对:
openssl genrsa -out privkey2.pem 4096
    分为公共/私人:
openssl ssh-keygen -t rsa -b 4096 -f privatekey2.pem
    创建证书
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout privatekey2.pem -out example.crt

【问题讨论】:

【参考方案1】:

问题似乎与您使用的证书无关。它应该与您提供证书颁发机构文件(ca)的路径这一事实有关。当您希望客户端验证服务器证书是否使用 CA 链中的证书签名时,您可以这样做,这仅在 rejectUnauthorizedtrue 时有效,一旦您提供有效的 CA 文件路径,它就会自动设置,因此,您的自定义 rejectUnauthorized: false 将被忽略。

这引出了一个问题,服务器证书是否由您提供的 CA 签名?我怀疑它不是,在这种情况下,错误是合法的。

如果是这样,那么这是一个错误,您应该使用公共MySQL issue tracker 报告它。但是,我进行了一些测试,我确信没有问题,但是如果您能够生成一个确实由该特定 CA 签名的服务器证书,它允许重现相同的确切场景,也许我们可以挖一些泥土。

免责声明:我是 MySQL X DevAPI Connector for Node.js 的首席开发人员

【讨论】:

以上是关于MySQL xdevapi 节点错误:SELF_SIGNED_CERT_IN_CHAIN的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Mac 上安装 php 扩展“mysql_xdevapi”

使用 Mysql xdevapi

MySQL XDevAPI 如何返回成功状态

使用 SSL 和 X 协议的 NodeJS mysql/xdevapi '访问被拒绝'

MYSQL XDEVAPI 多或(二)请求

@mysql/xdevapi ECONNREFUSED 不释放连接