NodeJS mysql / xdevapi 'Доступ запрещен' с использованием SSL и протокола X - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь подключиться к своему mysql серверу, используя протокол X и SSL.
Для подключения к базе данных я использую MySQL x devapi для NodeJs (mysql / xdevapi). И сервер MySQL, и мое приложение nodejs работают на одном компьютере. Однако каждый раз, когда я пытаюсь установить sh соединение, я получаю следующую ошибку:

Error: Access denied for user 'accountservice'@'localhost' (using password: YES)
at AuthenticationHandler.BaseHandler.<computed> (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\Protocol\ResponseHandlers\BaseHandler.js:113:19)
at Array.entry (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\Protocol\ResponseHandlers\BaseHandler.js:90:29)
at WorkQueue.process (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\WorkQueue.js:75:19)
at Client.handleServerMessage (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\Protocol\Client.js:201:21)
at Client.handleNetworkFragment (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\Protocol\Client.js:245:14)
at Socket.<anonymous> (F:\Repositorys\Project\Application\node_modules\@mysql\xdevapi\lib\Protocol\Client.js:89:36)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:296:12)
at readableAddChunk (_stream_readable.js:272:9)
at Socket.Readable.push (_stream_readable.js:213:10) {
 info: {
  severity: 0,
  code: 1045,
  sqlState: 'HY000',
  msg: "Access denied for user 'username'@'localhost' (using password: YES)"
 }
}

Сначала я подумал, что, возможно, мой пароль неправильный или мои сертификаты недействительны, но с использованием
mysql -u username -p --ssl-ca=/etc/certs/ca.pem --ssl-cert=../res/certs/mysql/client-cert.pem --ssl-key=../res/certs/mysql/client-key.pem
для входа я не получаю ошибки.

В дополнение к этому, я также предоставил своему пользователю все привилегии во всех базах данных и таблицах, чтобы убедиться, что недостающие привилегии не являются причиной неудачного подключения.
Единственная возможность, о которой я могу думать, - это ошибка проверки сертификата сервера, хотя openssl verify -CAfile ca.pem server-cert.pem возвращает server-cert.pem: OK.

Для подключения к базе данных я использую следующий код, написанный на TypeScript

const conf = {
    host: 'localhost',//config.getHost(),
    port: 33060,//config.getPort(),
    user: 'username',//config.getUsername(),
    password: 'password',//config.getPassword(),
    schema: 'database',//config.getDatabase(),

    auth: 'SHA256_MEMORY', //removing this results in "Invalid authentication method PLAIN"

    ssl: {
        key: config.getCertKey(),
        cert: config.getCert(),
        ca: config.getCa()
    }
}

this.client = mysql.getClient(conf);

и

connect(next) {
    console.log('Connecting to database ' + this.config.getDatabase() + '(' + this.config.getHost() + ':' + this.config.getPort() + ')...');
    this.client.getSession().then(session => {
        this.session = session;
        console.log('Connection to database ' + this.config.getDatabase() + '(' + this.config.getHost() + ':' + this.config.getPort() + ') established.');
        listen(this, next);
    }).catch((err) => {
        console.log('Failed to establish connection to database ' + this.config.getDatabase() + '(' + this.config.getHost() + ':' + this.config.getPort() + ').');
        console.log(err);
    });
}

Возможно, я пропустил очень важный шаг, но на данный момент я понятия не имею, что вызывает эту проблему, несмотря на то, что я прочитал несколько ответов на StackOverflow и других страницах.

1 Ответ

1 голос
/ 07 мая 2020

Publi c -ключная аутентификация не является первоклассной проблемой API, но ничто не мешает вам предоставить ключи, в данном случае, под свойством sslOptions (а не свойством ssl) в объекте конфигурации. Эти параметры будут просто объединены при вызове tls.connect(). Напротив, есть поддержка API для проверки центра сертификации, которая в этом случае требует только указать путь к файлу CA (как описано здесь ).

Что-то вроде следующего должно работать трюк:

const conf = {
  //...
  sslOptions: {
    // read contents of key.pem and cert.pem
    key: fs.readFileSync('/path/to/key.pem')
    cert: fs.readFileSync('/path/to/cert.pem'),
    // path (only) to ca.pem
    ca: '/path/to/ca.pem'
  }
}

Если вы уже используете версию 8.0.20, этот вариант устарел, и вместо этого вы должны использовать:

const conf = {
  //...
  tls: {
    key: fs.readFileSync('/path/to/key.pem')
    cert: fs.readFileSync('/path/to/cert.pem'),
    ca: '/path/to/ca.pem'
  }
}

Причина, по которой вы получаете Invalid authentication method PLAIN ошибка связана с тем, что клиент наивен и предполагает, что, поскольку ssl не true, это означает, что TLS должен быть отключен, что не работает с PLAIN, механизмом аутентификации по умолчанию.

В любом В этом случае это должно быть go, как только вы начнете использовать sslOptions.

Отказ от ответственности: я являюсь ведущим разработчиком MySQL X DevAPI Connector для Node.js

...