- Windows 10 Pro
- MySQL8.0
- 节点.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:UsersgregbDesktopPROGRAMMINGVS Code Workspacexdevapi2index.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
该问题似乎与您使用的证书无关。它应该与您提供证书颁发机构文件的路径 (ca
) 这一事实有关。当您希望客户端验证服务器证书是否使用 CA 链中的证书签名时,您可以执行此操作,该证书仅在rejectUnauthorized
true
时才有效,一旦您提供有效的 CA 文件路径,就会自动设置该证书,因此,您的自定义rejectUnauthorized: false
将被忽略。
这就引出了一个问题,服务器证书是否由您提供的 CA 签名?我怀疑不是,在这种情况下,错误是合法的。
如果是这样,那么它是一个错误,您应该使用公共MySQL问题跟踪器报告它。但是,我运行了一些测试,我相信没有问题,但是如果您能够生成确实由该特定CA签名的服务器证书,该证书允许重现相同的确切场景,也许我们可以挖掘一些污垢。
免责声明:我是MySQL X DevAPI Connector for Node的首席开发人员.js