SSL bị vô hiệu hóa trên SQL Server, hiện kết nối không thành công


7

Tôi có một khách hàng đang lo lắng về lỗ hổng SSL mới nhất POODLE. Họ có một tiện ích ( IIS Crypto 1.4 ) vô hiệu hóa SSL 2.0-3.0 trên các máy chủ mà họ chạy trên đó. Họ đã vô hiệu hóa SSL trên cả máy chủ mà dịch vụ của tôi đang chạy và Máy chủ SQL từ xa. Chuỗi kết nối SQL khá chuẩn:

Server=myServerIPAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;

Khi dịch vụ của tôi khởi động, nó cố thực hiện truy vấn Linq to SQL và gặp lỗi:

Một kết nối đã được thiết lập thành công với máy chủ, nhưng sau đó đã xảy ra lỗi trong quá trình bắt tay trước khi đăng nhập. (nhà cung cấp: Nhà cung cấp TCP, lỗi: 0 - Một kết nối hiện có đã bị đóng bởi máy chủ từ xa.)

Nếu họ kích hoạt lại SSL trên Máy chủ SQL, nó hoạt động tốt. Chương trình của tôi là một Dịch vụ Windows được xây dựng trên .NET 3.5. Nguyên nhân của lỗi này là gì và tôi có thể điều chỉnh ở đâu để dịch vụ của tôi sẽ chạy?

chỉnh sửa: bên dưới là stacktrace được chương trình của tôi nhổ ra khi nó cố tải

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) 

Bạn đã thử kết nối từ máy chủ này sang máy chủ khác chưa? Nó có thể là một vấn đề tường lửa? Bạn đã thử những gì?
JustinDoesWork

Thông báo lỗi này có được ghi lại trong nhật ký lỗi ở phía SQL Server không? Nếu vậy, nó là trạng thái 16? Có bất kỳ lỗi hữu ích ngay trước hoặc ngay sau đó? Nhà cung cấp nào bạn đang sử dụng, OLEDB? Bạn đã thử những người khác như SQL Native Client chưa?
Aaron Bertrand

@JustinDoesWork Từ lỗi, tôi thu thập kết nối của nó, nhưng một cái gì đó ở phía máy chủ SQL đang đóng kết nối
Mike_G

1
Mike, Bạn đã kiểm tra nếu SQL Server Service đang chạy chưa? Tôi đã vô hiệu hóa SSLv3 và nhận được cùng một lỗi bạn gặp phải khi SQL Server Service đang cố chạy. Vì một số lý do, có vẻ như SSL là bắt buộc để dịch vụ này đăng nhập. Tại thời điểm này tôi bị mắc kẹt và không thể làm cho công việc này. Bạn đã tìm ra một giải pháp chưa?

1
TLS 1.0, 1.1 và 1.2 được bật, chúng tôi cũng gặp lỗi tương tự.
Mike_G

Câu trả lời:


4

Bạn đang sử dụng Xác thực SQL. Điều này yêu cầu sử dụng chứng chỉ SSL tự ký do SQL Server cung cấp để máy khách có thể mã hóa các gói xác thực của quá trình kết nối.

Tôi đoán, không có SSL phá vỡ quá trình này.


2

Chúng tôi đã có một vấn đề tương tự, ngoại trừ chúng tôi đã vô hiệu hóa tất cả trừ TLS 1.2. Thật không may, một số khách hàng của chúng tôi không thể kết nối. Những khách hàng này đang sử dụng trình điều khiển Máy khách gốc SQL Server cũ hơn không có giao thức mã hóa tương thích. Chúng tôi đã nâng cấp trình điều khiển máy khách (từ MS) và nó đã giải quyết vấn đề. Trong trường hợp này, nhật ký máy chủ sẽ có thông báo lỗi tốt hơn (ví dụ: Nhật ký máy chủ SQL hoặc nhật ký hệ thống Windows, một lần nữa trên máy chủ). Ví dụ: "Yêu cầu kết nối SSL 3.0 được nhận từ ứng dụng khách từ xa, nhưng không có bộ mật mã nào được ứng dụng khách hỗ trợ được máy chủ hỗ trợ. Yêu cầu kết nối TLS không thành công."

support.microsoft.com: Hỗ trợ TLS 1.2 cho Microsoft SQL Server

SQL Server xây dựng theo mã phiên bản

Một cái gì đó tương tự đã xảy ra trước đây khi chúng tôi nâng cấp một máy chủ nhưng chúng tôi có một số PC cũ xung quanh có những hạn chế về hệ điều hành. Xem câu trả lời câu hỏi khác từ năm ngoái .

Để làm rõ, chúng tôi đã nâng cấp phiên bản phụ trình điều khiển (ví dụ: 11.0.2100.60 lên 11.0.7001). Rõ ràng phiên bản SQL Server của bạn cần có đủ gói / phiên bản dịch vụ để xử lý các giao thức mã hóa được yêu cầu. Lưu ý rằng trình điều khiển máy khách độc lập là (chỉ?) Có sẵn như là một phần của "gói tính năng" Microsoft SQL Server có liên quan (ví dụ: Gói tính năng SP4 của Microsoft SQL Server 2012 ).


1

Chỉ là một phỏng đoán hoang dã, nhưng cái nhìn đầu tiên của tôi sẽ là Trình quản lý cấu hình máy chủ Sql để xem cờ "Mã hóa lực lượng" có được bật trong trường hợp đó không. Chỉ vì họ đã "vô hiệu hóa SSL", điều đó không có nghĩa là họ đã nói với SQL Server rằng các kết nối không phải SSL là ổn.

Nếu không, hãy xem các ý kiến ​​trên về nhật ký lỗi SQL Server.


Tôi cũng nghĩ như vậy, nhưng vì khách hàng tuyên bố các ứng dụng khác có thể tạo kết nối mà không gặp sự cố nên tôi chưa kiểm tra điều đó.
Mike_G
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.