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 Server 2016 또는 Windows 10 포함하여 Windows 버전 1511 이상 버전인 Windows 10 2월 25일 이후 업데이트에 릴리스된 업데이트가 설치된 버전 1607에는 선행 0 업데이트가 포함되어 있습니다. 한편 이전에 릴리스된 모든 Windows 버전에는 선행 0 업데이트가 포함되어 있지 않습니다.
TLS 클라이언트와 서버는 다른 결과를 얻는 것과 똑같은 방식으로 키를 계산해야 합니다. TLS 클라이언트 및 TLS 서버에 의해 선행 0이 다르게 계산되면 TLS 연결이 임의로 실패합니다.
Diffie-Hellman 키 교환 그룹에 선행 0이 있는 경우 패치되지 않은 컴퓨터는 패딩된 0을 고려하지 않음으로써 mac을 잘못 계산할 수 있습니다. 이 문제는 일반적으로 비 Windows 기반 암호화 구현과 상호 작용할 때 발생하며 일시적인 협상 실패를 일으킬 수 있습니다.
TLS_DHE 암호 그룹을 사용하여 클라이언트와 서버 간에 보안 TLS 핸드셰이크를 협상할 때 오류 메시지가 반환됩니다. 영향을 받는 암호 그룹 중 하나의 사용은 "Server Hello" 패킷에서 식별할 수 있습니다. 자세한 내용은 "추가 정보" 섹션의 네트워크 코드 조각을 참조하세요.
해결 방법
이 문제를 해결하려면 연결에 관련된 클라이언트와 서버가 모두 TLS_DHE 대한 고정이 없는 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 버전
- Windows Server 2016, 패치 KB 4537806 및 KB 4540670 적용되지 않은 버전 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
참조
자세한 내용은 다음 문서를 참조하세요.