다음을 통해 공유


Windows에서 SQL Server를 연결할 때 애플리케이션이 강제로 닫힌 TLS 연결 오류 발생

이 문서는 애플리케이션이 SQL Server에 대한 연결을 열려고 할 때 발생하는 문제를 해결하는 데 도움이 됩니다.

적용 대상: Windows Server 2019, Windows Server 2016
원래 KB 번호: 4557473

증상

애플리케이션이 SQL Server에 대한 연결을 열려고 하면 다음 오류 메시지 중 하나가 표시됩니다.

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

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

서버에서 SChannel 로깅을 사용하도록 설정한 경우 문제가 발생할 때 이벤트 ID 36888(심각한 경고가 생성됨)을 받게 됩니다.

참고 항목

  • 사용 중인 공급자 또는 드라이버에 따라 오류 메시지가 약간 다를 수 있습니다.
  • 이 문제는 Windows Server 2012 R2에서 실행되는 애플리케이션이 Windows Server 2019에서 실행되는 SQL Server에 연결하려고 할 때도 발생합니다.
  • 다른 클라이언트 서버 애플리케이션도 비슷한 문제가 발생할 수 있습니다.

원인

Windows 10 버전 1511 이상 버전의 Windows(Windows Server 2016 또는 Windows 10, 버전 1607)는 2월 25일 이후 업데이트가 설치된 업데이트가 설치되어 있으며, 선행 제로 업데이트를 포함합니다. 한편 이전에 릴리스된 모든 Windows 버전에는 선행 0 업데이트가 포함되지 않습니다.

TLS 클라이언트와 서버는 다른 결과를 얻는 것과 똑같은 방식으로 키를 계산해야 합니다. TLS 클라이언트 및 TLS 서버에서 선행 0을 다르게 계산하면 TLS 연결이 임의로 실패합니다.

Diffie-Hellman 키 교환 그룹에 선행 0이 있는 경우 패치되지 않은 컴퓨터는 패딩된 0을 계산하지 않음으로써 mac을 잘못 계산할 수 있습니다. 이 문제는 일반적으로 Windows 기반이 아닌 암호화 구현과 상호 작용할 때 표시되며 간헐적인 협상 실패를 일으킬 수 있습니다.

오류 메시지는 TLS_DHE 암호 그룹을 사용하여 클라이언트와 서버 간에 보안 TLS 핸드셰이크를 협상할 때 반환됩니다. 영향을 받는 암호 그룹 중 하나의 사용은 "Server Hello" 패킷에서 식별할 수 있습니다. 자세한 내용은 "추가 정보" 섹션의 네트워크 조각을 참조하세요.

해결

이 문제를 해결하려면 연결에 관련된 클라이언트와 서버가 모두 TLS_DHE 대한 앞에 0개 수정 사항이 설치된 Windows를 실행하고 있는지 확인합니다. TLS_DHE 사양에 대한 규격을 향상시키므로 업데이트를 설치하는 것이 좋습니다.

다음은 설치된 업데이트에 따라 운영 체제 버전을 나열합니다.

TLS_DHE 대한 선행 0 픽스가 포함된 Windows 버전

  • Windows Server 2016 버전 1607
    • KB 4537806: 2020년 2월 25일-KB4537806(OS 빌드 14393.3542)
    • KB 4540670: 2020년 3월 10일-KB4540670(OS 빌드 14393.3564)
    • 각 OS 버전에 대한 KB4537806 대체하고 KB4540670 업데이트
  • Windows Server 2019 RTM 이상 버전.
  • Windows 10 버전 1511 이상 버전의 Windows 10(릴리스 기록 참조)

TLS_DHE 대한 선행 0 수정 사항이 포함되지 않은 Windows 버전

  • 패치 KB 4537806 및 KB 4540670 적용되지 않은 Windows Server 2016 버전 1607 서버
  • Windows 10 버전 1507
  • Windows 8.1
  • Windows 7
  • Windows Server 2012 R2 및 이전 버전의 Windows Server

해결 방법

Windows를 업데이트할 수 없는 경우 해결 방법으로 두 가지 방법 중 하나를 사용하여 TLS_DHE 암호화를 사용하지 않도록 설정할 수 있습니다.

그룹 정책 사용

TLS_DHE_* 암호는 그룹 정책을 사용하여 사용하지 않도록 설정할 수 있습니다. "SSL 암호 그룹 순서" 그룹 정책을 구성하려면 Schannel Cipher Suites의 우선 순위를 지정하는 것을 참조하세요.

정책 URL: 컴퓨터 구성 -> 관리 템플릿 -> 네트워크 -> SSL 구성 설정
정책 설정: SSL 암호 그룹 순서 설정입니다.

PowerShell 스크립트 사용

foreach ($CipherSuite in $(Get-TlsCipherSuite).Name)
{
    if ( $CipherSuite.substring(0,7) -eq "TLS_DHE" )
    {
       "Disabling cipher suite: " + $CipherSuite
       Disable-TlsCipherSuite -Name $CipherSuite
    }
    else
    {
        "Existing enabled cipher suite will remain enabled: " + $CipherSuite
    }
}

자세한 정보

연결 설정 중에 이 문제가 발생했음을 확인할 수 있습니다. 문제가 발생하면 서버의 네트워크 추적에서 다음 시퀀스를 볼 수 있습니다.

