ssl не работает с MySQLdb, но с mysqlconnector - PullRequest
0 голосов
/ 16 мая 2018

К сожалению, я не могу заставить MySQLdb работать и не подключаться через командную строку к серверу AWS, который требует от меня использования SSL.Это странно работает нормально через SequelPro.

Что работает?

Помимо упомянутого графического интерфейса, программно я использую mysqlconnector вместо MySQLdb в качестве аргументов engine и pass ssl, и это работает:

from sqlalchemy import create_engine
import pandas as pd

pd.read_sql("SHOW DATABASES", 
    create_engine(CONNECTION_STRING.replace('mysqldb', 'mysqlconnector'),
    connect_args={'ssl_ca': '~/Downloads/rds-combined-ca-bundle.pem'}))

Что не работает?

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

conn = create_engine(CONNECTION_STRING)
pd.read_sql_query("SHOW DATABASES", conn)

conn = create_engine(
    CONNECTION_STRING,
    connect_args={'ssl': {'ca': '~/Downloads/rds-combined-ca-bundle.pem'}})
pd.read_sql_query("SHOW DATABASES", conn)

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

OperationalError: (_mysql_exceptions.OperationalError) (1045, "Access denied for user 'MYUSER'@'MYHOST' (using password: YES)") (Background on this error at: http://sqlalche.me/e/e3q8)

А для второго:

OperationalError: (_mysql_exceptions.OperationalError) (2026, 'SSL connection error: error:00000001:lib(0):func(0):reason(1)') (Background on this error at: http://sqlalche.me/e/e3q8)

После поиска этой ошибки "error:00000001:lib(0):func(0):reason(1)" я подумал о неправильном использовании пакета и сделал несколько попыток с различными вариациями в основном (включая mode=VERIFY_IDENTITY, передавая шифр):

mysql -h HOST --ssl-ca=~/Downloads/rds-combined-ca-bundle.pem -u USER -p
Enter password:
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

, бросая то же самоеошибка.

Идеи

Может быть, это работает на mysqlconnector (без передачи чего-либо), потому что пакет ssl (который не используется другими обоими опциями, я пробовал, насколько я вижуно определенно из разъема) выводится на ssl.get_default_verify_paths():

DefaultVerifyPaths(cafile='~/anaconda2/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='~/anaconda2/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='~/anaconda2/ssl/certs')

, поэтому есть некоторая конфигурация по умолчанию, которая делает эту работу (то же самое для sequelPro, вероятно).Но в целом я просто не понимаю, почему он работает нормально с sequelPro и пакетом соединителя, но не с командной строкой и не MySQLdb.

Попытка следующего (из здесь ) работает нормально:

mysql -u MYUSER -h MYHOST --ssl -p

Но не является предпочтительной из-за устаревания флага --ssl.

Надеюсь, некоторые из вас увидят, где я что-то упускаю!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...