Ubuntu 22.04.1 LTS
pyodbc 4.0.35
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
Followed steps on Install the Microsoft ODBC driver for SQL Server (Linux)
Installation successful. When I run this snippet
def select_driver():
"""Find least version of: ODBC Driver for SQL Server."""
drv = sorted([drv for drv in pyodbc.drivers() if "ODBC Driver " in drv and " for SQL Server" in drv])
if len(drv) == 0:
raise Exception("No 'ODBC Driver XX for SQL Server' found.")
return drv[-1]
print(select_driver())
Output is : ODBC Driver 18 for SQL Server
My connection string .
cnxn_str = ("Driver={SQL Server Native Client 18.0};"
"Server=xx;"
"Database=xx;"
"UID=xx;"
"PWD=xx")
myCon = pyodbc.connect(cnxn_str)
Edit: With new connection "Driver={ODBC Driver 18 for SQL Server};"
[Microsoft][ODBC Driver 18 for SQL Server]TCP Provider: Error code 0x2746 (10054) (SQLDriverConnect)')
EDIT: root@vps:~# openssl version -a
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) built
on: Thu Oct 27 17:06:56 2022 UTC platform: debian-amd64 options:
bn(64,64) compiler: gcc -fPIC -pthread -m64 -Wa,–noexecstack -Wall
-Wa,–noexecstack -g -O2 -ffile-prefix-map=/build/openssl-WsPfAX/openssl-3.0.2=. -flto=auto -ffat-lto-object s -flto=auto -ffat-lto-objects -fstack-protector-strong -Wformat
-Werror=format-sec urity -DOPENSSL_TLS_SECURITY_LEVEL=2 -DOPENSSL_USE_NODELETE -DL_ENDIAN
-DOPENSSL_PI C -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl" ENGINESDIR:
"/usr/lib/x86_64-linux-gnu/engines-3" MODULESDIR:
"/usr/lib/x86_64-linux-gnu/ossl-modules" Seeding source: os-specific
CPUINFO: OPENSSL_ia32cap=0xffbaa2234f8bffff:0x400000283
4
Answers
I was having the same problem trying to connect from PHP 8.1 in a Ubuntu 22.04 server to a Microsoft SQL Server 2014.
OpenSSL 3.0 (which comes with Ubuntu 22.04) changed the default behaviour of SECLEVEL. Now you need to specify 0 instead of 1. More info here: https://github.com/openssl/openssl/issues/17476
Two different things fixed the problem for me:
As explained above, in /etc/ssl/openssl.cnf
Change:
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=2
To:
[system_default_sect]
CipherString = DEFAULT:@SECLEVEL=0
Also, when establishing the connection in PHP (and I imagine the same would work in Python too) to the SQL server, add the following options:
"Encrypt"=>true, "TrustServerCertificate"=>true
Ubuntu 20.04 works for me, somehow after upgrading to 22.04, everything breaks. Need to downgrade SSL to 1.1
March 2023
I encountered the same issue after building a docker image based on ubuntu:20.04 for AWS Sagemaker processing jobs. I resolved the error by installing a specific version of openssl, namely, 1.1.1p.
This was the command I added to my docker file:
This line should be added before the command that installs the appropriate Microsoft SQL Server ODBC drivers (which was msodbcsql17 in my case)
Connect to MSSQL from ubuntu (22.04)
At first, install pyodbc using pip (preferred)
Install Microsoft ODBC Drivers, can be found here
open /opt/ssl/openssl.conf and update
[system_default_sect] section with the following
CipherString = DEFAULT:@SECLEVEL=0
Restart the system
Connection test in python: