SSL连接到数据库

时间:2012-10-19 12:15:30

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

我的应用程序需要与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安全错误。

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

我需要更改什么才能让它发挥作用?

1 个答案:

答案 0 :(得分:7)

使用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的抽象,以便您的代码不必更改。