기존 연결이 원격 호스트에 의해 강제로 닫혔습니다(OS 오류 10054)

적용 대상: SQL Server

요약

이 문서에서는 SQL Server 연결 오류 "기존 연결이 원격 호스트에 의해 강제로 닫혔습니다"가 발생하는 시나리오를 설명하고 해결을 제공합니다. 클라이언트와 서버가 TLS 프로토콜 버전(예: TLS 1.2 또는 TLS 1.3) 또는 암호화 도구 모음에 동의할 수 없기 때문에 이 오류는 클라이언트와 SQL Server 간의 실패한 TLS 핸드셰이크에 연결됩니다.

이 문서에서는 다음과 같은 오류 메시지를 다룹니다.

서버에 연결했지만 로그인하는 동안 오류가 발생했습니다. (공급자: SSL 공급자, 오류: 0 - 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.)

서버에 연결했지만 사전 로그인 핸드셰이크 중에 오류가 발생했습니다. (공급자: TCP 공급자, 오류: 0 - 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다.)

Windows 소켓 계층에서 운영 체제 오류 10054가 발생합니다. 자세한 내용은 Windows 소켓 오류 코드: WSAECONNRESET 10054를 참조하세요.

문제 해결을 시작하기 전에 필수 구성 요소를 확인하고 검사 목록을 진행합니다.

이 오류가 발생하는 경우

보안 채널(Schannel이라고도 함)은 SSP(보안 지원 공급자)입니다. 여기에는 암호화를 통해 ID 인증 및 보안 프라이빗 통신을 제공하는 보안 프로토콜 집합이 포함되어 있습니다. Schannel SSP의 한 가지 기능은 다른 버전의 TLS(전송 계층 보안) 프로토콜을 구현하는 것입니다. TLS는 인터넷을 통해 전달되는 정보의 개인 정보를 보호하도록 설계된 업계 표준입니다.

TLS 핸드셰이크 프로토콜은 TCP를 통해 통신하는 두 애플리케이션 간에 보안 세션을 설정하거나 다시 시작하는 데 필요한 키 교환을 담당합니다. 연결 프로세스의 사전 로그인 단계에서 SQL Server 및 클라이언트 애플리케이션은 TLS 프로토콜을 사용하여 자격 증명을 전송하기 위한 보안 채널을 설정합니다.

TLS 버전을 한눈에 보기

다음 표에서는 이 오류를 해결할 때 발생할 수 있는 TLS 버전을 비교합니다.

버전 Windows 현재 상태 SQL Server 권장 사항
TLS 1.0 / 1.1 Windows 11, Windows Server 2022 이상에서는 기본적으로 사용하지 않도록 설정됩니다. 안전하지 않은 것으로 간주됩니다. 사용하지 마세요. 클라이언트 및 서버를 TLS 1.2 이상으로 업그레이드합니다.
TLS 1.2 지원되는 모든 Windows 버전에서 기본적으로 사용하도록 설정됩니다. SQL Server 및 최신 클라이언트 드라이버에서 광범위하게 지원됩니다. 권장 기준선입니다.
TLS 1.3 버전 Windows 11 및 Windows Server 2022 이상에서 지원됩니다. 현재 클라이언트 드라이버(예: Microsoft ODBC Driver 18 및 Microsoft.Data.SqlClient 5.x) 사용 시 SQL Server 2022 이상에서 지원됩니다. 클라이언트와 서버가 모두 지원하는 위치를 사용합니다.

Windows에서 TLS 프로토콜의 현재 지원 상태는 TLS/SSL의 프로토콜(Schannel SSP)를 참조하세요.

사용자 환경에 적용되는 시나리오 식별

