Невозможно установить соединение TLS TCP с удаленным сервером MySQL с помощью PyMySQL, другие инструменты работают - PullRequest
0 голосов
/ 10 апреля 2019

Настройка нового сервера, который я хочу связать с центральной базой данных MySQL, используя соединение TLS для безопасности

Следуя шагам, подобным this Я смог настроить TLS дляНа моем сервере MySQL я сделал несколько пользователей, которые могут войти с любого хоста (%) и требуют SSL-соединений

+------------+-----------+----------+
| user       | host      | ssl_type |
+------------+-----------+----------+
| testuser   | %         | ANY      |
+------------+-----------+----------+

Я могу подтвердить это на любом хосте, подключившись с помощью таких инструментов, как HeidiSQL или MySQLИнструмент CLI Пример: mysql -u testuser -p -h mysql_server_IP это инициирует TLS-соединение, что подтверждается \ s. Это исключает большинство проблем, которые я видел на этом и других форумах, что вызвано тем, что для хоста установлено значение localhost.

При доступе к локальным базам данных работает нормально.При подключении к удаленным TLS-серверам баз данных это также работает нормально.

import pymysql.cursors

connection = pymysql.connect(host=host,
                             user=user,
                             password=password,
                             db=db,
                             cursorclass=pymysql.cursors.DictCursor)

Когда я пытаюсь получить доступ к моему серверу с помощью require-tls, я получаю следующую ошибку pymysql.err.OperationalError: (1045, "Access denied for user 'testuser'@'desktop.example.com' (using password: YES)")

Другие выводы, которые у меня есть, указывают на то, что эта ошибка вызвана: Неверное имя пользователя / паролькомбинации или соединение, запрещенное этим хостом.Однако я знаю, что могу устанавливать соединения с этого хоста, как продемонстрировал CLI.

1 Ответ

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

При подключении к серверу, который имеет только require_secure_transport = ON в my.cnf, PyMySQL выдает более очевидную ошибку, связанную с невозможностью установить соединение TLS. pymysql.err.InternalError: (3159, 'Connections using insecure transport are prohibited while --require_secure_transport=ON.' Но если самому пользователю MySQL требуется SSL, вы получите более общую ошибку отказа в разрешении из приведенного выше вопроса.

На трекере github есть упоминание о предоставлении файла CA.pem. Если у вас нет доступа к этим файлам и вы хотите безоговорочно доверять самоподписанному сертификату. В документах упоминается флаг -ssl, который позволяет передавать пути для различных файлов сертификатов.

Однако, передав действительный словарь, без каких-либо допустимых ключей, вы можете эффективно скрывать доверенные самозаверяющие сертификаты. Пример:

connection = pymysql.connect(host=host,
                             user=user,
                             password=password,
                             db=db,
                             cursorclass=pymysql.cursors.DictCursor,
                             ssl={"fake_flag_to_enable_tls":True})
...