Istniejące połączenie zostało wymuszone przez hosta zdalnego (błąd systemu operacyjnego 10054)

Dotyczy: SQL Server

Uwaga

Przed rozpoczęciem rozwiązywania problemów zalecamy sprawdzenie wymagań wstępnych i listy kontrolnej.

W tym artykule opisano różne scenariusze i przedstawiono rozwiązania następujących błędów:

  • Połączenie z serwerem zostało pomyślnie nawiązane, ale wystąpił błąd podczas procesu logowania. (dostawca: dostawca protokołu SSL, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).

  • Połączenie z serwerem zostało pomyślnie nawiązane, ale wystąpił błąd podczas uzgadniania przed zalogowaniem. (dostawca: dostawca TCP, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).

Błąd systemu operacyjnego 10054 jest zgłaszany w warstwie gniazd systemu Windows. Aby uzyskać więcej informacji, zobacz Kody błędów gniazd systemu Windows: WSAECONNRESET 10054.

Kiedy zostanie wyświetlony błąd?

Bezpieczny kanał, znany również jako Schannel, jest dostawcą pomocy technicznej ( SSP). Zawiera zestaw protokołów zabezpieczeń, które zapewniają uwierzytelnianie tożsamości i bezpieczną komunikację prywatną za pośrednictwem szyfrowania. Jedną z funkcji dostawcy SSP Schannel jest zaimplementowanie różnych wersji protokołu TLS (Transport Layer Security). Ten protokół jest standardem branżowym, który ma na celu ochronę prywatności informacji przekazywanych przez Internet.

Protokół uzgadniania protokołu TLS jest odpowiedzialny za wymianę kluczy niezbędną do ustanowienia lub wznowienia bezpiecznych sesji między dwiema aplikacjami komunikuj się za pośrednictwem protokołu TCP. W fazie przed logowaniem procesu połączenia SQL Server i aplikacje klienckie używają protokołu TLS do ustanowienia bezpiecznego kanału do przesyłania poświadczeń.

W poniższych scenariuszach szczegółowo opisano błędy występujące, gdy nie można ukończyć uzgadniania:

Scenariusz 1. Między klientem a serwerem nie istnieją żadne pasujące protokoły TLS

Protokół Secure Socket Layer (SSL) i wersje protokołu TLS wcześniejsze niż TLS 1.2 mają kilka znanych luk w zabezpieczeniach. Zachęcamy do uaktualnienia do protokołu TLS 1.2 i wyłączenia wcześniejszych wersji tam, gdzie to możliwe. W związku z tym administratorzy systemu mogą wypychać aktualizacje za pomocą zasad grupy lub innych mechanizmów, aby wyłączyć te niezabezpieczone wersje protokołu TLS na różnych komputerach w środowisku.

Błędy łączności występują, gdy aplikacja używa starszej wersji sterownika Open Database Connectivity (ODBC), dostawcy OLE DB, składników platformy .NET lub wersji SQL Server, która nie obsługuje protokołu TLS 1.2. Problem występuje, ponieważ serwer i klient nie mogą znaleźć zgodnego protokołu (takiego jak TLS 1.0 lub TLS 1.1). Do ukończenia uzgadniania protokołu TLS wymaganego do kontynuowania połączenia wymagany jest zgodny protokół.

Rozwiązanie

Aby rozwiązać ten problem, zastosuj jedną z następujących metod:

Scenariusz 2. Dopasowywanie protokołów TLS na kliencie i serwerze, ale brak pasujących zestawów szyfrowania TLS

Ten scenariusz występuje, gdy ty lub administrator ograniczyli określone algorytmy na kliencie lub serwerze w celu dodatkowego zabezpieczenia.

Wersje protokołu TLS klienta i serwera, zestawy szyfrowania można łatwo zbadać w pakietach Hello klienta i serwera Hello w śledzenia sieci. Pakiet Hello klienta anonsuje wszystkie pakiety szyfrowania klienta, podczas gdy pakiet Hello serwera określa jeden z nich. Jeśli nie ma pasujących zestawów, serwer zamyka połączenie zamiast odpowiadać na pakiet Hello serwera.

Rozwiązanie

Aby sprawdzić problem, wykonaj następujące kroki:

  1. Jeśli ślad sieci jest niedostępny, sprawdź wartość funkcji w ramach tego klucza rejestru: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002

    Użyj następującego polecenia programu PowerShell, aby znaleźć funkcje protokołu TLS.

    Get-ItemPropertyValue  -Path HKLM:\System\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\ -Name Functions
    
  2. Użyj karty Zestawy szyfrów w narzędziu kryptograficznym usług IIS , aby sprawdzić, czy istnieją jakiekolwiek pasujące algorytmy. Jeśli nie zostaną znalezione żadne pasujące algorytmy, skontaktuj się z pomoc techniczna firmy Microsoft.

Aby uzyskać więcej informacji, zobacz TLS 1.2 Upgrade Workflow and Transport Layer Security (TLS) connections might fail or timeout when connecting or attempting a resumption (Przepływ pracy uaktualniania protokołu TLS i połączenia TLS ) mogą zakończyć się niepowodzeniem lub przekroczeniem limitu czasu podczas nawiązywania połączenia lub próby wznowienia.

Scenariusz 3: SQL Server używa certyfikatu podpisanego przez algorytm słabego skrótu, takiego jak MD5, SHA224 lub SHA512

