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 новых подключений в секунду.

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

Когда вы говорите: «Я могу подключиться с помощью SSL к новому кластеру RDS с помощью клиента MySQL» - каков результат команды status из клиента cli? (а может запрос SHOW STATUS LIKE 'Ssl_cipher';)? Просто попытка дважды проверить, что клиент командной строки действительно надежно подключен, а не тихо понижает вас до соединения с открытым текстом, поскольку это единственный доступный вариант

Andrey Sidorov 10.10.2018 05:28

Ошибка «Сервер не поддерживает безопасное соединение» возвращается, если возможности сервера не включают флаг «безопасное соединение», а для конфигурации клиента требуется ssl. Можете ли вы попробовать запустить свой клиент с флагом debug: true и опубликовать несколько соответствующих строк из логов? (флаги сервера esp)

Andrey Sidorov 10.10.2018 05:30

Андрей - Ты прав. Клиентское соединение MySQL незаметно переводится на открытый текст. Когда я устанавливаю --ssl-mode=REQUIRED, я получаю обратно ERROR 2026 (HY000): SSL connection error: Server doesn't support SSL.

user2700992 24.10.2018 18:24
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
4
3
2 693
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По состоянию на октябрь 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.

user2700992 30.10.2018 21:12

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

Другие вопросы по теме