PHP连接SQLSERVER出现SSL certificate报错

2022-11-30 09:57:52 PHP SQLServer SSL

使用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仓库更新提醒

相关文章

php判断数组键名是否存在

在PHP中一般用来判断数组的键名或索引是否存在的函数有:isset array_key_exists测试代码ini_set('display_errors',true);error_reporting(E_ALL);date_default_timezone_set('PRC');$name=['a'=>'asd222','b'=>nu

华为云免费SSL证书

华为云提供20张免费域名SSL证书,域名类型为单域名、有效期为1年。该证书为DigiCert品牌为DV(Basic)型的证书类型。如果希望申请泛域名和多域名证书,可前往来此加密网站申请,一样也是免费的。申请的限制条件一个帐号最多可以申请20张。额度说明:1、20张的免费证书额度包括:已删除或已吊销证书、购买后超时未付款自动失效的订单、购买后未申请就删除的证书

SSL和TLS是一个意思吗

SSL即安全套接层,在OSI模型中处于第5层会话层,由网景公司于1994年发明。SSL发展到v3时已趋于成熟,于是互联网工程组IETF在1999年把它改名为TLS,正式标准化,版本号从1.0重新算起,所以TLS1.0实际上就是SSLv3.1。我们习惯称为SSL/TLS,由于习惯性我们现在说的SSL就是TLS,之间没有太大的区别。

Google免费SSL证书 自有CA根证书

GoogleCloud在2022年3月30号推出了Google公共证书。GoogleTrustServices:通过提供透明、可信和可靠的证书颁发机构来帮助构建更安全的互联网(HelpingbuildasaferInternetbyprovidingatransparent,trusted,andreliableCertificateAuthority.)。

Buypass:免费的6个月SSL证书 支持多域名

BuyPass是挪威的一家CA机构,提供数字证书、安全认证产品等多种服务。目前BuyPass提供了类似Let'sEncrypt的基于ACME/Certbot的证书自动签发服务-BuyPassGOFreeSSL,免费!以下是整理BuyPass的特点:1、6个月有效期。2、不支持泛域名,一个证书最多6个单域名。3、渠道服务器在挪威。4、根证书起始时间:‎

吠品博客 = 写代码 || 讲故事 || 读历史 || 做视频