【问题标题】:How to configure pymssql with SSL support on Ubuntu?如何在 Ubuntu 上配置支持 SSL 的 pymssql?
【发布时间】:2017-01-16 15:48:23
【问题描述】:

在 Ubuntu 上配置(现在为 discontinued)支持 SSL 的 pymssql 需要哪些步骤,以便我可以连接到需要加密连接的 SQL Server 实例(例如 Azure)?

【问题讨论】:

    标签: python ubuntu pymssql


    【解决方案1】:

    Ubuntu 16.04 LTS

    (对于 Ubuntu 18.04 LTS,请参阅 this answer。)

    在全新安装 Xubuntu 16.04 LTS x64 时,以下内容对我有用:

    第一个挑战是我们从 Ubuntu 16.04 存储库获得的 FreeTDS 不支持“开箱即用”的 SSL,因此我们需要构建自己的。首先安装 python3-pip(它还安装 build-essentials、g++ 和我们需要的一堆其他东西)和 libssl-dev(构建支持 SSL 的 FreeTDS 所需的 OpenSSL 库)

    sudo apt install python3-pip libssl-dev
    

    点击freetds.org的“稳定版”链接下载FreeTDS的源代码。解压存档,切换到刚刚创建的目录(例如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就安装好了。

    但是......它不会工作(还)。当我们尝试在 Python 中执行 import pymssql 时,我们得到

    ImportError: libsybdb.so.5: 无法打开共享对象文件:没有这样的文件或目录

    因为显然该文件位于“错误”的位置。修复(参考:here)是在指向实际文件的“正确”位置创建符号链接

    sudo ln -s /usr/local/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5
    sudo ldconfig
    

    现在 pymssql 可以使用 SSL 连接。

    对我来说,无论如何。

    【讨论】:

    • 老兄 - 太棒了,谢谢你的回答。更让人疯狂的是,OpenSSL 1.1 似乎破坏了 FreeTDS 0.95 上的构建,所以我不得不使用 'apt-get install openssl1.0' 对我的 openssl 进行反向版本,以使其在 Ubuntu 18.04 上工作——这对我有用。
    • @T3am5hark - 我为 Ubuntu 18.04 添加了另一个答案。
    • @GordThompson 按照这些步骤,我看到在 freetds/pymssql 中打开了加密。但是,当我检查 SQL 服务器端连接是否已加密时,使用 SELECT *,encrypt_option FROM sys.dm_exec_connections,我看到 encrypt_option='False'。有什么想法吗?
    • @Sandesh - 您是否连接到 Azure SQL?当我直接连接到 LAN 上的 SQL Server 实例并执行 SELECT encrypt_option FROM sys.dm_exec_connections WHERE session_id=@@SPID 时,它会返回 'TRUE'
    • @GordThompson :是的,我正在连接到 Azure SQL。
    【解决方案2】:

    Ubuntu 18.04 LTS

    Ubuntu 18.04 存储库将安装支持 GnuTLS 的 FreeTDS 版本,因此并非绝对需要从源代码构建 FreeTDS。但是,我们仍然需要从源代码构建 pymssql,因为只需照常进行

    pip3 install --user pymssql
    

    将安装一个不支持安全连接的预编译“轮子”。相反,我们需要这样做

    sudo apt install python3-pip freetds-dev
    pip3 install --user Cython
    pip3 install --user --no-binary pymssql pymssql
    

    【讨论】:

    • 我想我爱你,我花了一整天的时间寻找那个该死的答案!
    • Gord,你有 CentOS 的解决方案吗?
    • @Nilesh - 对不起,不。我现在使用 pyodbc。
    • @GordThompson 伙计,你阻止了我为这个哭泣!像魅力一样工作!
    【解决方案3】:

    对于 Ubuntu 16.04,似乎至少 Docker 容器有一个已经支持 SSL 的 FreeTDS 版本。

    另外,至少对于 Python 2.7,Cython 是不需要的:

    https://github.com/tds-fdw/ci-setup/blob/master/ubuntu16.04/Dockerfile(第 23-39 行)

    但有一点要记住!

    连接到 Azure 的 TDS 版本必须强制至少为 7.1(或更新,取决于您的需要:https://www.freetds.org/userguide/choosingtdsprotocol.htm

    否则你会看到臭名昭著的:

    [ERROR] (20017, 'DB-Lib 错误消息 20017, 严重性 9:\n意外 来自服务器的 EOF\n操作期间的 Net-Lib 错误现在正在进行中 (115)\nDB-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。

    【讨论】:

      【解决方案4】:

      你可以使用 pymssql:2.2.0

      先卸载旧的pymssql:

      sudo pip3 uninstall pymssql
      

      第二次安装新的pymssql:

      sudo pip3 install "pymssql==2.2.0"
      

      【讨论】:

      • 是的,pymssql 的最新版本应该可以正常工作。 @xqlsrjjjh,请修正不平衡的引号。
      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      相关资源
      最近更新 更多