NodeJS mysql/xdevapi 'Доступ запрещен' с использованием SSL и протокола X
Я пытаюсь подключиться к своему серверу mysql, используя протокол X и SSL.
Для подключения к базе данных я использую MySQL x devapi для NodeJs(mysql/xdevapi). И сервер MySQL, и мое приложение nodejs работают на одном компьютере. Однако каждый раз, когда я пытаюсь установить соединение, я получаю следующую ошибку:
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);
});
}
Возможно, я пропустил очень важный шаг, но на данный момент я понятия не имею, что вызывает эту проблему, несмотря на то, что я прочитал несколько ответов на Stackru и других страницах.
1 ответ
Аутентификация с открытым ключом не является первоклассной проблемой API, но ничто не мешает вам предоставить ключи, в данном случае, под sslOptions
собственность (не ssl
property) в объекте конфигурации. Эти параметры будут просто объединены при вызове 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
, механизм аутентификации по умолчанию.
В любом случае это должно исчезнуть, как только вы начнете использовать sslOptions
вместо.
Отказ от ответственности: я являюсь ведущим разработчиком MySQL X DevAPI Connector для Node.js