Istniejące połączenie zostało wymuszone przez hosta zdalnego (błąd systemu operacyjnego 10054)
Dotyczy: SQL Server
Uwaga 16.
Przed rozpoczęciem rozwiązywania problemów zalecamy sprawdzenie wymagań wstępnych i listy kontrolnej.
Ten artykuł zawiera szczegółowe informacje o różnych scenariuszach i zawiera 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 SSL, błąd: 0 — istniejące połączenie zostało wymuszone przez hosta zdalnego).
-
Połączenie z serwerem zostało pomyślnie ustanowione, ale wystąpił błąd podczas uzgadniania przed logowaniem. (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 widzisz błąd?
Secure Channel, znany również jako Schannel, jest dostawcą pomocy technicznej zabezpieczeń (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 Transport Layer Security (TLS). Ten protokół jest standardem branżowym, który jest przeznaczony do ochrony prywatności informacji przekazywanych za pośrednictwem Internetu.
Protokół uzgadniania TLS jest odpowiedzialny za wymianę kluczy niezbędną do ustanowienia lub wznowienia bezpiecznych sesji między dwiema aplikacjami komunikującymi się za pośrednictwem protokołu TCP. W fazie przed logowaniem procesu połączenia program SQL Server i aplikacje klienckie używają protokołu TLS do ustanowienia bezpiecznego kanału do przesyłania poświadczeń.
W następujących scenariuszach szczegółowo występują błędy występujące, gdy nie można ukończyć uzgadniania:
Scenariusz 1. Między klientem a serwerem nie istnieją zgodne 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 wszędzie tam, gdzie to możliwe. W związku z tym administratorzy systemu mogą wypychać aktualizacje za pośrednictwem zasad grupy lub innych mechanizmów, aby wyłączyć te niezabezpieczone wersje protokołu TLS na różnych komputerach w danym ś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 Framework lub wersji programu SQL Server, która nie obsługuje protokołu TLS 1.2. Ten 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 nawiązania połączenia jest wymagany odpowiedni protokół.
Rozwiązanie
Aby rozwiązać ten problem, skorzystaj z jednej z poniższych metod:
- Uaktualnij program SQL Server lub dostawców klienta do wersji obsługującej protokół TLS 1.2. Aby uzyskać więcej informacji, zobacz Obsługa protokołu TLS 1.2 dla programu Microsoft SQL Server.
- Poproś administratorów systemu o tymczasowe włączenie protokołu TLS 1.0 lub TLS 1.1 zarówno na komputerze klienckim, jak i na komputerach serwera, wykonując jedną z następujących czynności:
- Użyj karty Zestawy szyfrowania w narzędziu kryptograficznym usług IIS, aby zweryfikować i wprowadzić zmiany w bieżących ustawieniach protokołu TLS.
- Uruchom Edytor rejestru i znajdź klucze rejestru specyficzne dla kanału Schannel:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL
. Aby uzyskać więcej informacji, zobacz Przepływ pracy uaktualniania protokołu TLS 1.2 i Błędy protokołu SSL po uaktualnieniu do wersji TLS 1.2.
Scenariusz 2. Dopasowywanie protokołów TLS na kliencie i serwerze, ale bez pasujących zestawów szyfrowania TLS
Ten scenariusz występuje, gdy użytkownik lub administrator ograniczył określone algorytmy na kliencie lub serwerze w celu zapewnienia dodatkowych zabezpieczeń.
Wersje protokołu TLS klienta i serwera, zestawy szyfrowania można łatwo zbadać w pakietach Hello i Hello klienta w śladzie sieciowym. Pakiet Hello klienta anonsuje wszystkie pakiety szyfrowania klienta, podczas gdy pakiet Hello serwera określa jeden z nich. Jeśli nie ma pasujących pakietów, serwer zamyka połączenie zamiast odpowiadać na pakiet Hello serwera.
Rozwiązanie
Aby sprawdzić problem, wykonaj następujące kroki:
Jeśli śledzenie sieci nie jest dostępne, sprawdź wartość funkcji pod tym kluczem 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
Użyj karty Zestawy szyfrowania w narzędziu kryptograficznym usług IIS, aby sprawdzić, czy istnieją jakieś pasujące algorytmy. Jeśli nie znaleziono pasujących algorytmów, 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 Transport Layer Security (TLS) może zakończyć się niepowodzeniem lub przekroczeniem limitu czasu podczas nawiązywania połączenia lub próby wznowienia.
Scenariusz 3. Szyfrowanie TLS_DHE może być włączone
Ten problem występuje, gdy klient lub serwer jest hostowany w systemie Windows 2012, 2016 i nowszych wersjach. Pomimo obu wersji systemu operacyjnego posiadających ten sam szyfr (TLS_DHE*), system Windows 2012 i 2016+ obsługują klucze kryptograficzne w ramach protokołu TLS inaczej. Może to spowodować błędy komunikacji.
Rozwiązanie
Aby rozwiązać ten problem, usuń wszystkie szyfry rozpoczynające się od ciągu "TLS_DHE*" z zasad lokalnych. Aby uzyskać więcej informacji o błędach występujących podczas próby nawiązania połączenia z programem SQL Server w systemie Windows przez aplikacje, zobacz Środowisko aplikacji wymuszające zamknięcie błędów połączenia TLS podczas nawiązywania połączenia z serwerami SQL w systemie Windows.
Scenariusz 4. Program SQL Server używa certyfikatu podpisanego przez algorytm słabego skrótu, takiego jak MD5, SHA224 lub SHA512
Program 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 program SQL Server znajdzie certyfikat obsługujący funkcję uwierzytelniania serwera w magazynie certyfikatów, używa certyfikatu. Program SQL Server używa tego certyfikatu, nawet jeśli nie został on ręcznie aprowizowany. 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 powodują wcześniej wymieniony błąd.
Uwaga 16.
Ten problem nie ma wpływu na certyfikaty z podpisem własnym.
Rozwiązanie
Aby rozwiązać problem, wykonaj następujące kroki:
- W menedżerze konfiguracji programu SQL Server rozwiń węzeł Konfiguracja sieci programu SQL Server w okienku Konsola .
- Wybierz pozycję Protokoły dla <nazwy> wystąpienia.
- Wybierz kartę Certyfikat i wykonaj odpowiedni krok:
- Jeśli certyfikat jest wyświetlany, wybierz pozycję Widok , 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 programu SQL Server, aby uzyskać 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
- Aby usunąć uwierzytelnianie serwera, wykonaj następujące czynności:
- Wybierz kolejno pozycje Start>Uruchom i wpisz ciąg MMC. (MMC znany również jako Microsoft Management Console).
- W programie MMC otwórz certyfikaty i wybierz pozycję Konto komputera na ekranie przystawki Certyfikaty .
- Rozwiń węzeł Osobiste>Certyfikaty.
- Zlokalizuj certyfikat używany przez program SQL Server pod jego nazwą lub sprawdzając wartość odcisku palca różnych certyfikatów w magazynie certyfikatów i otwórz okienko Właściwości .
- Na karcie Ogólne wybierz pozycję Włącz tylko następujące cele i usuń zaznaczenie opcji Uwierzytelnianie serwera.
- Uruchom ponownie usługę SQL Server.
Scenariusz 5. Klient i serwer korzystają z zestawu szyfrowania TLS_DHE na potrzeby uzgadniania protokołu TLS, ale jeden z systemów nie ma wiodących poprawek zerowych dla TLS_DHE zainstalowanych
Aby uzyskać więcej informacji na temat tego scenariusza, zobacz Aplikacje napotykały błędy wymuszania zamknięcia połączenia TLS podczas nawiązywania połączenia z programem SQL Server w systemie Windows.
Uwaga 16.
Jeśli ten artykuł nie rozwiązał problemu, możesz sprawdzić, czy typowe problemy z łącznością mogą pomóc artykuły .
Scenariusz 6. Limit czasu uzgadniania TCP (SYN Fail, TCP Rejection) z powodu niedoboru procesów roboczych IOCP
W systemach z dużymi obciążeniami w programie SQL Server 2017 i starszych może wystąpić sporadyczne błędy 10054 spowodowane przez błędy uzgadniania protokołu TCP trzykierunkowe, co prowadzi do odrzucenia protokołu TCP. Główną przyczyną tego problemu może być opóźnienie przetwarzania TCPAcceptEx
żądań. To opóźnienie może być spowodowane niedoborem pracowników odbiornika IOCP (port zakończenia wejścia/wyjścia) 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łączeń, 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ą limitów czasu uzgadniania TCP trzykierunkowego i dodatkowych limitów czasu logowania. Program SQL Server 2019 zawiera kilka ulepszeń wydajności w tym obszarze. Jednym z istotnych ulepszeń jest implementacja dedykowanej puli dyspozytora logowania. Pozwala to zoptymalizować alokację zasobów dla zadań związanych z logowaniem, co zmniejsza występowanie przekroczenia limitu czasu i poprawia ogólną wydajność systemu.
Inne scenariusze, w których połączenia TLS kończą się niepowodzeniem
Jeśli napotkany komunikat o błędzie nie odpowiada żadnym z poprzednich scenariuszy, zapoznaj się z następującymi dodatkowymi scenariuszami:
- Lokalny program SQL Server nie może nawiązać połączenia z serwerem połączonym, gdy jest używane szyfrowanie RSA
- Błąd połączenia 10054 może wystąpić po uaktualnieniu programu SQL Server
- Sporadyczne błędy połączeń występują podczas dodawania węzła do środowiska Always On w programie SQL Server
- Sporadyczne błędy połączeń występują podczas korzystania z narzędzia SQLCMD
- Błąd SSL_PE_NO_CIPHER występuje w punkcie końcowym 5022 w programie SQL Server
- Błąd łączności 0x80004005 występuje z powodu błędów usług SSIS agenta serwera SQL
- Błąd "Klient nie może nawiązać połączenia" po zaimplementowaniu zasad pakietu szyfrowania na maszynie z programem SQL Server
- Błąd "Połączenie z połączonym serwerem nie powiodło się" po zaktualizowaniu systemu Windows Server
- Nie można uruchomić agenta programu SQL Server podczas nawiązywania połączenia z programem SQL Server
- Błąd podczas nawiązywania połączenia wyższego z niższą wersją programu SQL Server przy użyciu funkcji programu SQL Server Linked Server
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.