SQL Server zawsze szyfruje pakiety sieciowe powiązane z logowaniem. W tym celu używa ręcznie aprowizowanego certyfikatu lub certyfikatu z podpisem własnym. Jeśli SQL Server znajdzie certyfikat, który obsługuje funkcję uwierzytelniania serwera w magazynie certyfikatów, używa certyfikatu. SQL Server używa tego certyfikatu, nawet jeśli nie został on aprowizowany ręcznie. Jeśli te certyfikaty używają algorytmu słabego skrótu (algorytmu odcisku palca), takiego jak MD5, SHA224 lub SHA512, nie będą działać z protokołem TLS 1.2 i spowodować wspomniany wcześniej błąd.

Uwaga

Ten problem nie ma wpływu na certyfikaty z podpisem własnym.

Rozwiązanie

Aby rozwiązać ten problem, wykonaj poniższe kroki:

  1. W SQL Server Configuration Manager rozwiń węzeł SQL Server Konfiguracja sieci w okienku Konsola.
  2. Wybierz pozycję Protokoły jako <nazwę> wystąpienia.
  3. Wybierz kartę Certyfikat i wykonaj odpowiedni krok:
    • Jeśli certyfikat jest wyświetlany, wybierz pozycję Wyświetl , aby sprawdzić algorytm odcisku palca, aby potwierdzić, czy używa algorytmu słabego skrótu. Następnie wybierz pozycję Wyczyść i przejdź do kroku 4.
    • Jeśli certyfikat nie jest wyświetlany, przejrzyj dziennik błędów SQL Server wpis podobny do poniższego i zanotuj wartość skrótu lub odcisku palca:
      2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "B3029394BB92AA8EDA0B8E37BAD09345B4992E3D"] was successfully loaded for encryption
  4. Aby usunąć uwierzytelnianie serwera, wykonaj następujące kroki:
    1. Wybierz pozycję Rozpocznij>uruchamianie i wpisz MMC. (PROGRAM MMC znany również jako konsola zarządzania firmy Microsoft).
    2. W programie MMC otwórz certyfikaty i wybierz pozycję Konto komputera na ekranie przystawki Certyfikaty .
    3. Rozwiń węzeł Certyfikaty osobiste>.
    4. Znajdź certyfikat, którego SQL Server używa jego nazwa lub sprawdzając wartość odcisku palca różnych certyfikatów w magazynie certyfikatów i otwórz jego okienko Właściwości.
    5. Na karcie Ogólne wybierz pozycję Włącz tylko następujące cele i usuń zaznaczenie pozycji Uwierzytelnianie serwera.
  5. Uruchom ponownie usługę SQL Server.

Scenariusz 4. Klient i serwer używają zestawu szyfrowania TLS_DHE na potrzeby uzgadniania protokołu TLS, ale jeden z systemów nie ma wiodących żadnych poprawek dla TLS_DHE zainstalowanych

Aby uzyskać więcej informacji na temat tego scenariusza, zobacz Błędy wymuszonego zamknięcia połączenia TLS w aplikacjach podczas nawiązywania połączenia z programem SQL Server w systemie Windows.

Uwaga

Jeśli ten artykuł nie rozwiązał problemu, możesz sprawdzić, czy artykuły dotyczące typowych problemów z łącznością mogą pomóc.

Scenariusz 5. Limit czasu uzgadniania protokołu TCP Three-Way (niepowodzenie SYN, odrzucenie protokołu TCP) z powodu braku pracowników IOCP

W systemach o dużych obciążeniach w SQL Server 2017 r. i starszych może wystąpić sporadyczny błąd 10054 spowodowany przez trzystopnie działające błędy uzgadniania TCP, co prowadzi do odrzucenia protokołu TCP. Główną przyczyną tego problemu może być opóźnienie w przetwarzaniu żądań TCPAcceptEx. To opóźnienie może być spowodowane brakiem procesów roboczych odbiornika IOCP (wejściowego/wyjściowego portu uzupełniania) odpowiedzialnych za zarządzanie akceptacją połączeń przychodzących. Niewystarczająca liczba procesów roboczych IOCP i zajęta obsługa innych żądań prowadzi do opóźnionego przetwarzania żądań połączenia, co ostatecznie skutkuje niepowodzeniami uzgadniania i odrzuceniem protokołu TCP. Możesz również obserwować przekroczenia limitu czasu logowania podczas uzgadniania protokołu SSL (jeśli istnieje) lub przetwarzania żądań logowania, które obejmują sprawdzanie uwierzytelniania.

Rozwiązanie

Niedobór procesów roboczych IOCP i zasobów procesu roboczego SOS przydzielonych do obsługi operacji uwierzytelniania i szyfrowania jest główną przyczyną trójstopniowych limitów czasu uzgadniania TCP i dodatkowych limitów czasu logowania. SQL Server 2019 r. zawiera kilka ulepszeń wydajności w tym obszarze. Jednym z istotnych ulepszeń jest implementacja dedykowanej puli dyspozytorów logowania. Optymalizuje to alokację zasobów pod kątem zadań związanych z logowaniem, co zmniejsza liczbę wystąpień przekroczenia limitu czasu i poprawia ogólną wydajność systemu.

Zobacz też

Zastrzeżenie dotyczące innych firm

Produkty innych firm omówione w tym artykule są wytwarzane przez producentów niezależnych od firmy Microsoft. Firma Microsoft nie udziela żadnych gwarancji, dorozumianych ani żadnego innego rodzaju, w odniesieniu do wydajności lub niezawodności tych produktów.