Как настроить pymssql с поддержкой SSL в Ubuntu?

Какие шаги необходимо было выполнить для настройки (сейчас прекращено) pymssql с поддержкой SSL в Ubuntu чтобы я мог подключиться к экземпляру SQL Server, для которого требуется зашифрованное соединение (например, Azure)?


person Gord Thompson    schedule 08.09.2016    source источник


Ответы (4)


Убунту 16.04 ЛТС

(См. этот ответ для 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, нажав ссылку «Стабильная версия» на странице freetds.org. Распакуйте архив, перейдите в только что созданный каталог (например, freetds-1.00.104), а затем выполните

./configure --with-openssl=/usr/include/openssl --enable-msdblib
make
sudo make install

Проверьте сборку с помощью

tsql -C

и убедитесь, что в списке указаны «Версия TDS: авто» и «OpenSSL: да». Затем используйте 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-соединениями.

Во всяком случае, для меня.

person Gord Thompson    schedule 08.09.2016
comment
Чувак - круто, спасибо за ответ. Чтобы добавить безумия, похоже, что OpenSSL 1.1 ломает сборку FreeTDS 0.95, поэтому мне пришлось переделать мой openssl с помощью «apt-get install openssl1.0», чтобы заставить его работать на Ubuntu 18.04 — это сработало для меня. - person T3am5hark; 17.05.2018
comment
@ T3am5hark - я добавил еще один ответ специально для Ubuntu 18.04. - person Gord Thompson; 11.10.2018
comment
@GordThompson Следуя инструкциям, я вижу, что шифрование включено в freetds/pymssql. Но когда я проверяю на стороне SQL-сервера, зашифровано ли соединение, используя это, SELECT *,encrypt_option FROM sys.dm_exec_connections, я вижу, что encrypt_option='False'. Какие-нибудь мысли? - person Sandesh; 03.06.2019
comment
@Sandesh - Вы подключаетесь к Azure SQL? Когда я подключаюсь напрямую к экземпляру SQL Server в своей локальной сети и выполняю SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id=@@SPID, он возвращает 'TRUE'. - person Gord Thompson; 03.06.2019
comment
@GordThompson: Да, я подключаюсь к Azure SQL. - person Sandesh; 03.06.2019
comment
@GordThompson: Отходя от pymssql, я смотрю на pyodbc, есть ли какие-либо документы или информация, на которую вы можете указать, как подключиться к Sybase с помощью pyodbc? - person Sandesh; 03.06.2019

Убунту 18.04 ЛТС

В репозиториях 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
person Gord Thompson    schedule 10.10.2018
comment
Кажется, я люблю тебя, чувак, я целыми днями искал этот проклятый ответ! - person millenion; 15.04.2019
comment
Горд, у тебя есть решение для CentOS? - person Nilesh; 01.06.2019
comment
@Nilesh - Извините, нет. Я использую pyodbc сейчас. - person Gord Thompson; 01.06.2019
comment
@GordThompson Чувак, ты не дал мне заплакать из-за этого! Работает как шарм! - person Eric G; 14.05.2020

Для 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:\nAdaptive Server соединение не удалось\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.

person Julio González Gil    schedule 16.08.2019

вы можете использовать pymssql:2.2.0

сначала удалите старый pymssql:

sudo pip3 uninstall pymssql

вторая установка нового pymssql:

sudo pip3 install "pymssql==2.2.0"
person xqlsrjjjh    schedule 12.04.2021
comment
Да, последняя версия pymssql должна работать как есть. @xqlsrjjjh, исправьте несбалансированную кавычку. - person madbird; 12.04.2021