我的应用程序需要与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安全错误。
如果没有与安全性相关的两个属性,它可以正常工作。
我需要更改什么才能让它发挥作用?
答案 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
的抽象,以便您的代码不必更改。