如何解决Amazon Linux2023上Laravel11连接Windows2008R2 MSSQL的SSL问题?
解决Amazon Linux 2023下PHP 8.2+Laravel 11连接遗留MSSQL的SSL协议不兼容问题(ODBC方案)
问题背景
无法迁移或更新遗留MSSQL数据库,仅需读取数据。在Amazon Linux 2023 + PHP 8.2 + Laravel 11环境下,配置sqlsrv驱动连接时出现以下SSL协议不支持错误:
Illuminate\Database\QueryException
SQLSTATE[08001]: [Microsoft][ODBC Driver 17 for SQL Server]SSL Provider: [error:0A000102:SSL routines::unsupported protocol]
原config/database.php中的连接配置:
'legacy_database' => [ 'driver' => 'sqlsrv', 'host' => env('LEGACY_DB_HOST'), 'port' => env('LEGACY_DB_PORT', '1433'), 'database' => env('LEGACY_DB_DATABASE'), 'username' => env('LEGACY_DB_USERNAME'), 'password' => env('LEGACY_DB_PASSWORD'), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'options' => [ PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8, 'TrustServerCertificate' => true, 'Encrypt' => false, 'LoginTimeout' => 30, 'TraceOn' => 1, 'ReturnDatesAsStrings' => true, ], ],
可行方案:使用ODBC连接
可以通过ODBC实现连接,以下是具体操作步骤:
1. 安装必要组件
在Amazon Linux 2023终端执行以下命令,安装ODBC相关依赖:
# 安装EPEL源(未安装时执行) sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm # 添加Microsoft软件源并安装ODBC Driver 18(适配旧SSL协议) sudo dnf config-manager --add-repo https://packages.microsoft.com/config/rhel/9/prod.repo sudo dnf install -y msodbcsql18 mssql-tools18 # 安装PHP ODBC扩展 sudo dnf install -y php-odbc
2. 配置Laravel的ODBC连接
修改config/database.php,将原legacy_database配置替换为ODBC格式:
'legacy_database' => [ 'driver' => 'odbc', 'dsn' => env('LEGACY_DB_ODBC_DSN'), 'username' => env('LEGACY_DB_USERNAME'), 'password' => env('LEGACY_DB_PASSWORD'), 'charset' => 'utf8', 'prefix' => '', 'options' => [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 'TrustServerCertificate' => 'yes', 'Encrypt' => 'no', 'LoginTimeout' => 30, ], ],
在.env文件中配置ODBC的DSN,有两种方式可选:
方式1:直接定义DSN字符串
LEGACY_DB_ODBC_DSN=Driver={ODBC Driver 18 for SQL Server};Server=tcp:你的数据库主机,1433;Database=你的数据库名;Encrypt=no;TrustServerCertificate=yes;
方式2:使用系统DSN(可选)
编辑/etc/odbc.ini添加系统级DSN:
[LegacyMSSQL] Driver=ODBC Driver 18 for SQL Server Server=你的数据库主机,1433 Database=你的数据库名 Encrypt=no TrustServerCertificate=yes
然后在.env中引用该DSN:
LEGACY_DB_ODBC_DSN=LegacyMSSQL
3. 解决SSL协议不兼容的额外调整
如果仍出现SSL错误,说明遗留MSSQL使用了过时的SSL协议(如TLS 1.0/1.1),需调整系统SSL策略:
# 临时允许旧SSL协议(重启后失效) sudo update-crypto-policies --set DEFAULT:SHA1 # 永久允许(执行后需重启系统生效) sudo update-crypto-policies --set DEFAULT:SHA1 sudo reboot
4. 测试连接
创建测试路由验证连接是否成功:
Route::get('/test-legacy-db', function () { try { DB::connection('legacy_database')->select('SELECT TOP 1 * FROM 你的测试表名'); return '遗留数据库连接成功'; } catch (\Exception $e) { return '连接失败:' . $e->getMessage(); } });
内容的提问来源于stack exchange,提问作者Rustam Anvarov
相关产品推荐
相关产品推荐

