ssl не работает с MySQLdb, но с mysqlconnector
К сожалению, я не могу заставить MySQLdb работать и не подключаться через командную строку к серверу AWS, который требует от меня использования SSL. Это странно работает нормально через SequelPro.
Что работает?
Помимо упомянутого GUI, программно использую mysqlconnector
вместо MySQLdb
как двигатель и передать ssl args и это работает:
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
флаг.
Я надеюсь, что некоторые из вас могут увидеть, где я что-то упускаю!