Как настроить pymssql с поддержкой SSL в Ubuntu?
Какие шаги необходимы для настройки pymssql с поддержкой SSL в Ubuntu, чтобы я мог подключиться к экземпляру SQL Server, для которого требуется зашифрованное соединение (например, Azure)?
4 ответа
Ubuntu 16.04 LTS
(См. Этот ответ для Ubuntu 18.04 LTS.)
Следующее работало для меня на чистой установке Xubuntu 16.04 LTS x64:
Первая проблема заключается в том, что FreeTDS, который мы получаем из репозиториев Ubuntu 16.04, не поддерживает SSL "из коробки", поэтому нам нужно создать свой собственный. Начните с установки python3-pip
(который также устанавливает build-essentials, g++ и кучу других вещей, которые нам понадобятся) и libssl-dev
(библиотеки OpenSSL, необходимые для сборки FreeTDS с поддержкой SSL)
sudo apt install python3-pip libssl-dev
Загрузите исходный код FreeTDS, нажав ссылку "Стабильный релиз" на http://www.freetds.org/. Распакуйте архив, переключитесь на каталог, который вы только что создали (например, freetds-1.00.104), а затем выполните
./configure --with-openssl=/usr/include/openssl --enable-msdblib
make
sudo make install
Проверьте сборку с
tsql -C
и убедитесь, что указаны "TDS version: auto" и "OpenSSL: yes". Тогда используйте tsql
проверить "сырое" соединение FreeTDS, например,
tsql -H example.com -p 1433 -U youruserid -P yourpassword
Теперь для установки pymssql. По умолчанию последние версии поставляются в виде предварительно скомпилированного файла "wheel", который не поддерживает зашифрованные соединения, поэтому нам нужно установить его из источника pymssql. Начиная с pymssql 2.1.4, процесс сборки опирается на Cython, поэтому сначала выполните
pip3 install --user Cython
а затем сделать
pip3 install --user --no-binary pymssql pymssql
Когда сборка завершена, pymssql установлен.
Но... это не сработает (пока). Когда мы пытаемся сделать import pymssql
в Python мы получаем
ImportError: libsybdb.so.5: невозможно открыть общий объектный файл: нет такого файла или каталога
потому что, видимо, этот файл находится в "неправильном" месте. Исправление (ссылка: здесь) заключается в создании символической ссылки в "правильном" месте, которая указывает на фактический файл
sudo ln -s /usr/local/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5
sudo ldconfig
Теперь pymssql работает с SSL-соединениями.
Во всяком случае для меня.
Ubuntu 18.04 LTS
В репозитории Ubuntu 18.04 будет установлена версия FreeTDS, которая поддерживает GnuTLS, поэтому нет необходимости создавать FreeTDS из исходного кода. Однако нам все еще нужно собрать pymssql из исходного кода, потому что просто
pip3 install --user pymssql
установит предварительно скомпилированное "колесо", которое не поддерживает безопасные соединения. Вместо этого нам нужно сделать
sudo apt install python3-pip freetds-dev
pip3 install --user Cython
pip3 install --user --no-binary pymssql pymssql
Для Ubuntu 16.04 кажется, что по крайней мере контейнеры Docker имеют версию FreeTDS, которая уже поддерживает SSL.
Также, по крайней мере для Python 2.7, Cython не нужен:
https://github.com/tds-fdw/ci-setup/blob/master/ubuntu16.04/Dockerfile (строки 23-39)
Но есть о чем помнить!
Версия TDS для подключения к Azure должна быть не ниже 7.1 (или новее, в зависимости от ваших потребностей: https://www.freetds.org/userguide/choosingtdsprotocol.htm)
Иначе вы увидите пресловутую:
[ОШИБКА] (20017, 'сообщение об ошибке DB-Lib 20017, уровень серьезности 9:\n Неожиданный EOF от сервера \ n Ошибка Net-Lib во время выполнения операции (115)\n Ошибка DB-Lib 20002, уровень серьезности 9:\n Адаптивный сервер соединение не удалось \n')
По какой-то причине это не было необходимо для Ubuntu 14.04 и pymssql 2.1.3 без какой-либо дополнительной настройки (https://github.com/tds-fdw/ci-setup/blob/master/ubuntu14.04/Dockerfile)
Это можно сделать с помощью:
export TDSVER=7.1
Или в коде Python и в функции подключения, добавив параметр:
tds_version='7.1'
Благодаря этому я могу использовать pymssql 2.1.4 для без проблем подключаться к Azure.
вы можете использовать pymssql:2.2.0
сначала удалите старый pymssql:
sudo pip3 uninstall pymssql
вторая установка нового pymssql:
sudo pip3 install "pymssql=="2.2.0"