Получение сообщения об ошибке «Клиент не поддерживает протокол аутентификации, запрошенный сервером» с использованием MySQL Connector в Python - PullRequest
0 голосов
/ 16 февраля 2020

Здравствуйте, дорогие друзья из StackOverflow,

При подключении к управляемому экземпляру MySQL (DigitalOcean) я получаю странную ошибку. Соединение работает на моем компьютере Dev (машина Windows 8.1), но не на сервере Prod (CentOS 8, SE Linux в режиме permissive). Соединение также работает с MySQL Workbench.

Я сделал pip freeze в обеих упомянутых средах, и оба результата mysql-connector-python==8.0.19, что я нахожу очень странным. Я проверил свои тесты с активированным venv.

Управляемый экземпляр MySQL 8.x настроен так, чтобы разрешать соединения как с моей дроплеты, так и с моего IP-адреса разработчика. Я также попробовал это без включенного брандмауэра. Управляемый экземпляр требует использования соединения с поддержкой SSL, поэтому предоставляется сертификат CA (на данный момент я применил к нему chmod 777, чтобы убедиться, что это не является причиной проблемы).

I ' я проверил документацию библиотеки, которую я использую, и она совместима с MySQL 8.

Стоит также отметить, что я также попробовал решение в этом вопросе об этом.

Код следующий. Работает, как и ожидалось, в Windows.

import datetime

import mysql.connector
from mysql.connector.constants import ClientFlag

dbconn_host = '<sanitized>'
dbconn_port = '<sanitized>'
dbconn_user = '<sanitized>'
dbconn_passwd = '<sanitized>'
dbconn_database = '<sanitized>'

cnx = mysql.connector.connect(
    host=dbconn_host,
    port=dbconn_port,
    user=dbconn_user,
    passwd=dbconn_passwd,
    database=dbconn_database,
    client_flags=ClientFlag.SSL,
    ssl_ca='.\\ca_certificate.crt', # When running on prod server I change it to a proper Linux path
    # auth_plugin='caching_sha2_password' # Trying another solution I had it changed to mysql_native_password
)

cur_a = cnx.cursor(buffered=True)

query_sel = (
    "SELECT * FROM datasources"
)

cur_a.execute(query_sel)

for w in cur_a:
    print(w[0])

Это трассировка стека, которую я получаю в Linux.

(venv) [root@<sanitized> <sanitized>]# python -i conn-test.py
Traceback (most recent call last):
  File "conn-test.py", line 12, in <module>
    cnx = mysql.connector.connect(
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/__init__.py", line 219, in connect
    return MySQLConnection(*args, **kwargs)
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 104, in __init__
    self.connect(**kwargs)
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/abstracts.py", line 960, in connect
    self._open_connection()
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 290, in _open_connection
    self._do_auth(self._user, self._password,
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 212, in _do_auth
    self._auth_switch_request(username, password)
  File "/var/<sanitized>/venv/lib/python3.8/site-packages/mysql/connector/connection.py", line 256, in _auth_switch_request
    raise errors.get_exception(packet)
mysql.connector.errors.DatabaseError: 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client
>>>

Как вы думаете, в чем здесь проблема?

1 Ответ

0 голосов
/ 16 февраля 2020

Волшебство c StackOverflow - это когда вы публикуете вопрос, решение которого вы найдете в течение нескольких минут. Произошли две вещи:

  • Половину времени у меня не было сетевого подключения к базе данных MySQL.
  • Поэтому я запустил все виды тестов, прежде чем смог даже пропинговать сервер , затем я понял, что должен снова запустить все тесты, но я не начал с основ (я сделал все тесты с примененными исправлениями, вместо того, чтобы сначала попытаться, так сказать, «ванильное» соединение).

Решение заключается в том, что я закомментировал client_flags=ClientFlag.SSL,, но оставил сертификат CA включенным, и соединение с сервером Prod работало должным образом.

...