如何为单条连接降低OpenSSL SECLEVEL而非全局配置?
单连接解决isql连接无TLS支持数据库的0x2746错误
问题背景
使用isql连接不支持TLS加密的SQL Server数据库时,遇到错误码0x2746(提示无TLS支持)。全局降低/etc/ssl/openssl.cnf中SECLEVEL到0可解决问题,但会带来系统级安全隐患,需实现单连接级别的配置。
可行解决方案
方案1:临时指定OpenSSL配置文件(仅当前isql进程生效)
OpenSSL允许通过环境变量OPENSSL_CONF指定自定义配置文件,仅对当前进程生效:
- 创建临时配置文件(如
~/temp-openssl.cnf),内容如下:
[system_default_sect] CipherString = DEFAULT@SECLEVEL=0
- 运行
isql时临时加载该配置:
OPENSSL_CONF=~/temp-openssl.cnf isql -v -k "Driver={Driver SQL Server};Server=mysql-server;Database=DATABASE;UID=user;PWD=pwd;"
此方式仅影响该isql实例,系统其他进程仍使用默认高安全级别配置。
方案2:修改ODBC连接字符串强制禁用加密(优先推荐)
若使用的SQL Server ODBC驱动支持,可直接在连接字符串中添加加密控制参数,无需修改OpenSSL配置:
- 对于旧版
Driver SQL Server驱动:
isql -v -k "Driver={Driver SQL Server};Server=mysql-server;Database=DATABASE;UID=user;PWD=pwd;Encrypt=no;"
- 对于新版
ODBC Driver 17/18 for SQL Server驱动:
isql -v -k "Driver={ODBC Driver 17 for SQL Server};Server=mysql-server;Database=DATABASE;UID=user;PWD=pwd;Encrypt=optional;"
该方法直接跳过TLS加密协商,从根源避免安全级别冲突,安全性更高。
为什么之前的自定义配置无效
OpenSSL默认仅读取配置文件中的[system_default_sect]节,自定义的[mysql-server]节不会被自动加载,isql及ODBC驱动也不会主动识别这类自定义节,因此之前的配置无法生效。
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

