使用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
]
]
测试通过,没有问题。
原因说明
是什么造成了这样的原因呢?其实很简单。
新环境:Microsoft ODBC 18
旧环境:Microsoft ODBC 17
也就是这两个版本的区别。区别就是,18的encrypt默认配置改为1了,而17默认配置为0,所以在连接的时候,需要手动设置连接参数,这样就不会出现:SSL routines:tls_process_server_certificate:certificate verify failed:self signed certificate。这样的报错了。
其实报错的提示还是非常友善的。
上一篇: 删除windows带点文件夹
下一篇: MyGit:GitHub仓库更新提醒
SSL证书作为网站安全的重要组成部分,其在保护用户数据安全、防止信息泄露和保障网站可信度方面发挥着至关重要的作用。然而,对于许多小型企业和个人站长来说,昂贵的SSL证书费用成为他们望而却步的原因之一。来此加密:申请泛域名和多域名SSL证书。那么,如何申请到既便宜又可靠的SSL证书呢?一、了解SSL证书的基本概念在申请SSL证书之前,我们首先需要了解SSL证书
SSL即安全套接层,在OSI模型中处于第5层会话层,由网景公司于1994年发明。SSL发展到v3时已趋于成熟,于是互联网工程组IETF在1999年把它改名为TLS,正式标准化,版本号从1.0重新算起,所以TLS1.0实际上就是SSLv3.1。我们习惯称为SSL/TLS,由于习惯性我们现在说的SSL就是TLS,之间没有太大的区别。
多域名证书就是指:一张SSL证书可以包含多个域名。比如本站的证书包含以下域名:*.cdn.osfipin.com*.osfipin.comosfipin.com使用多域名证书,一张证书可以同时部署在多个网站中。维护多个网站的时候,使用多域名证书会非常方便。在来此加密网站上,可以免费申请多域名证书。
GoogleCloud在2022年3月30号推出了Google公共证书。GoogleTrustServices:通过提供透明、可信和可靠的证书颁发机构来帮助构建更安全的互联网(HelpingbuildasaferInternetbyprovidingatransparent,trusted,andreliableCertificateAuthority.)。
BuyPass是挪威的一家CA机构,提供数字证书、安全认证产品等多种服务。目前BuyPass提供了类似Let'sEncrypt的基于ACME/Certbot的证书自动签发服务-BuyPassGOFreeSSL,免费!以下是整理BuyPass的特点:1、6个月有效期。2、不支持泛域名,一个证书最多6个单域名。3、渠道服务器在挪威。4、根证书起始时间: