python - ¿Cómo configurar pymssql con soporte SSL en Ubuntu?
(3)
¿Cuáles son los pasos necesarios para configurar pymssql con soporte SSL en Ubuntu para poder conectarme a una instancia de SQL Server que requiera una conexión encriptada (por ejemplo, Azure)?
Ubuntu 16.04 LTS
(Ver esta respuesta para Ubuntu 18.04 LTS.)
Lo siguiente funcionó para mí en una instalación limpia de Xubuntu 16.04 LTS x64:
El primer desafío es que el FreeTDS que obtenemos de los repositorios de Ubuntu 16.04 no es compatible con SSL "fuera de la caja", por lo que necesitamos construir el nuestro.
Comience instalando
python3-pip
(que también instala build-essentials, g ++ y un montón de otras cosas que necesitaremos) y
libssl-dev
(las bibliotecas OpenSSL requeridas para construir FreeTDS con soporte SSL)
sudo apt install python3-pip libssl-dev
Descargue el código fuente de FreeTDS haciendo clic en el enlace "Versión estable" en freetds.org . Descomprima el archivo, cambie al directorio que acaba de crear (por ejemplo, freetds-1.00.104) y luego haga
./configure --with-openssl=/usr/include/openssl --enable-msdblib
make
sudo make install
Comprueba la construcción con
tsql -C
y asegúrese de que "TDS version: auto" y "OpenSSL: yes" estén en la lista.
Luego use
tsql
para probar una conexión FreeTDS "en bruto", por ejemplo,
tsql -H example.com -p 1433 -U youruserid -P yourpassword
Ahora para instalar pymssql. De forma predeterminada, las versiones recientes se envían como un archivo "rueda" precompilado que no admite conexiones cifradas, por lo que debemos instalarlo desde la fuente pymssql. Comenzando con pymssql 2.1.4, el proceso de compilación se basa en Cython, así que primero
pip3 install --user Cython
y luego hacer
pip3 install --user --no-binary pymssql pymssql
Cuando se completa la compilación, se instala pymssql.
Pero ... no funcionará (todavía).
Cuando intentamos
import pymssql
en Python obtenemos
ImportError: libsybdb.so.5: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio
porque aparentemente ese archivo está en el lugar "incorrecto". La solución (ref: here ) es crear un enlace simbólico en el lugar "correcto" que apunte al archivo real
sudo ln -s /usr/local/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5
sudo ldconfig
Ahora pymssql funciona con conexiones SSL.
Para mí, de todos modos.
Ubuntu 18.04 LTS
Los repositorios de Ubuntu 18.04 instalarán una versión de FreeTDS que admita GnuTLS, por lo que no es absolutamente necesario construir FreeTDS desde la fuente. Sin embargo, todavía necesitamos construir pymssql desde la fuente porque simplemente haciendo lo habitual
pip3 install --user pymssql
instalará una "rueda" precompilada que no admite conexiones seguras. En cambio, tenemos que hacer
sudo apt install python3-pip freetds-dev
pip3 install --user Cython
pip3 install --user --no-binary pymssql pymssql
Para Ubuntu 16.04 parece que al menos los contenedores Docker tienen una versión FreeTDS que ya es compatible con SSL.
Además, al menos para Python 2.7, Cython no es necesario:
https://github.com/tds-fdw/ci-setup/blob/master/ubuntu16.04/Dockerfile (líneas 23-39)
¡Pero hay algo a tener en cuenta!
La versión de TDS para conectarse a Azure debe ser forzada al menos a 7.1 (o más reciente, según sus necesidades: https://www.freetds.org/userguide/choosingtdsprotocol.htm )
De lo contrario, verá lo infame:
[ERROR] (20017, ''Mensaje de error DB-Lib 20017, gravedad 9: / nEOF inesperado del servidor / n Error de red-Lib durante la operación ahora en progreso (115) / nDB-Lib mensaje de error 20002, gravedad 9: / n Servidor adaptativo conexión fallida / n '')
Por alguna razón, esto no era necesario para Ubuntu 14.04 y pymssql 2.1.3 sin ninguna configuración adicional ( https://github.com/tds-fdw/ci-setup/blob/master/ubuntu14.04/Dockerfile )
Se puede hacer con:
export TDSVER=7.1
O, en el código de Python, y en la función de conexión, agregue el parámetro:
tds_version=''7.1''
Con eso, puedo usar pymssql 2.1.4 para conectarme a Azure sin problemas.