最新のSSL脆弱性 POODLEを心配しているお客様がいます。彼らはそれを実行するサーバーでSSL 2.0-3.0を無効にするユーティリティ( IIS Crypto 1.4 )を持っています。サービスが実行されているサーバーとリモートSQL Serverの両方でSSLが無効になっています。 SQL接続文字列はかなり標準的です。
Server=myServerIPAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
サービスが開始すると、Linq to SQLクエリを実行しようとしてエラーが発生します。
サーバーとの接続は正常に確立されましたが、ログイン前のハンドシェイク中にエラーが発生しました。 (プロバイダー:TCPプロバイダー、エラー:0-既存の接続がリモートホストによって強制的に閉じられました。)
SQL ServerでSSLを再度有効にすると、正常に機能します。私のプログラムは.NET 3.5上に構築されたWindowsサービスです。このエラーの原因は何ですか?また、サービスが実行されるようにどこで調整できますか?
編集:以下は、プログラムがロードしようとしたときにプログラムによって吐き出されるスタックトレースです
System.Data.SqlClient.SqlException: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote Host.)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean& marsCapable)
at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String Host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArrayTSource(IEnumerable`1 source)
SQL認証を使用しています。これには、クライアントが接続プロセスの認証パケットを暗号化できるように、SQL Serverによって提供される自己署名SSL証明書を使用する必要があります。
私の推測では、SSLはこのプロセスを壊しません。
ちょっと大雑把な推測ですが、最初にSql Server Configuration Managerを見て、そのインスタンスに対して「Force Encryption」フラグがオンになっているかどうかを確認します。彼らが「SSLを無効にした」からといって、SSL以外の接続に問題がないことをSQL Serverに通知したわけではありません。
それ以外の場合は、SQL Serverエラーログに関する上記のコメントを参照してください。
TLS 1.2を除くすべてを無効にした以外は、同様の問題がありました。残念ながら、一部のクライアントは接続できませんでした。これらのクライアントは、互換性のある暗号化プロトコルを持たない古いSQL Server Native Clientドライバーを使用していました。クライアントドライバー(MSから)をアップグレードし、問題を解決しました。この場合、サーバーログには、より適切なエラーメッセージ(SQL ServerログやWindowsシステムログ、サーバー上など)が含まれるはずです。例えば。 「SSL 3.0接続要求がリモートクライアントアプリケーションから受信されましたが、クライアントアプリケーションでサポートされている暗号スイートがサーバーでサポートされていません。TLS接続要求は失敗しました。」
support.Microsoft.com:Microsoft SQL ServerのTLS 1.2サポート
以前にサーバーをアップグレードしたときに同様のことが起こりましたが、周りに古いPCがあり、OSの制限がありました。 昨年の他の質問の回答 を参照してください。
明確にするために、ドライバーのサブバージョンをアップグレードしました(例:11.0.2100.60から11.0.7001)。明らかに、SQL Serverインスタンスは、必要な暗号化プロトコルを処理するのに十分なサービスパック/バージョンである必要があります。スタンドアロンクライアントドライバーは(のみ?)関連するMicrosoft SQL Serverの「機能パック」の一部として利用できることに注意してください(例: Microsoft SQL Server 2012 SP4 Feature Pack )。