1103479 <DateTime> 382.4104867 <Application IP> <Server IP> TCP:Flags=CE....S., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174047, Ack=0, Win=8192 ( Negotiating scale factor 0x8 ) = 8192  
1103486 <DateTime> 382.4105589 <Server IP> <Application IP> TCP: [Bad CheckSum]Flags=...A..S., SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267349053, Ack=829174048, Win=65535 ( Negotiated scale factor 0x8 ) = 16776960  
1103493 <DateTime> 382.4113628 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174048, Ack=267349054, Win=513 (scale factor 0x8) = 131328  
1103515 <DateTime> 382.4117349 <Application IP> <Server IP> TDS:Prelogin, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=62702, DstPort=1433, PayloadLen=88, Seq=829174048 - 829174136, Ack=267349054, Win=131328  
1103525 <DateTime> 382.4118186 <Server IP> <Application IP> TDS:Response, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 1, Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=48, Seq=267349054 - 267349102, Ack=829174136, Win=2102272  
1103547 <DateTime> 382.4128101 <Application IP> <Server IP> TLS:TLS Rec Layer-1 HandShake: Client Hello.  
1103584 <DateTime> 382.4151314 <Server IP> <Application IP> TLS:TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.  
1103595 <DateTime> 382.4161185 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174322, Ack=267351024, Win=513 (scale factor 0x8) = 131328  
1103676 <DateTime> 382.4782629 <Application IP> <Server IP> TLS:TLS Rec Layer-1 HandShake: Client Key Exchange.; TLS Rec Layer-2 Cipher Change Spec; TLS Rec Layer-3 HandShake: Encrypted Handshake Message.  
1103692 <DateTime> 382.4901904 <Server IP> <Application IP> TCP:[Segment Lost] [Bad CheckSum]Flags=...A...F, SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267351024, Ack=829174648, Win=8210 (scale factor 0x8) = 2101760  
1103696 <DateTime> 382.4918048 <Application IP> <Server IP> TCP:Flags=...A...., SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174648, Ack=267351025, Win=513 (scale factor 0x8) = 131328  
1103718 <DateTime> 382.4931068 <Application IP> <Server IP> TCP:Flags=...A...F, SrcPort=62702, DstPort=1433, PayloadLen=0, Seq=829174648, Ack=267351025, Win=513 (scale factor 0x8) = 131328  
1103723 <DateTime> 382.4931475 <Server IP> <Application IP> TCP: [Bad CheckSum]Flags=...A...., SrcPort=1433, DstPort=62702, PayloadLen=0, Seq=267351025, Ack=829174649, Win=8210 (scale factor 0x8) = 2101760  

서버 Hello 패킷을 검사하여 사용 중인 암호 그룹을 확인합니다.

Frame: Number = 1103584, Captured Frame Length = 2093, MediaType = NetEvent  
+NetEvent:  
+MicrosoftWindowsNDISPacketCapture: Packet Fragment (1976 (0x7B8) bytes)  
+Ethernet: Etype = Internet IP (IPv4),DestinationAddress:[00-00-0C-9F-F4-5C],SourceAddress:[00-1D-D8-B8-3A-7B]  
+Ipv4: Src = <Server IP>, Dest = <Application IP>, Next Protocol = TCP, Packet ID = 16076, Total IP Length = 0  
+Tcp: [Bad CheckSum]Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=1938, Seq=267349102 - 267351040, Ack=829174322, Win=8211 (scale factor 0x8) = 2102016  
+Tds: Prelogin, Version = 7.300000(No version information available, using the default version), SPID = 0, PacketID = 0, Flags=...AP..., SrcPort=1433, DstPort=62702, PayloadLen=1938, Seq=267349102 - 267351040, Ack=829174322, Win=2102016  
TLSSSLData: Transport Layer Security (TLS) Payload Data  
-TLS: TLS Rec Layer-1 HandShake: Server Hello. Certificate. Server Key Exchange. Server Hello Done.  
-TlsRecordLayer: TLS Rec Layer-1 HandShake:  
ContentType: HandShake:  
+Version: TLS 1.2  
Length: 1909 (0x775)  
-SSLHandshake: SSL HandShake Server Hello Done(0x0E)  
HandShakeType: ServerHello(0x02)  
Length: 81 (0x51)  
-ServerHello: 0x1  
+Version: TLS 1.2  
+RandomBytes:  
SessionIDLength: 32 (0x20)  
SessionID: Binary Large Object (32 Bytes)  
TLSCipherSuite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 { 0x00, 0x9F }  
CompressionMethods: 0 (0x0)  
ExtensionsLength: 9 (0x9)  
+ServerHelloExtension: Unknown Extension Type  
+ServerHelloExtension: Renegotiation Info(0xFF01)  
HandShakeType: Certificate(0x0B)  
Length: 778 (0x30A)  
+Cert: 0x1  
HandShakeType: Server Key Exchange(0x0C)  
Length: 1034 (0x40A)  
ServerKeyExchange: Binary Large Object (1034 Bytes)  
HandShakeType: Server Hello Done(0x0E)  
Length: 0 (0x0)  
+Tds: Prelogin, Version = 7.300000(No version information available, using the default version), Reassembled Packet

참조

자세한 내용은 다음 문서를 참조하세요.