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 флаг.

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

0 ответов

Другие вопросы по тегам