TLS1.0禁用问题

1,问题的提出

某VB编写的应用程序,配合SQLServer2017数据库使用,在某客户现场运行正常。

后来基于安全审查的理由,需要禁用TLS1.0协议。但是,在禁用TLS1.0协议后,出现程序无法连接数据库的故障。

而同时,数据库自带的客户端工具却能正常连接数据库实例。

 

  

2,问题复现

为解决上述问题,试图在公司内复现问题。公司内采用的是SQLServer2008 R2数据库。

采用IIScrypto工具软件设置TLS协议。在仅启用TLS1.2和ssl3.0之后,程序运行正常。客户的问题未能重现。

3,技术研究

在网上根据错误信息搜索解决方案,发现一些有价值的信息。分别叙述如下:

3.1 技术文章1

https://blog.csdn.net/weixin_39907762/article/details/111090889?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-7.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-7.control

上文发生故障的环境与本文非常类似,也是与TLS1.0协议和 SQL Server 2017版本数据库有关,非常具有借鉴意义。文章指出:

  • 原来的SQL Server Driver在新环境下不能连接到SQL Server 2017。
  • 通过查阅相关文档和与客户公司IT交流得知,在SQL Server 2016及以后,ODBC驱动需要由SQL Server改为ODBC Driver 17 for SQL Server,但是快速开发平台并不仅仅使用ODBC Driver,还需要 OLE DB Provider的支持。
  • ODBC Driver 17 for SQL Server仅提供ODBC驱动,不满足快速开发平台的要求。

该文经过对各种驱动程序的筛选,最后选定SQL Server Native Client 11.0作为新环境的驱动程序,然后由平台的开发人员对平台中的相关代码和界面进行调整,最终在新环境连接数据库成功,可以正常运行。并指出设置的关键在于:

  • SQL Server Driver:SQL Server Native Client 11.0
  • OLE DB Provider:SQLNCLI11

3.2 技术文章2

https://cloud.tencent.com/developer/article/1593770

该文中描述的错误也是一直提示: Run-time error ‘-2147467259 (80004005)’: [DBNETLIB][ConnectionOpen (SECDoClientHandshake()).]SSL Security error.

  • 搜索了很多资料,都是说要改注册表的SSL1,SSL1.1, SSL1.2,但是并没有什么卵用。最后经过无数次试验,改一下链接字符串就OK了。
  • 老的链接字符串: ServerConnString = “Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;PWD=xxxxxx;Initial Catalog=MyDB;Data Source=ServerName”
  • 试着改成了 ServerConnString = “Provider=SQLNCLI11;Persist Security Info=False;User ID=sa;PWD=xxxxxx;Initial =MyDB;Data Source=ServerName” 本地链接成功,
  • 然后就把新版本的excel发布出去了。结果用户反馈,链接不上。 然后又试着改成下面的字符串 ServerConnString = “Driver={sql server};server=ServerName;uid=sa;PWD=xxxxxx; database=MyDB; AutoTranslate=False” 完美解决问题。

该文指出问题的关键点在于修改连接数据库的字符串,并给出了2种连接方式。一种是采用Provider,另一种是采用Driver。

以上对于本人最终解决问题,提供了最直接的思路。

3.3 技术文章3

https://blog.csdn.net/xqhrs232/article/details/78274572

SQL Server客户端工具到底使用的是哪个provider呢?

该文给出的以上表格非常具有借鉴意义。可以看出,SQLServer数据库的ODBC驱动程序从sqlsvr32.dll,到sqlncli.dll,再到sqlncli10.dll,再到sqlncli11.dll。

因此明确,连接字符串的Provider参数应该采用sqlncli11。

3.4 技术文章4

 Microsoft has recently released SQL Server 2017 and ODBC Client 13.1.

https://www.dataaccess.com/news/microsoft-sql-server-2017-and-odbc-driver-13-1-support-1410

Microsoft® ODBC Driver 13.1 for SQL Server® - Windows, Linux, & macOS

https://www.microsoft.com/en-us/download/details.aspx?id=53339

从该文了解到微软ODBC驱动实际上已经发展到了13.1版本。但对于2017数据库,11版的驱动应该就足够了。

4,问题的解决

最终,在以上文章的启发下,采用了以下连接字符串连接数据库,顺利解决了禁用TLS1.0协议程序无法连接的问题。

Provider=SQLNCLI11;Persist Security Info=False;User ID=sa;PWD=xxxxxx;Initial Catalog=Carpos;Data Source=192.168.5.114

注意事项:运行应用程序的电脑上必须安装SQL Server Native Client 11的驱动。检查依据就是系统的ODBC配置界面出现相关驱动,如下图所示:

原文地址:https://www.cnblogs.com/jackkwok/p/14637450.html