다음 섹션에서는 핸드셰이크가 실패할 수 있는 다양한 시나리오에 대해 설명합니다. 환경과 일치하는 항목을 잘 모르는 경우 다음 시작 지점을 사용하여 범위를 좁힐 수 있습니다.

  • 연결이 실패하는 동안 클라이언트와 서버에서 네트워크 추적을 캡처합니다. 그런 다음 클라이언트 HelloServer Hello 패킷을 검사하여 협상된 TLS 버전 및 암호 그룹을 확인합니다.
  • successfully loaded for encryption 항목에 대한 SQL Server 오류 로그를 확인하여 사용 중인 인증서를 확인합니다. 지문 알고리즘을 확인합니다.
  • Get-TlsCipherSuiteHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 아래의 레지스트리 키를 사용하여 클라이언트와 서버에서 활성화된 TLS 버전 및 암호화 제품군을 비교합니다.
  • 클라이언트 드라이버가 TLS 1.2 이상을 지원하는지 확인합니다. SQL Server Native Client와 같은 이전 드라이버는 더 이상 사용되지 않으며 권장되지 않습니다.

클라이언트와 서버 간에 일치하는 TLS 프로토콜 없음

SSL(Secure Sockets Layer) 및 TLS 1.2 이전 버전의 TLS에는 몇 가지 알려진 취약성이 있습니다. 최신 Windows 릴리스(Windows 11, Windows Server 2022 이상)에서는 TLS 1.0 및 TLS 1.1이 기본적으로 사용하지 않도록 설정됩니다. 또한 관리자는 이전 환경에서 이러한 이전 프로토콜을 사용하지 않도록 그룹 정책 또는 레지스트리 설정을 푸시하는 경우가 많습니다.

애플리케이션에서 이전 ODBC(Open Database Connectivity) 드라이버, OLE DB 공급자, .NET Framework 구성 요소 또는 TLS 1.2 이상을 지원하지 않는 SQL Server 버전을 사용하는 경우 연결 오류가 발생합니다. 서버와 클라이언트가 일치하는 프로토콜을 찾을 수 없기 때문에 문제가 발생합니다. TLS 핸드셰이크를 완료하려면 일치하는 프로토콜이 필요합니다.

클라이언트와 서버 간의 프로토콜 불일치 수정

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.

  • SQL Server 또는 클라이언트 공급자를 TLS 1.2(그리고 가능한 경우 TLS 1.3)를 지원하는 버전으로 업그레이드합니다. 자세한 내용은 Microsoft SQL Server에 대한 TLS 1.2 지원을 참조 하세요.
  • 단기적인 해결 방법으로 시스템 관리자에게 클라이언트와 서버 모두에서 TLS 1.0 또는 TLS 1.1을 일시적으로 사용하도록 요청합니다. 구성 요소를 업그레이드할 수 있을 때까지만 이 작업을 수행합니다. 다음 작업 중 하나를 사용합니다.

예: TLS 1.2에 대한 최소 클라이언트 드라이버 버전

기본적으로 TLS 1.2 이상을 지원하는 클라이언트 구성 요소를 사용합니다. 다음 구성 요소는 일반적인 안전 기준입니다.

  • Microsoft SQL Server용 ODBC 드라이버 17 또는 18.
  • Microsoft SQL Server용 OLE DB 드라이버 18 또는 19.
  • .NET Framework 4.6.2 이상 또는 지원되는 .NET 버전(.NET 6 이상)입니다.
  • Microsoft JDBC Driver 9.4 이상 버전.

레거시 SQL Server SNAC(Native Client) 및 Windows(SQLOLEDB)와 함께 제공되는 SQL Server OLE DB 공급자는 더 이상 사용되지 않습니다. 이전 목록의 구성 요소로 바꿉니다.

일치하는 TLS 프로토콜이지만 일치하는 암호화 도구 모음이 없음

이 시나리오는 사용자 또는 관리자가 추가 보안을 위해 클라이언트 또는 서버의 특정 알고리즘을 제한할 때 발생합니다.

