#node.js #sql-server #sequelize.js #tedious
#node.js #sql-сервер #sequelize.js #утомительно
Вопрос:
Я работал над проектом NodeJS локально на моем компьютере (Windows), который подключается к базе данных SQL Server с помощью Sequelize. Он отлично работает на моем локальном компьютере, но когда я загружаю его в веб-приложение Azure, я получаю следующую ошибку при каждом запросе..
Не удалось подключиться к x.x.x.x: 1433 — зависание сокета (IP-адрес заменен мной на X)
Код идентичен, и я проверил, что в базе данных нет ограничений IP, она полностью открыта. Я также проверил, что переменные среды (имя пользователя / пароль и т.д.) идентичны и правильно загружаются в рабочей среде. Фактически, мое ведение журнала показывает, что попытка подключения идентична.
Единственное, что заставляет его работать, это удаление опции Sequelize / tedious {encrypt:true} .
Итак, просто для ясности, зашифрованные соединения работают с локального хоста, но не из веб-приложения Azure.
Я буквально понятия не имею, почему это может быть так, что любые предложения были бы полезны, даже если они просто указывают мне правильное направление.
Вот моя настройка sequelize. Очевидно, что я отредактировал IP-адрес хоста и данные для входа, но на данный момент они одинаковы для разработчиков и производства.
{
'production': {
'username': xxx,
'password': xxx,
'database': xxx,
'host': xxx,
'dialect': 'mssql',
'dialectOptions': {
'options': {
'encrypt': true,
'multipleStatements': true,
'validateBulkLoadParameters': false
}
},
'omitNull': true,
'pool': {
'max': 100,
'min': 0,
'acquire': 30000,
'idle': 10000
},
'logging': false
},
'development': {
'username': xxx,
'password': xxx,
'database': xxx,
'host': xxx,
'dialect': 'mssql',
'dialectOptions': {
'options': {
'encrypt': true,
'multipleStatements': true,
'validateBulkLoadParameters': false,
'debug': {
'packet': true,
'data': true,
'payload': true,
'token': true
}
}
},
'omitNull': true,
'pool': {
'max': 100,
'min': 0,
'acquire': 30000,
'idle': 10000
},
'logging': false
}
}
Комментарии:
1. Если удаление
encrypt:true
заставляет его работать, тогда на ум приходят две возможности: 1) между клиентом и сервером нет соглашения для версий протокола TLS 1.0, 1.1, 1.2, препятствующего установлению защищенного соединения, или 2) имя хоста в вашей конфигурации не упоминается в свойствах Subject или DnsNames файла.сертификат сервера, поэтому клиент ему не доверяет. Вероятно, вы могли бы протестировать 2, используя обаencrypt: true
иtrustServerCertificate: true
в параметрах, или, возможно, использоватьopenssl s_client
для сброса сертификата сервера и проверки его свойств вручную.2. Я попробую (2), хост — это ip-адрес. Будет ли это нормально работать с моего компьютера?
3. Если в Azure используется тот же IP-адрес сервера, что и на вашем компьютере, то, вероятно, сертификат сервера был добавлен в ваше собственное хранилище доверенных сертификатов.
4. OpenSSL может быть установлен на любом компьютере, который может получить доступ к целевому серверу. Если у вас есть удаленный доступ к целевому серверу, вы также можете зайти в диспетчер конфигурации SQL Server и проверить конфигурацию сети SQL Server, чтобы узнать, какой сертификат SSL / TLS он настроен для использования, затем посмотрите в Управление сертификатами компьютеров (т.Е.: certmgr.msc для локального компьютера)> Личные> Сертификаты для найдите соответствующий сертификат и проверьте его свойства.
5. Только вы можете оценить достоинства удаления
encrypt: true
, чтобы заставить его работать. Если у вас есть какие-либо конфиденциальные данные, передаваемые по проводам (например, пароли или любые другие PII), это не кажется хорошей идеей.