Функции Azure (Python) не могут подключиться к экземпляру Azure MySQL с [SSL: WRONG_VERSION_NUMBER] - PullRequest
0 голосов
/ 23 октября 2019

Я создаю простую функцию Azure с использованием Python. Он просто читает из экземпляра Azure MySQL и записывает что-то обратно в тот же экземпляр. Однако я не могу подключиться к базе данных успешно.

import logging
from datetime import datetime

import azure.functions as func
import mysql.connector
from mysql.connector import errorcode

def connect_to_db():
    logging.info(os.getcwd()) 
    try:
        db_conn = mysql.connector.connect(
            user="...", 
            password='...', 
            host="....mysql.database.azure.com", 
            port=3306, 
            database='...'
        )
        return db_conn
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
            logging.error("Something is wrong with your user name or password")
        elif err.errno == errorcode.ER_BAD_DB_ERROR:
            logging.error("Database does not exist")
        else:
            logging.error(err)

    return None


def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    db_conn = connect_to_db()
    if db_conn:
        logging.info('DB Connection is established {}'.format(db_conn))
    else:
        return func.HttpResponse(
             "Azure Functions cannot connect to MySQL database.",
             status_code=500
        )

    ....

Код отлично работает на моей локальной машине, когда я использую func host start, я также использовал тот же экземпляр Azure MySQL.

Однако после того, как я развернул функцию Azure, она не работает и выдает следующее сообщение об ошибке:

2055: Lost connection to MySQL server at '....mysql.database.azure.com:3306', 
system error: 1 [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:852)

Я также попытался отключить «принудительное использование SSL» на портале Azure и включил Allow access to Azure services, которые не полезны.

Любая помощь и комментарии будут оценены! Спасибо!

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Я сам решил проблему в конечном итоге.

Вот шаги:

  1. Загрузите сертификат SSL из репозитория документов Azure. Вы можете получить его здесь: https://docs.microsoft.com/en-us/azure/mysql/howto-configure-ssl

  2. Поместите файл сертификата вместе с проектом функции Azure. Для меня я положил его в корневую папку проекта, потому что в этом проекте у меня, вероятно, будет несколько функций, для которых потребуется этот сертификат

  3. Затем получите файл сертификации вкод Python, как показано ниже

    import pathlib
    
    def get_ssl_cert():
        current_path = pathlib.Path(__file__).parent.parent
        return str(current_path / 'BaltimoreCyberTrustRoot.crt.pem')
    
  4. Итак, я могу использовать сертификат SSL при подключении к MySQL

    # Connect to MySQL
    cnx = mysql.connector.connect(
        user="ctao@azure-mysql-test", 
        password='4k7JJv~Bh', 
        host="azure-mysql-test.mysql.database.azure.com", 
        port=3306, 
        database='ciscoepcstats',
        ssl_ca=get_ssl_cert()
    )
    

PS ОтключитьПроверка SSL не вариант для меня из-за проблем безопасности. Но, к счастью, я нашел решение.

0 голосов
/ 24 октября 2019

Пожалуйста, измените ваш код, как показано ниже:

db_conn = mysql.connector.connect(
            user="...", 
            password='...', 
            host="....mysql.database.azure.com", 
            port=3306, 
            database='...',
            ssl_disabled=True
        )

и измените статус «Принудительное SSL-соединение» на «ОТКЛЮЧЕНО» в вашем Azure MySQL на портале Azure.

...