네트워크 추적의 클라이언트 HelloServer Hello 패킷에서 클라이언트 및 서버 TLS 버전 및 암호 그룹을 검사할 수 있습니다. 클라이언트 Hello 패킷은 모든 클라이언트 암호 그룹을 보급하고 서버 Hello 패킷은 서버에서 선택한 암호를 반환합니다. 일치하는 제품군이 없으면 서버는 Server Hello 패킷을 보내는 대신 연결을 닫습니다.

암호화 도구 모음 불일치 수정

이 문제를 확인하려면 다음 단계를 수행합니다.

  1. 네트워크 추적을 사용할 수 없는 경우 다음 레지스트리 키 Functions아래의 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002 값을 확인합니다.

    다음 PowerShell 명령을 사용하여 구성된 TLS 암호 그룹을 나열합니다.

    Get-ItemPropertyValue -Path 'HKLM:\System\CurrentControlSet\Control\Cryptography\Configuration\Local\SSL\00010002\' -Name Functions
    

    Windows 10, Windows 11, Windows Server 2016 이상에서 Get-TlsCipherSuite 실행하여 사용 가능한 제품군을 더 읽기 쉬운 형식으로 나열할 수도 있습니다.

  2. IIS 암호화 도구의 암호 그룹 탭을 사용하여 일치하는 알고리즘이 있는지 확인합니다. 일치하는 알고리즘이 없으면 Microsoft 지원 문의하세요.

자세한 내용은 연결 또는 재개를 시도할 때 TLS 1.2 업그레이드 워크플로TLS(전송 계층 보안) 연결이 실패하거나 시간 초과가 발생할 수 있음을 참조하세요.

여러 Windows 버전에서 사용 설정된 TLS_DHE 암호화 제품군

이 문제는 클라이언트와 서버가 서로 다른 Windows 버전(예: Windows Server 2012 및 Windows Server 2016 이상)에서 실행되고 둘 다 TLS_DHE_* 암호 그룹을 보급할 때 발생할 수 있습니다. 이러한 Windows 버전은 TLS 내의 Diffie-Hellman 키 교환을 다르게 처리하므로 핸드셰이크가 실패할 수 있습니다.

TLS_DHE 암호 그룹 제거

이 문제를 해결하려면 로컬 정책에서 시작하는 TLS_DHE_ 모든 암호 그룹을 제거합니다. 애플리케이션이 Windows에서 SQL Server에 연결하려고 할 때 발생하는 오류에 대한 자세한 내용은 Windows에서 SQL Server에 연결할 때 애플리케이션에 강제로 닫힌 TLS 연결 오류가 발생함을(를) 참조하세요.

SQL Server 인증서는 약한 해시 알고리즘을 사용합니다.

SQL Server는 항상 로그인과 관련된 네트워크 패킷을 암호화합니다. 이를 위해 수동으로 프로비전된 인증서 또는 자체 서명된 인증서사용합니다. SQL Server 인증서 저장소에서 서버 인증 기능을 지원하는 인증서를 찾는 경우 수동으로 프로비전되지 않은 경우에도 해당 인증서를 사용합니다. 인증서가 MD5, SHA224 또는 SHA512와 같은 약한 해시(지문) 알고리즘을 사용하는 경우 TLS 1.2에서 작동하지 않으며 오류가 발생합니다.

참고

자체 서명된 인증서는 이 문제의 영향을 받지 않습니다.

인증서를 약한 해시 알고리즘으로 바꾸거나 다시 구성합니다.

