К сожалению, я не могу заставить 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
.
Надеюсь, некоторые из вас увидят, где я что-то упускаю!