【问题标题】:SSL Connection to databaseSSL 连接到数据库
【发布时间】:2012-10-19 12:15:29
【问题描述】:

我的应用程序需要与 SQL Server 2008 建立安全连接。在服务器端启用“强制加密”后,以下是我的 C# 应用程序的连接字符串。

Initial Catalog=emp_test;Persist Security Info=True;User ID=sa;Password=***;Data Source=172.21.70.94;Provider=SQLOLEDB;Use Encryption for Data=True;Trust Server Certificate=True;

我没有在服务器中提供任何证书 - 因此我给了 Trust Server Certificate=True,因此自签名服务器证书不会被验证。

但未建立连接并出现以下错误。

数据库错误:[DBNETLIB][ConnectionOpen (SECDoClientHandshake()).]SSL 安全错误。

没有与安全相关的两个属性,它可以正常工作。

我需要进行哪些更改才能使其正常工作?

【问题讨论】:

  • 你能帮我试试这个吗? Initial Catalog=emp_test;Persist Security Info=True;User ID=sa;Password=***;Data Source=172.21.70.94;Provider=SQLOLEDB;Encrypt=yes;
  • 嘿 BigM,如果我给 Encrypt=yes,则建立连接,我认为如果不给 TrustServerCertificate 就不会发生这种情况。因此,它从未考虑过该属性。
  • 请参考这篇文章(stackoverflow.com/questions/3674160/…),它清楚地表明Encrypt = yes使用了证书。
  • 根据该帖子上的答案,您还可以将TrustServerCertificate=True 添加到连接字符串中,以便无论证书如何都能够连接。
  • 根据这个 MSDN 帖子 - link,我正在使用带有 IDataInitialize 的初始化字符串,我可能需要使用属性 Use Data for Encryption而不是 加密。同样,我需要使用 Trust Server Certificate 而不是 TrustServerCertificate

标签: c# .net sql-server sql-server-2008 oledb


【解决方案1】:

使用SqlConnection 对象有两个好处。首先,您可以确保正确构建连接字符串,因为您可以使用SqlConnectionStringBuilder 类来构建它。其次,它比 OLEDB 快得多

要建立这个连接字符串...

Initial Catalog=emp_test;Persist Security Info=True;User ID=sa;Password=***;Data Source=172.21.70.94;Provider=SQLOLEDB;Use Encryption for Data=True;Trust Server Certificate=True; 

...使用SqlConnectionStringBuilder 你会写一些这样的代码...

var builder = new SqlConnectionStringBuilder();
builder.DataSource = "172.21.70.94";
builder.Encrypt = true;
builder.TrustServerCertificate = true;
builder.InitialCatalog = emp_test;
builder.PersistSecurityInfo = true;
builder.UserID = "sa";
builder.Password = "***";

var connection = new SqlConnection(builder.ToString());

...Encrypt 属性在 .NET Framework 中保存此定义...

获取或设置一个布尔值,该值指示如果服务器安装了证书,SQL Server 是否对客户端和服务器之间发送的所有数据使用 SSL 加密。

...TrustServerCertificate 属性在 .NET Framework 中保存此定义...

获取或设置一个值,该值指示在绕过证书链验证信任时是否将加密通道。

所以我会说这是最安全的方法。您可以确保 .NET Framework 将正确构建连接字符串并且您可以获得一组很好的定义,这些定义围绕这些属性对基于其定义的证书的含义。


现在,由于您也连接到 Oracle,因此最好的方法是继续建立 OLEDB 连接,因为您别无选择。但是两个连接都是IDbConnection,所以你只有一个建立正确连接并返回IDbConnection的工厂。

这意味着您可以获得两全其美,SqlConnection 对象的性能和易用性以及IDbConnection 的抽象,因此您的代码不必更改。

【讨论】:

  • 非常感谢这个 BigM。我要试试这个。但我真的不知道那个 oledb 连接字符串属性“信任服务器证书”有什么问题。它根本不起作用。
  • @Praveen,老实说我也不知道,但这就是为什么我认为这确实是最安全和最简单的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2016-03-15
  • 2011-05-18
  • 2019-11-01
相关资源
最近更新 更多