Некоторое время я использую Node.js LTS с базами данных RDS MySQL. Недавно я создал бессерверный кластер RDS Aurora MySQL 5.6. В отличие от других моих баз данных RDS, я не могу заставить Node.js подключиться к новому бессерверному кластеру с SSL с помощью адаптеров Node mysql или mysql2.
Из одного экземпляра Ubuntu с одним приложением Node.js:
Я могу успешно подключить приложение Node к любой из моих старых баз данных RDS (MySQL 5.6.40) с помощью SSL:
// 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);
С того же компьютера я могу без проблем подключиться с помощью SSL к новому кластеру RDS с помощью клиента MySQL:
// 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
Я могу успешно подключить приложение Node к новому бессерверному кластеру без 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 и новым бессерверным кластером состоит в том, что старые экземпляры - это MySQL 5.6.40, а новый кластер RDS - это Aurora MySQL 5.6.10a. Также старые имена хостов экземпляров RDS разрешаются в один частный IP-адрес, в то время как новое имя хоста кластера разрешается в несколько частных IP-адресов.
Я получаю те же результаты, используя адаптер mysql. Я также пробовал профиль SSL «Amazon RDS» в адаптере mysql и получил те же результаты.
Я не могу использовать аутентификацию базы данных IAM, потому что этой службе потребуется обрабатывать более 20 новых подключений в секунду.
Любой совет будет очень признателен.
Ошибка «Сервер не поддерживает безопасное соединение» возвращается, если возможности сервера не включают флаг «безопасное соединение», а для конфигурации клиента требуется ssl. Можете ли вы попробовать запустить свой клиент с флагом debug: true и опубликовать несколько соответствующих строк из логов? (флаги сервера esp)
Андрей - Ты прав. Клиентское соединение MySQL незаметно переводится на открытый текст. Когда я устанавливаю --ssl-mode=REQUIRED, я получаю обратно ERROR 2026 (HY000): SSL connection error: Server doesn't support SSL.






По состоянию на октябрь 2018 года Aurora Serverless не поддерживает SSL. [1]. В вашем эксперименте рейтинг ваших соединений в основном понижается до небезопасных. Вы должны иметь возможность запрашивать таблицы состояния, чтобы подтвердить это.
[1] https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html
Aurora Serverless doesn't support the following features:
Loading data from an Amazon S3 bucket
Invoking an AWS Lambda function with an Aurora MySQL native function
Advanced auditing
Aurora Replicas
Backtrack
Database cloning
IAM database authentication
Cross-region read replicas
Restoring a snapshot from a MySQL DB instance
Migrating backup files from Amazon S3
Connecting to a DB cluster with Secure Socket Layer (SSL)
Спасибо, что указали на это. К сожалению, это так. Я с нетерпением жду поддержки SSL.
Я могу подтвердить, что RDS Aurora MySQL (Serverless) наконец-то поддерживает подключения SSL / TLS к кластеру. Однако требуется клиент, совместимый с MySQL 8.0 (хотя базовая БД - только MySQL 5.6.10a, прокси-сервер кластера требует клиента 8.0 для поддержки SSL).
https://aws.amazon.com/premiumsupport/knowledge-center/rds-error-2026-ssl-connection/
(со страницы:)
ERROR 2026 (HY000): SSL connection error: SSL_CTX_set_default_verify_paths failed or ERROR 2026 (HY000): SSL connection error: ASN: bad other signature confirmation
You can receive this error if the certificate identifier (certificate file name) isn't correct. You can also receive this error if the certificate identifier isn't supported by the MySQL client, for example with Aurora Serverless. If you use Aurora Serverless clusters and you use the MySQL client to connect to Aurora Serverless, then you must use the MySQL 8.0-compatible MySQL commands.
Когда вы говорите: «Я могу подключиться с помощью SSL к новому кластеру RDS с помощью клиента MySQL» - каков результат команды
statusиз клиента cli? (а может запросSHOW STATUS LIKE 'Ssl_cipher';)? Просто попытка дважды проверить, что клиент командной строки действительно надежно подключен, а не тихо понижает вас до соединения с открытым текстом, поскольку это единственный доступный вариант