20202020. 12. 25. 09:52

SQL Server 를 Windows Server 2016 운영체제로 마이그레이션 한 이후에 아래와 같은 오류가 발생한다구요? 

Native Client 를 사용할 때, 
Error: Microsoft SQL Server Native Client 11.0 : TCP Provider:
 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다.

Jdbc 드라이버를 사용할 때, 
The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "SQL 서버에서 응답을 반환하지 않았습니다.연결이 닫혔습니다.".


어떤 부분을 먼저 체크해 보면 좋을까요? 로그만 보면 명확하지 않지만 TCP 혹은 SSL 연결 오류가 의심되므로 반드시 Network Monitor 를 사용하여 packet 로그를 수집해 볼 필요가 있습니다.

제가 가진 테스트 환경에서 클라이언트에서는 오직 SSL 3.0 통신만 가능하도록 설정되어 있는 Legacy 운영체제가 설치되어 있고 해당 머신에서 SQLCMD 명령으로 SQL Server 2016 에 접속을 시도하였을 때, 아래 오류와 함께 로그인이 실패하였습니다.

Error: Microsoft SQL Server Native Client 11.0 : TCP Provider: 
 현재 연결은 원격 호스트에 의해 강제로 끊겼습니다. 

Netmon 으로 패킷 로그를 수집했고 아래와 같이 클라이언트에서는 SSL handshake 를 위해 Client Hello 를 보내지만 기대했던 Sever Hello 응답을 받지 못하고 서버측에서 연결을 종료하는 것을 볼 수 있습니다. 


이 때, 클라이언트에서 SSL 통신을 위해 사용한 프로토콜은 SSL 3.0 이지만 왜 Windows Server 2016 에서는 이 응답을 주지 않은 것일까요?  


아래 문서를 통해 확인할 수 있듯이 Windows 10 (1607) 버전과 Windows Server 2016 버전에서는 기본값으로 SSL 3.0 이 비활성화 되어 있습니다. 
Transport Layer Security (TLS) registry settings | Microsoft Docs


테스트를 위해 잠깐 SSL 3.0 을 활성화 해 보고 싶다면 아래와 같이 레지스트리키를 추가해서 검증해 볼 수 있습니다.

REG add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client" /v Enabled /t REG_DWORD /d 0xffffffff /f
REG add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client" /v DisabledByDefault /t REG_DWORD  /d 0x00000000 /f
REG add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server" /v Enabled /t REG_DWORD /d 0xffffffff /f
REG add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server" /v DisabledByDefault /t REG_DWORD /d 0x00000000 /f

 

근본적인 문제 해결을 위해서는 클라이언트 수준에서 더 이상 SSL 3.0 프로토콜을 사용할 것이 아니라 TLS 프로토콜을 사용할 수 있도록 어플리케이션과 운영체제 설정을 조정할 필요가 있습니다. 

Posted by Lai Go