赞
踩
使用PHP链接SQLSERVER数据库时,出现报错。
PDOException: SQLSTATE[08001]: [Microsoft][ODBC Driver 18 for SQL Server]SSL Provider: [error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate]
简单的翻译是:
使用了SSL加密,但是该证书来自于自签名证书,所以验证失败。
这个是新搭建的环境,按照以往的方式部署了PHP的sqlsrv依赖。代码也是一样的,但是新环境下出现报错。
将SQLSERVER的证书部署到客户端服务器上,这样的话验证就可以通过了。然而这种方式很繁琐,而且我不需要通过加密的方式进行连接(毕竟有性能损耗)。所以这条方案在刚开始就忽略了。
连接SQLSERVER的connection-options,即连接数据库的参数。
有一个参数为:Encrypt。Specifies whether the communication with SQL Server is encrypted (1 or true) or unencrypted (0 or false),默认值为:false (0)。
微软官方手册有有一段话:Enabling Encryption can impact the performance of some applications due to the computational overhead required to encrypt data.(由于加密数据所需的计算开销,启用加密可能会影响某些应用程序的性能。)这也再次验证了之前的思路。我们需要关闭加密。
也就是这个参数控制了连接是否使用了加密,感觉跟上面的错误有关联。如果把这个参数设置为0的话,那么是不是可行呢?
于是修改数据库连接参数。测试时使用的Medoo的框架(简单,主要为了方便),修改为:
- $database = new Medoo([
- 'type' => 'mssql',
- 'driver'=>'sqlsrv',
- 'host' => '192.168.0.8',
- 'database' => 'demo',
- 'username' => 'sa',
- 'password' => 'demo',
- 'encrypt'=>0,// 这个是重点哦
- 'port'=>1433
- ]);
测试通过,没有问题。
如果使用的dbal库,那么修改配置为:(官方手册里有简单的说明,我是通过查看代码,才判断出来在这里修改)
- [
- 'driver' => 'pdo_sqlsrv',
- 'user' => 'user',
- 'password' => 'pass',
- 'host' => '192.168.8.8',
- 'port' => 1433,
- 'dbname' => 'demo',
- 'driverOptions' => [ // 这里是重点哦
- 'encrypt' => 0
- ]
- ]
PHP ci框架的数据库配置可以这样配置
- ##sqlserver体检系统视图
- $db['third_exam_old'] = array(
- //'dsn' => 'dblib:host=127.0.0.2:1401;dbname=health',
- //'dsn' => 'sqlsrv:Server=127.0.0.1;Database=xiaofeiyu',
- 'username' => 'sa',
- 'password' => 'cwz@6868.',
- 'database' => 'IntelligentPhyExamGuid',
- 'dbdriver' => 'sqlsrv',
- 'dbprefix' => '',
- 'pconnect' => FALSE,
- 'db_debug' => TRUE,
- 'cache_on' => FALSE,
- 'cachedir' => '',
- 'char_set' => 'utf8',
- 'dbcollat' => 'utf8_general_ci',
- 'swap_pre' => '',
- 'encrypt' => FALSE,
- 'stricton' => FALSE,
- 'save_queries' => TRUE,
- 'autoinit' => TRUE,
- );
测试通过,没有问题。
是什么造成了这样的原因呢?其实很简单。
新环境:Microsoft ODBC 18
旧环境:Microsoft ODBC 17
也就是这两个版本的区别。区别就是,18的encrypt默认配置改为1了,而17默认配置为0,所以在连接的时候,需要手动设置连接参数,这样就不会出现:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate。这样的报错了。
其实报错的提示还是非常友善的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。