Как подключить SQLAlchemy к экземпляру GCP CLoud SQL, используя SSL? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь подключиться к облаку GCP SQL Экземпляр, используя Python 3, и не хочу использовать облачный прокси-сервер, я просто хочу подключиться напрямую, используя SSL-сертификаты, поэтому я следовал руководству GCP здесь для подключения из общедоступного c IP, защищенного с помощью ключей ssl.

Использование этого работает для mysql клиента:

mysql -uroot -pMyPassWord -h 1.2.3.4 --ssl-ca=server-ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem

Но когда я делаю, я верю, что то же самое в Python Я получаю ошибку:

from sqlalchemy import create_engine

db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'ssl_cert':'./client-cert.pem', 'ssl_key':'./client-key.pem', 'ssl_ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)

print(engine.table_names())

Ошибка:

sqlalchemy.ex c .OperationalError: (MySQLdb._exceptions.OperationalError) ( 1045, «Доступ запрещен для пользователя 'root'@'1.2.3.4' (с использованием пароля: ДА)») (Справочная информация об этой ошибке: http://sqlalche.me/e/e3q8)

Что достаточно просто, если бы не тот факт, что я:

  1. уже добавил свой publi c IP-адрес 1.2.3.4/32 в качестве авторизованной сети.
  2. Я могу получить доступ через mysql клиента, так почему ограничение там не применяется?

Чего мне не хватает?

1 Ответ

0 голосов
/ 19 апреля 2020

ОК, наконец-то все заработало. Сообщение об ошибке вводит в заблуждение, так как вы ожидаете, что оно связано с внесением в белый список моего IP, но это не так. Вот рабочий код:

from sqlalchemy import create_engine

db_connect_string='mysql+mysqldb://root:MyPassWord@1.2.3.4:3306/mydb'
ssl_args = {'ssl': {'cert':'./client-cert.pem', 'key':'./client-key.pem', 'ca':'./server-ca.pem'}}
engine = create_engine(db_connect_string, connect_args=ssl_args)

print(engine.table_names())

Для mysqlclient нужен словарь ssl с парами ключей, но все остальные ответы, которые я мог найти в стеке, были либо неправильными, либо, возможно, они были изменены.

Вот ссылка на словарь, который требуется передать в качестве аргумента:

https://mysqlclient.readthedocs.io/user_guide.html#installation

Вот документация MySQL, которая объясняет аргументы:

https://dev.mysql.com/doc/refman/8.0/en/mysql-ssl-set.html

Полный список аргументов здесь:

  • mysql: обработчик соединения возвратился из mysql_init () .
  • ключ: путь к файлу закрытого ключа клиента.
  • сертификат: путь к файлу сертификата ключа клиента publi c.
  • ca: The путь к файлу сертификата центра сертификации (ЦС). Этот параметр, если он используется, должен указывать тот же сертификат, который используется сервером.
  • capath: путь к каталогу, содержащему файлы доверенных сертификатов SSL CA.
  • cipher: список допустимых шифры для шифрования SSL.
...