Как настроить 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"
Другие вопросы по тегам