Функции Azure (Python) не могут подключиться к экземпляру Azure MySQL с помощью [SSL: WRONG_VERSION_NUMBER]
Я создаю простую функцию 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 ответа
В конце концов я решил проблему сам.
Вот шаги:
Загрузите сертификат SSL из репозитория документов Azure. Вы можете получить его здесь: https://docs.microsoft.com/en-us/azure/mysql/howto-configure-ssl
Поместите файл сертификата вместе с проектом функции Azure. Я помещаю его в корневую папку проекта, потому что в этом проекте у меня будет несколько функций, для которых потребуется этот сертификат.
Затем приобретите файл сертификации в коде Python, как показано ниже.
import pathlib def get_ssl_cert(): current_path = pathlib.Path(__file__).parent.parent return str(current_path / 'BaltimoreCyberTrustRoot.crt.pem')
Итак, я могу использовать сертификат SSL при подключении к MySQL.
# Connect to MySQL cnx = mysql.connector.connect( user="ctao@azure-mysql-test", password='*******', host="azure-mysql-test.mysql.database.azure.com", port=3306, database='ciscoepcstats', ssl_ca=get_ssl_cert() )
PS Отключение проверки SSL не вариант для меня из соображений безопасности. Но, к счастью, я нашел решение.
Измените свой код, как показано ниже:
db_conn = mysql.connector.connect(
user="...",
password='...',
host="....mysql.database.azure.com",
port=3306,
database='...',
ssl_disabled=True
)
и измените статус "Принудительное соединение SSL" на "ОТКЛЮЧЕНО" в вашем Azure MySQL на портале Azure.