Ich habe einen Kunden, der sich Sorgen über die neueste SSL-Sicherheitsanfälligkeit POODLE macht. Sie haben ein Dienstprogramm ( IIS Crypto 1.4 ), das SSL 2.0-3.0 auf den Servern deaktiviert, auf denen sie es ausführen. Sie haben SSL sowohl auf dem Server, auf dem mein Dienst ausgeführt wird, als auch auf dem Remote-SQL-Server deaktiviert. Die SQL-Verbindungszeichenfolge ist ziemlich Standard:
Server=myServerIPAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
Wenn mein Dienst gestartet wird, versucht er, eine Linq to SQL-Abfrage durchzuführen, und erhält den Fehler:
Eine Verbindung zum Server wurde erfolgreich hergestellt, aber während des Handshakes vor der Anmeldung ist ein Fehler aufgetreten. (Anbieter: TCP-Anbieter, Fehler: 0 - Eine vorhandene Verbindung wurde vom Remote-Host zwangsweise geschlossen.)
Wenn sie SSL auf dem SQL Server wieder aktivieren, funktioniert es einwandfrei. Mein Programm ist ein Windows-Dienst, der auf .NET 3.5 basiert. Was ist die Ursache für diesen Fehler und wo kann ich Anpassungen vornehmen, damit mein Dienst ausgeführt wird?
edit: unten ist der Stacktrace, den mein Programm beim Laden ausspuckt
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)
quelle
Antworten:
Sie verwenden die SQL-Authentifizierung. Dies erfordert die Verwendung eines selbstsignierten SSL-Zertifikats, das vom SQL Server bereitgestellt wird, damit der Client die Authentifizierungspakete des Verbindungsprozesses verschlüsseln kann.
Ich vermute, kein SSL unterbricht diesen Prozess.
quelle
Wir hatten ein ähnliches Problem, außer dass wir alle außer TLS 1.2 deaktiviert haben. Leider konnten einige unserer Kunden keine Verbindung herstellen. Diese Clients verwendeten einen älteren SQL Server Native Client-Treiber, der kein kompatibles Verschlüsselungsprotokoll hatte. Wir haben den Client-Treiber (von MS) aktualisiert und das Problem behoben. In diesem Fall sollte das Serverprotokoll eine bessere Fehlermeldung enthalten (z. B. SQL Server-Protokoll oder Windows-Systemprotokoll, erneut auf dem Server). Beispiel: "Eine SSL 3.0-Verbindungsanforderung wurde von einer Remoteclientanwendung empfangen, aber keine der von der Clientanwendung unterstützten Cipher Suites wird vom Server unterstützt. Die TLS-Verbindungsanforderung ist fehlgeschlagen."
support.microsoft.com: TLS 1.2-Unterstützung für Microsoft SQL Server
SQL Server wird nach Versionscode erstellt
Ähnliches geschah zuvor, als wir einen Server aktualisierten, aber wir hatten einige alte PCs mit Betriebssystembeschränkungen. Siehe andere Frage Antwort aus dem letzten Jahr .
Zur Verdeutlichung haben wir die Treiber-Unterversion aktualisiert (z. B. 11.0.2100.60 auf 11.0.7001). Offensichtlich muss Ihre SQL Server-Instanz über ein ausreichendes Service Pack / eine ausreichende Version verfügen, um die erforderlichen Verschlüsselungsprotokolle verarbeiten zu können. Beachten Sie, dass der eigenständige Client-Treiber (nur?) Als Teil des entsprechenden Microsoft SQL Server "Feature Packs" (z. B. Microsoft SQL Server 2012 SP4 Feature Pack ) verfügbar ist .
quelle
Nur eine wilde Vermutung, aber mein erster Blick wäre auf SQL Server Configuration Manager, um zu sehen, ob das Flag "Encryption erzwingen" für diese Instanz aktiviert ist. Nur weil sie "SSL deaktiviert" haben, heißt das nicht, dass sie SQL Server mitgeteilt haben, dass Nicht-SSL-Verbindungen in Ordnung sind.
Andernfalls lesen Sie die obigen Kommentare zum SQL Server-Fehlerprotokoll.
quelle