升级 OpenSSL 后 ODBC 找不到正确的 OpenSSL 版本

ODBC can't find correct OpenSSL version after upgrading OpenSSL

更新:如果你有同样的问题,问题的根源正在讨论here


用自制软件升级到 Python3.10 后,我的 OpenSSL 也升级到版本 3。

现在我无法再连接到我的 SQL 服务器,因为 ODBC 需要 OpenSSL 1.1 或 1.0。所以当我 运行:

isql -v -k "<connection string"

我收到以下错误:

[08001][Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [OpenSSL library could not be loaded, make sure OpenSSL 1.0 or 1.1 is installed]
[08001][Microsoft][ODBC Driver 17 for SQL Server]Client unable to establish connection

但是当我查看 /usr/local/etc/ 时,我看到 openssl@1.1 已安装:

我该如何解决这个问题?不是很熟悉这个。所以ODBC需要找到正确的OpenSSL版本,也就是1.1.

我试过了:

ln -s /usr/local/Cellar/openssl@1.1/1.1.1g /usr/local/opt/openssl

另外,当我 运行 openssl 命令时,它找到了正确的版本:

➜  ~ openssl
OpenSSL> version
OpenSSL 1.1.1l  24 Aug 2021
OpenSSL> 

输出brew list openssl@1.1

/usr/local/Cellar/openssl@1.1/1.1.1l_1/.bottle/etc/ (7 files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/bin/c_rehash
/usr/local/Cellar/openssl@1.1/1.1.1l_1/bin/openssl
/usr/local/Cellar/openssl@1.1/1.1.1l_1/include/openssl/ (104 files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib/libcrypto.1.1.dylib
/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib/libssl.1.1.dylib
/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib/engines-1.1/ (2 files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib/ (4 other files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/share/doc/ (3971 files)
/usr/local/Cellar/openssl@1.1/1.1.1l_1/share/man/ (3971 files)
➜  ~ 

ls -l /usr/local/opt/openssl/lib/libssl.dylib

的输出
lrwxr-xr-x  1 username  admin  14 Sep  7 13:46 /usr/local/opt/openssl/lib/libssl.dylib -> libssl.3.dylib

另外 运行ning DYLD_PRINT_LIBRARIES=1 isql -v -k "<connection string" 给了我以下信息。似乎它仍然链接到 openssl@3

dyld: loaded:  /usr/local/opt/openssl/lib/libssl.dylib
dyld: loaded: /usr/local/Cellar/openssl@3/3.0.0/lib/libcrypto.3.dylib
[08001][Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [OpenSSL library could not be loaded, make sure OpenSSL 1.0 or 1.1 is installed]
[08001][Microsoft][ODBC Driver 17 for SQL Server]Client unable to establish connection
[ISQL]ERROR: Could not SQLDriverConnect

您是否尝试过重新安装 msodbcsql17?

旧版本的 msodbcsql17 报告依赖于 OpenSSL 1.1:

$ brew deps -n msodbcsql17
m4
libtool
unixodbc
openssl@1.1

正在重新安装 msodbcsql17...

$ brew reinstall msodbcsql17
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/manifests/3.0.0
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openssl/3/blobs/sha256:ec819e57038f4ae11e3a3e083ec1d37c174e44fce08830bd
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:ec819e57038f4ae11e3a3e083ec1d37c174
######################################################################## 100.0%
==> Downloading https://download.microsoft.com/download/1/9/A/19AF548A-6DD3-4B48-88DC-724E9ABCEB9A/msodbcsql17-17.8.1.1-
==> Reinstalling microsoft/mssql-release/msodbcsql17 
==> Installing dependencies for microsoft/mssql-release/msodbcsql17: openssl
==> Installing microsoft/mssql-release/msodbcsql17 dependency: openssl
==> Pouring openssl@3--3.0.0.catalina.bottle.tar.gz
==> Regenerating CA certificate bundle from keychain, this may take a while...
  /usr/local/Cellar/openssl@3/3.0.0: 6,415 files, 28.2MB
==> Installing microsoft/mssql-release/msodbcsql17
The license terms for this product can be downloaded from
https://aka.ms/odbc17eula and found in
/usr/local/share/doc/msodbcsql17/LICENSE.txt . By entering 'YES',
you indicate that you accept the license terms.
Do you accept the license terms? (Enter YES or NO)
YES
==> odbcinst -u -d -n "ODBC Driver 17 for SQL Server"
==> odbcinst -i -d -f ./odbcinst.ini
  /usr/local/Cellar/msodbcsql17/17.8.1.1: 10 files, 2MB, built in 9 seconds

重新安装或升级 msodbcsql17 后,OpenSSL 3 现在被报告为依赖项:

$ brew deps -n msodbcsql17
m4
libtool
unixodbc
openssl@3

在尝试了很多事情之后,我找到了一个(hacky)解决方案:

  1. 我删除了 /usr/local/opt/ 中的 link:
rm openssl
  1. 创建了一个新的 link 到 openssl@1.1
ln -s /usr/local/Cellar/openssl@1.1/1.1.1l_1 /usr/local/opt/openssl

我不确定你删除了哪个link,因为我把它们都放在下面的link

ls /usr/local/opt: -openssl -openssl@1.1 -openssl@3

您是否删除了 /usr/local/opt/openssl ?我们应该用 /usr/local/opt/openssl@1.1 和 /usr/local/opt/openssl@3 做什么?我们应该保留它们吗?

此外,我在 /usr/local/opt/openssl@1.1.

中没有看到 1.1.1l_1

我试过这个: ln -s /usr/local/Cellar/openssl@1.1/1.1.1l_1 /usr/local/opt/openssl 这是我得到的回应,同样的问题仍然存在: ln: /usr/local/opt/openssl: 文件存在

谢谢