[英]Python ssl unable to connect to TLS1.2 server with TLS1.2 client
[英][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.