繁体   English   中英

[SqlAlchemy][mssql][tls1.2] 如何使用来自 windows 的 pyodbc 为连接到 MS SQL 服务器的 SqlAlchemy 强制执行 TLS 1.2?

[英][SqlAlchemy][mssql][tls1.2] How to enforce TLS 1.2 for SqlAlchemy connecting to MS SQL Server using pyodbc from windows?

最近的强化标准使我们禁用了 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()上抛出此异常:

发生异常:OperationalError (pyodbc.OperationalError) ('08001', '[08001] [Microsoft][SQL Server Native Client 11.0]客户端不支持加密。(21) (SQLDriverConnect); [08001] [Microsoft][ SQL Server Native Client 11.0]SSL 提供程序: 客户端和服务器无法通信,因为它们不具备通用算法。\r\n (-2146893007); [08001] [Microsoft][SQL Server Native Client 11.0]客户端无法建立连接 (21);[08001] [Microsoft][SQL Server Native Client 11.0] 无效的连接字符串属性 (0);[08001] [Microsoft][SQL Server Native Client 11.0]A.network-related or instance-specific error建立与 SQL 服务器的连接时发生。服务器未找到或不可访问。请检查实例名称是否正确以及 SQL 服务器是否配置为允许远程连接。有关详细信息,请参阅 SQL 服务器联机丛书。(-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 版本:

python --version
Python 3.7.6

我试过查看SSLContext但似乎无法找到如何使其与SqlAlchemy一起使用。

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


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

进一步调查显示 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,
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM