SSL-соединения с RDS MySQL / Aurora кластер без сервера с Node.js - PullRequest
0 голосов
/ 03 октября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Я могу подтвердить, что RDS Aurora MySQL (без сервера) наконец-то поддерживает соединения SSL / TLS с кластером.Однако требуется совместимый с MySQL 8.0 клиент (даже если базовая БД - только MySQL 5.6.10a, прокси-серверу для поддержки SSL требуется клиент 8.0).

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.

0 голосов
/ 25 октября 2018

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

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

Реплики Aurora

Возврат

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

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

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

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

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

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

...