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

相关文章

最全的免费SSL证书申请方式

在SSL广泛普及的今天,申请一张免费的SSL证书是一件非常容易的事情。这里为大家总结当前阶段(2023年)拥有一张免费SSL证书的方式。首推的方式为来此加密网站,文章后面会有详细的介绍。所谓SSL即是保证传输的安全,防止客户端与服务端在数据传递过程中,信息被篡改。遥想当年,当我们使用国内优质的宽带时,访问网站总是弹出莫名其妙的广告,而这些广告与网站无关。大家

SSL和TLS是一个意思吗

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

什么是多域名SSL证书

多域名证书就是指:一张SSL证书可以包含多个域名。比如本站的证书包含以下域名:*.cdn.osfipin.com*.osfipin.comosfipin.com使用多域名证书,一张证书可以同时部署在多个网站中。维护多个网站的时候,使用多域名证书会非常方便。在来此加密网站上,可以免费申请多域名证书。

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、根证书起始时间:‎

内容管理网 - 备案号:湘ICP备16000039号-2