当前位置:   article > 正文

PHP连接SQL Server SSL Provider 0A000086:SSL routines certificate verify failed:self-signed certificate_ssl provider: [error:0a000086:ssl routines::certif

ssl provider: [error:0a000086:ssl routines::certificate verify failed:self-s

使用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的框架(简单,主要为了方便),修改为:

  1. $database = new Medoo([
  2. 'type' => 'mssql',
  3. 'driver'=>'sqlsrv',
  4. 'host' => '192.168.0.8',
  5. 'database' => 'demo',
  6. 'username' => 'sa',
  7. 'password' => 'demo',
  8. 'encrypt'=>0,// 这个是重点哦
  9. 'port'=>1433
  10. ]);

测试通过,没有问题。

如果使用的dbal库,那么修改配置为:(官方手册里有简单的说明,我是通过查看代码,才判断出来在这里修改)

  1. [
  2. 'driver' => 'pdo_sqlsrv',
  3. 'user' => 'user',
  4. 'password' => 'pass',
  5. 'host' => '192.168.8.8',
  6. 'port' => 1433,
  7. 'dbname' => 'demo',
  8. 'driverOptions' => [ // 这里是重点哦
  9. 'encrypt' => 0
  10. ]
  11. ]

PHP ci框架的数据库配置可以这样配置

  1. ##sqlserver体检系统视图
  2. $db['third_exam_old'] = array(
  3. //'dsn' => 'dblib:host=127.0.0.2:1401;dbname=health',
  4. //'dsn' => 'sqlsrv:Server=127.0.0.1;Database=xiaofeiyu',
  5. 'username' => 'sa',
  6. 'password' => 'cwz@6868.',
  7. 'database' => 'IntelligentPhyExamGuid',
  8. 'dbdriver' => 'sqlsrv',
  9. 'dbprefix' => '',
  10. 'pconnect' => FALSE,
  11. 'db_debug' => TRUE,
  12. 'cache_on' => FALSE,
  13. 'cachedir' => '',
  14. 'char_set' => 'utf8',
  15. 'dbcollat' => 'utf8_general_ci',
  16. 'swap_pre' => '',
  17. 'encrypt' => FALSE,
  18. 'stricton' => FALSE,
  19. 'save_queries' => TRUE,
  20. 'autoinit' => TRUE,
  21. );

测试通过,没有问题。

原因说明

是什么造成了这样的原因呢?其实很简单。

新环境:Microsoft ODBC 18

旧环境:Microsoft ODBC 17

也就是这两个版本的区别。区别就是,18的encrypt默认配置改为1了,而17默认配置为0,所以在连接的时候,需要手动设置连接参数,这样就不会出现:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate。这样的报错了。

其实报错的提示还是非常友善的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/536298
推荐阅读
相关标签
  

闽ICP备14008679号