到rds mysql/aurora无服务器群集的ssl连接失败,node.js

o2rvlv0m  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(409)

我在rds mysql数据库中使用node.js lts已经有一段时间了。我最近开发了一个rds无服务器aurora MySQL5.6集群。与我的其他rds数据库不同,我无法让node.js使用node mysql或mysql2适配器通过ssl连接到新的无服务器集群。
从带有单个node.js应用程序的单个ubuntu示例:
我可以使用ssl成功地将节点应用程序连接到我的任何旧rds数据库(MySQL5.6.40):

// works with other RDS databases:
const fs = require('fs');
const mysql = require('mysql2');
const config = require('../config');

var connectionArgs = {
  host: config.old_rds_host,
  database: config.old_rds_database,
  user: config.old_rds_user,
  password: config.old_rds_password,
  port: config.rds.port,
  ssl: {
    ca: fs.readFileSync(__dirname + '/../rds-combined-ca-bundle.pem')
  }
}

var connection = mysql.createConnection(connectionArgs);

在同一台机器上,我可以使用mysql客户端通过ssl连接到新的rds群集,没有问题:

// Works with new RDS serverless cluster:
mysql -u rds_serverless_user -p -h new-rds-serverless-cluster.us-west-2.rds.amazonaws.com -P 3306 --ssl --ssl-ca=./rds-combined-ca-bundle.pem

我可以在没有ssl的情况下成功地将节点应用程序连接到新的无服务器群集:

// Works with new RDS serverless cluster:
const fs = require('fs');
const mysql = require('mysql2');
const config = require('../config');

var connectionArgs = {
  host: config.rds_host,
  database: config.rds_serverless_database,
  user: config.rds_serverless_user,
  password: config.rds_serverless_password,
  port: config.rds.port
}

var connection = mysql.createConnection(connectionArgs);

但是,当我尝试使用ssl证书连接到新的无服务器群集时,我得到一个错误,即服务器不支持安全连接:

// Fails with new RDS serverless cluster:
const fs = require('fs');
const mysql = require('mysql2');
const config = require('../config');

var connectionArgs = {
  host: config.rds_host,
  database: config.rds_serverless_database,
  user: config.rds_serverless_user,
  password: config.rds_serverless_password,
  port: config.rds.port,
  ssl: {
    ca: fs.readFileSync(__dirname + '/../rds-combined-ca-bundle.pem')
  }
}

var connection = mysql.createConnection(connectionArgs);

Debug: internal, implementation, error 
Error: Server does not support secure connnection
at ClientHandshake.handshakeInit (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/commands/client_handshake.js:120:17)
at ClientHandshake.Command.execute (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/commands/command.js:40:20)
at Connection.handlePacket (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/connection.js:513:28)
at PacketParser.onPacket (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/connection.js:81:16)
at PacketParser.executeStart (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/packet_parser.js:76:14)
at Socket.<anonymous> (/home/deploy_user/my-node-rds-app/node_modules/mysql2/lib/connection.js:89:29)
at emitOne (events.js:116:13)
at Socket.emit (events.js:211:7)
at addChunk (_stream_readable.js:263:12)
at readableAddChunk (_stream_readable.js:250:11)
at Socket.Readable.push (_stream_readable.js:208:10)
at TCP.onread (net.js:601:20)

有什么不同?旧的rds数据库和新的无服务器集群唯一明显的区别是旧的示例是MySQL5.6.40,新的rds集群是aurora MySQL5.6.10a。旧的rds示例主机名解析为单个私有ip,而新的集群主机名解析为多个私有ip。
我使用mysql适配器得到相同的结果。我还尝试了mysql适配器中的“amazonrds”ssl配置文件,得到了相同的结果。
我无法使用iam数据库身份验证,因为此服务每秒需要处理20个以上的新连接。
任何建议都将不胜感激。

hm2xizp9

hm2xizp91#

我可以确认rds aurora mysql(无服务器)最终支持到集群的ssl/tls连接。但是,需要一个兼容mysql 8.0的客户机(尽管底层数据库只有mysql 5.6.10a,但是集群代理需要一个8.0客户机来支持ssl)。
https://aws.amazon.com/premiumsupport/knowledge-center/rds-error-2026-ssl-connection/
(从页面:)
错误2026(hy000):ssl连接错误:ssl\u ctx\u set\u default\u verify\u paths failed或错误2026(hy000):ssl连接错误:asn:其他签名确认错误
如果证书标识符(证书文件名)不正确,您可能会收到此错误。如果mysql客户机不支持证书标识符,例如aurora serverless,您也会收到此错误。如果使用aurora serverless集群并使用mysql客户端连接到aurora serverless,那么必须使用mysql 8.0兼容的mysql命令。

juzqafwq

juzqafwq2#

截至2018年10月,aurora serverless不支持ssl[1]. 在你的实验中,你的连接大多被降级为不安全的连接。您应该能够查询状态表来确认这一点。
[1] https://docs.aws.amazon.com/amazonrds/latest/aurorauserguide/aurora-serverless.html
aurora serverless不支持以下功能:
从amazons3存储桶加载数据
使用aurora mysql本机函数调用aws lambda函数
高级审计
极光复制品
回溯
数据库克隆
iam数据库身份验证
跨区域读取副本
从mysql数据库示例恢复快照
从amazon s3迁移备份文件
使用安全套接字层(ssl)连接到db群集

相关问题