首页 > 解决方案 > [SqlAlchemy][mssql][tls1.2] 如何使用 Windows 中的 pyodbc 为连接到 MS SQL Server 的 SqlAlchemy 强制实施 TLS 1.2?

问题描述

最近的强化标准使我们禁用了 TLS 1.0 和 1.1。

TLS 1.0 和 1.1 的注册表设置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client

现在下面的代码:

from sqlalchemy import create_engine

db = create_engine(
    "mssql+pyodbc://__OUR_SERVER_NAME__/__OUR_DATABSE_NAME__?driver=SQL+Server+Native+Client+11.0&Trusted_Connection=yes&Encrypt=yes&TrustServerCertificate=Yes&ssl=True",
    connect_args={
        # 'sslmode': 'require',    # did not work
        # 'tls-version': 'tls1.2', # did not work
        # 'ssl': True,             # did not work
    },
    echo=True,
)

with db.begin() as conn:
    conn.execute("SELECT TOP 5 * FROM sys.tables")

将抛出此异常db.begin()

有关详细信息,请参阅 SQL Server 联机丛书。(-2146893007)')

TLS 1.2 已启用,并且可以与同一客户端服务器上的 Azure Data Studio 一起正常工作。

甚至 python 显示 openssl 版本是合理的:

import ssl
print(f'SSL Version = {ssl.OPENSSL_VERSION}')

输出:

SSL Version = OpenSSL 1.1.1d  10 Sep 2019

蟒蛇版本:

python --version
Python 3.7.6

我试过看,SSLContext但似乎找不到如何使它与SqlAlchemy一起工作。

任何帮助将不胜感激!!!


可能重复的问题(信息较少):Connecting to SQL Server using pyodc with TLS 1.2

标签: pythonsql-serversslsqlalchemy

解决方案


进一步调查显示 ODBC 驱动程序存在问题。

该应用程序位于 Windows Server 2012 上,带有 ODBC 版本:

SQL Server Native Client 11.0

版本:2011.110.3000.00

日期:2012 年 10 月 20 日

ODBC Driver 17 for SQL Server使用新的连接字符串更新驱动程序:

from sqlalchemy import create_engine

db = create_engine(
    "mssql+pyodbc://__OUR_SERVER_NAME__/__OUR_DATABSE_NAME__?driver=ODBC+Driver+17+for+SQL+Server&Trusted_Connection=yes&Encrypt=yes&TrustServerCertificate=Yes&ssl=True",
    connect_args={
        # 'sslmode': 'require',    # did not work
        # 'tls-version': 'tls1.2', # did not work
        # 'ssl': True,             # did not work
    },
    echo=True,
)

推荐阅读