SSL unter SQL Server deaktiviert, jetzt schlägt die Verbindung fehl

7

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) 
Mike_G
quelle
Haben Sie versucht, eine Verbindung von einem Server zum anderen herzustellen? Könnte es sich um ein Firewall-Problem handeln? Was hast du versucht?
JustinDoesWork
Wird diese Fehlermeldung im Fehlerprotokoll auf der SQL Server-Seite aufgezeichnet? Wenn ja, ist es Zustand 16? Gibt es unmittelbar vor oder unmittelbar danach hilfreiche Fehler? Welchen Anbieter verwenden Sie, OLEDB? Haben Sie andere wie SQL Native Client ausprobiert?
Aaron Bertrand
@ JustinDoesWork Aufgrund des Fehlers erfahre ich die Verbindung, aber etwas auf der SQL Server-Seite schließt die Verbindung
Mike_G
1
Mike, hast du überprüft, ob der SQL Server-Dienst ausgeführt wird? Ich habe SSLv3 deaktiviert und erhalte den gleichen Fehler, den Sie erhalten, wenn der SQL Server-Dienst versucht, ausgeführt zu werden. Aus irgendeinem Grund scheint SSL erforderlich zu sein, damit sich dieser Dienst anmeldet. An diesem Punkt stecke ich fest und kann diese Arbeit nicht machen. Haben Sie schon eine Lösung gefunden?
1
Wenn TLS 1.0, 1.1 und 1.2 aktiviert sind, wird der gleiche Fehler angezeigt.
Mike_G

Antworten:

4

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.

mrdenny
quelle
2

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 .

Freier Text
quelle
1

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.

dpw
quelle
Ich dachte das gleiche, aber da der Kunde behauptete, andere Apps könnten die Verbindung ohne Probleme herstellen, habe ich das noch nicht überprüft.
Mike_G