System.Data.SqlClient から Microsoft.Data.SqlClient に移行すると
「信頼されていない機関によって証明書チェーンが発行されました。」エラーが発生する現象と対処法を紹介します。
SqlConnectionを利用してデータベースに接続するアプリケーションのライブラリを
System.Data.SqlClient から Microsoft.Data.SqlClient に移行すると以下のエラーが発生する場合があります。
英語では以下のメッセージです。
データベースサーバーとの接続を暗号化した場合、デフォルトの設定では信頼されている証明機関の証明書が必要となりました。
Microsoftから解決策が紹介されています。(参照)
;Encrypt=False
を接続文字列に追加する
;Trust Server Certificate=true
を接続文字列に追加する
バージョン18.xのMicrosoft OLE DB Driver for SQL Server をインストールして利用する方法です。
接続文字列に、次の設定を追記します。
;Encrypt=False
文字列の書式は以下になります。
Data Source=(ホスト名またはIPアドレス);Initial Catalog=(接続データベース名);User ID=(ユーザーID);Password=(パスワード);Encrypt=False
Data Source=192.168.0.100;Initial Catalog=iPentecSandBox;User ID=penta;Password=hopstep;Encrypt=False
接続文字列に、次の設定を追記します。
;Trust Server Certificate=true
文字列の書式は以下になります。
Data Source=(ホスト名またはIPアドレス);Initial Catalog=(接続データベース名);User ID=(ユーザーID);Password=(パスワード);Trust Server Certificate=true
Data Source=192.168.0.100;Initial Catalog=iPentecSandBox;User ID=penta;Password=hopstep;Trust Server Certificate=true
SqlConnectionStringBuilderを利用している場合には、Encryptプロパティをfalseに設定する方法が利用できます。
//DB Connectionの作成
public static SqlConnection CreateMSSQLConnection(string DBHost, string DBName, string DBUser, string DBPass, int DBTimeout)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = DBHost;
builder.UserID = DBUser;
builder.Password = DBPass;
builder.InitialCatalog = DBName;
builder.ConnectTimeout = DBTimeout;
builder.Encrypt = false; //この行を追加
SqlConnection connection = new SqlConnection(builder.ConnectionString);
return connection;
}
SqlConnectionStringBuilderを利用している場合には、TrustServerCertificateプロパティをtrueに設定する方法が利用できます。
//DB Connectionの作成
public static SqlConnection CreateMSSQLConnection(string DBHost, string DBName, string DBUser, string DBPass, int DBTimeout)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = DBHost;
builder.UserID = DBUser;
builder.Password = DBPass;
builder.InitialCatalog = DBName;
builder.ConnectTimeout = DBTimeout;
builder.TrustServerCertificate = true; //この行を追加
SqlConnection connection = new SqlConnection(builder.ConnectionString);
return connection;
}
AppサーバーとDBサーバーが外部のネットワークやインターネットを経由する場合は
暗号化を有効化する方式(Encrypt=true;TrustServerCertificate = true;)が良いと考えられます。特にインターネットを経由する場合は証明書を導入する方式が良いです。
AppサーバーとDBサーバーがデータセンター内で接続されている場合でも、ゼロトラストの設計であれば、暗号化を有効化する方式が良さそうです。
アプリケーションサーバーとデータベースサーバーのネットワークがデータセンター内にあり、
データセンター内は信頼できる設計、または、AppサーバーとDBサーバーが別ネットワークで物理的に直結している場合では、
暗号化しない方式(Encrypt=false;)のほうが性能が良いです。