Ошибка сертификации SSL › имя хоста не совпадает

Я пытаюсь подключиться к серверу Google Cloud MYSQL, используя SSL-сертификаты и модуль python PyMySQL со следующей строкой:

connection = pymysql.connect(host=os.environ['SQL_HOST_IP'], user=os.environ['SQL_USER'], password = os.environ['SQL_PASSWORD'],
db='main', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor, 
ssl={'key': 'client-key.pem', 'cert': 'client-cert.pem', 'ca': 'server-ca.pem'})

К сожалению, я продолжаю получать следующую ошибку:

ssl.CertificateError: hostname 'SQL_IP_ADDRESS' doesn't match '$ALIAS_FROM_SELF_SIGNED_SSL_CERT'

Я искал проблему, но не могу найти исправление, которое не требует исправления кода ssl для пропуска проверки ssl. Я явно указываю IP-адрес хоста SQL, но проверка ssl останавливается во время ssl.match_hostname, поскольку сертификаты ssl самоподписываются с другим именем хоста.

Я уверен, что мои ключи действительны, так как я могу подключиться к ним с помощью Ruby (Windows/Linux) и CLI linux mysql. Кажется, это проблема с ssl.match_hostname. Это похоже на этот вопрос и этот, но оба обходят проблему стороной.

Есть ли способ правильно обрабатывать самозаверяющие сертификаты SSL в Python.


person proximate_cause    schedule 04.03.2017    source источник
comment
У меня точно такая же проблема, вы ее решили?   -  person Antoine Brunel    schedule 11.05.2017
comment
@proximate_cause, если вы смогли решить эту проблему, рекомендуется опубликовать свой ответ как решение, чтобы лучше помочь сообществу. Если нет, эта проблема обычно вызвана тем, что вы находитесь за брандмауэром или прокси-сервером. Рекомендуется исследовать любые конфигурации локальной сети и протестировать подключение из другой сети, которая не имеет каких-либо ограничений.   -  person Jordan    schedule 23.08.2017


Ответы (1)


Хотя решение вашей проблемы с ответом было отклонено в качестве запроса на слияние здесь: https://github.com/PyMySQL/PyMySQL/pull/555

У вас есть возможность отключить check_hostname. Это работает в версии 0.7.11.

ssl_options = {
    'key': 'client-key.pem',
    'cert': 'client-cert.pem',
    'ca': 'server-ca.pem',
    'check_hostname': False
}

connection = pymysql.connect(
    host=os.environ['SQL_HOST_IP'],
    user=os.environ['SQL_USER'],
    password = os.environ['SQL_PASSWORD'],
    db='main', 
    charset='utf8mb4', 
    cursorclass=pymysql.cursors.DictCursor, 
    ssl=ssl_options
)
person closedloop    schedule 25.10.2017