SSL-соединения с бессерверным кластером RDS MySQL / Aurora не работают с Node.js

Некоторое время я использую 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 новых подключений в секунду.

Любой совет будет очень признателен.


person Community    schedule 03.10.2018    source источник
comment
Когда вы говорите, что я могу подключиться с помощью SSL к новому кластеру RDS с помощью клиента MySQL - каков результат команды status от клиента cli? (или, может быть, SHOW STATUS LIKE 'Ssl_cipher'; запрос)? Просто пытаясь дважды проверить, что клиент командной строки действительно надежно подключен, а не тихо понижал вас до открытого текстового соединения, поскольку это единственный доступный вариант   -  person Andrey Sidorov    schedule 10.10.2018
comment
Сервер не поддерживает безопасное соединение. Ошибка возвращается, если возможности сервера не включают флаг «безопасное соединение», а для конфигурации клиента требуется ssl. Можете ли вы попробовать запустить своего клиента с флагом debug: true и опубликовать несколько соответствующих строк из журналов? (флаги сервера esp)   -  person Andrey Sidorov    schedule 10.10.2018
comment
Андрей - Ты прав. Клиентское соединение MySQL незаметно переводится на открытый текст. Когда я установил --ssl-mode=REQUIRED, я вернусь ERROR 2026 (HY000): SSL connection error: Server doesn't support SSL.   -  person    schedule 24.10.2018


Ответы (2)


По состоянию на октябрь 2018 года Aurora Serverless не поддерживает SSL. [1]. В вашем эксперименте рейтинг ваших соединений в основном понижается до небезопасных. Вы должны иметь возможность запрашивать таблицы состояния, чтобы подтвердить это.

[1] https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html

Aurora Serverless не поддерживает следующие функции:

Загрузка данных из корзины Amazon S3

Вызов функции AWS Lambda с собственной функцией Aurora MySQL

Расширенный аудит

Реплики Авроры

Возврат

Клонирование базы данных

Аутентификация базы данных IAM

Межрегиональные реплики чтения

Восстановление снимка из экземпляра БД MySQL

Перенос файлов резервных копий из Amazon S3

Подключение к кластеру БД с помощью Secure Socket Layer (SSL)

person The-Big-K    schedule 25.10.2018
comment
Спасибо, что указали на это. К сожалению, это так. Я с нетерпением жду поддержки SSL. - person ; 30.10.2018

Я могу подтвердить, что 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/

(со страницы:)

ОШИБКА 2026 (HY000): ошибка подключения SSL: сбой SSL_CTX_set_default_verify_paths или ОШИБКА 2026 (HY000): ошибка подключения SSL: ASN: неверное подтверждение другой подписи

Вы можете получить эту ошибку, если идентификатор сертификата (имя файла сертификата) неверен. Вы также можете получить эту ошибку, если идентификатор сертификата не поддерживается клиентом MySQL, например, с Aurora Serverless. Если вы используете кластеры Aurora Serverless и используете клиент MySQL для подключения к Aurora Serverless, вы должны использовать команды MySQL, совместимые с MySQL 8.0.

person J. Caputo    schedule 10.04.2019