이 문제를 해결하려면 다음 단계를 수행합니다.

  1. SQL Server 구성 관리자 콘솔 창에서 SQL Server 네트워크 구성확장합니다.

  2. 인스턴스 이름<에 대한 프로토콜을 >선택합니다.

  3. 인증서 탭을 선택한 다음 다음 작업 중 하나를 수행합니다.

    • 인증서가 나타나면 보기를 선택하여 지문 알고리즘을 확인하고 약한 해시 알고리즘을 사용하는지 확인합니다. 그런 다음 지우기를 선택하고 4단계로 이동합니다.

    • 인증서가 표시되지 않으면 다음과 같은 항목에 대한 SQL Server 오류 로그를 검토하고 해시 또는 지문 값을 확인합니다.

      2017-05-30 14:59:30.89 spid15s The certificate [Cert Hash(sha1) "AA11BB22CC33DD44EE55FF66AA77BB88CC99DD00"] was successfully loaded for encryption

  4. 인증서에서 서버 인증을 제거합니다.

    1. Start>Run를 선택하고 MMC(Microsoft Management Console)을 입력합니다.
    2. MMC에서 인증서 스냅인 추가하고 컴퓨터 계정을 선택합니다.
    3. 개인>인증서를 확장합니다.
    4. SQL Server 이름 또는 지문으로 사용하는 인증서를 찾고 Properties 창을 엽니다.
    5. 일반 탭에서 다음 용도만 사용하도록 선택하고 서버 인증을 지웁니다.
  5. SQL Server 서비스를 다시 시작합니다.

TLS_DHE 선행 0 수정이 설치되지 않음

이 시나리오는 클라이언트와 서버가 TLS 핸드셰이크에 대해 TLS_DHE_* 암호 그룹을 협상하지만 한쪽에는 Diffie-Hellman 키 교환에 대한 선행 0 수정을 추가하는 Windows 업데이트가 없는 경우에 발생합니다. 이 시나리오에 대한 자세한 내용은 Windows에서 SQL Server에 연결할 때 애플리케이션에서 TLS 연결이 강제로 종료되는 오류가 발생을(를) 참조하세요.

참고

이 문서에서 문제를 해결하지 못하는 경우 일반적인 연결 문제 문서가 도움이 될 수 있는지 확인합니다.

IOCP 작업자 부족으로 인한 TCP 3방향 핸드셰이크 시간 제한

2017년 이전 SQL Server 실행되는 워크로드가 많은 시스템에서는 TCP 3방향 핸드셰이크 오류로 인해 일시적인 10054 오류가 표시되어 TCP 거부가 발생할 수 있습니다. 근본 원인은 요청 처리 TCPAcceptEx 가 지연되는 경우가 많습니다. 지연은 들어오는 연결의 수용을 관리하는 IOCP(입력/출력 완료 포트) 수신기 작업자의 부족으로 인해 발생할 수 있습니다. IOCP 작업자가 너무 적거나 다른 요청을 처리하는 데 바쁜 경우 연결 요청이 늦게 처리되어 핸드셰이크 오류 및 TCP 거부가 발생합니다. 또한 SSL 핸드셰이크 중에 또는 인증 검사를 포함하는 로그인 요청을 처리하는 동안 로그인 시간 제한이 표시될 수 있습니다.

IOCP 작업자 부족 및 핸드셰이크 시간 제한 완화

인증 및 암호화 작업에 할당된 IOCP 작업자 및 SOS 작업자 리소스 부족이 이러한 TCP 3방향 핸드셰이크 시간 제한 및 로그인 시간 제한의 주요 원인입니다. SQL Server 2019 이상에는 이 영역의 몇 가지 성능 향상이 포함됩니다. 한 가지 주목할 만한 향상된 기능은 로그인 작업에 대한 리소스 할당을 최적화하는 전용 로그인 디스패처 풀입니다. 이렇게 변경하면 시간 제한이 줄어들고 전체 시스템 성능이 향상됩니다. 이 문제의 영향을 받는 경우 현재 지원되는 SQL Server 버전으로 업그레이드를 계획합니다.

기타 TLS 연결 실패 시나리오

발생한 오류 메시지가 이전 시나리오와 일치하지 않는 경우 다음 추가 시나리오를 참조하세요.

타사 정보 고지 사항

이 문서에 나와 있는 다른 공급업체 제품은 Microsoft와 무관한 회사에서 제조한 것입니다. Microsoft는 이들 제품의 성능이나 안정성에 관하여 명시적이든 묵시적이든 어떠한 보증도 하지 않습니다.