[C#] C#에서 TLS 1.2를 사용하도록 변경하기

728x90
반응형

 

.

 

 


 

들어가며

.NET Framework 4.8 개발 환경에서, 기본적인 TLS 전송에 대한 프로토콜 버전이 1.0으로 전송된다는 얘기를 전해들었습니다. 이와 관련해서 서버에서는 1.2 를 지원하고 있어서 원활한 통신이 안되고 있다는 얘기에, 관련상황을 정리하였습니다. 

 

 

 

 

 

 

TLS란?

TLS(전송 계층 보안) 프로토콜은 인터넷을 통해 전달되는 개인 정보를 보호하는 데 도움이 되도록 설계된 업계 표준입니다. 

TLS는 국제 표준 기구인 IETF(Internet Engineering Task Force)에 의해 제안되었으며 프로토콜의 첫 번째 버전은 1999년에 발표되었습니다. 가장 최신 버전은 2018년에 발표된 TLS 1.3입니다.

TLS는 Netscape가 개발한 SSL(Secure Sockets Layer)이라고 불리는 이전의 암호화 프로토콜에서 발전한 것입니다. 
TLS 버전 1.0은 SSL 버전 3.1로서 개발을 시작했지만 Netscape와 더 이상 연관이 없음을 명시하기 위해 발표 전에 프로토콜의 이름이 변경되었습니다. 
이러한 역사 때문에 용어 TLS와 SSL은 가끔 서로 바꿔서 사용됩니다.

 

 

 

 

 

 

.NET Framework TLS 1.2에 대한 지원

 

앱이 TLS 1.2를 협상하려면 OS 및 .NET Framework 버전이 모두 TLS 1.2를 지원해야 합니다.

https://learn.microsoft.com/ko-kr/dotnet/framework/network-programming/tls#support-for-tls-12

 

  • TLS 1.2의 경우 앱에서 .NET Framework 4.7 이상 버전을 대상으로 하고, WCF 앱에서 .NET Framework 4.7.1 이상 버전을 대상으로 합니다.
  • TLS 1.3의 경우 .NET Framework 4.8 이상을 대상으로 합니다.

 

 

 

 

 

현 상황

 

위에 표를 보게 되면 Windows Server 2012 상위 버전은 기본적으로 사용하도록 설정된다고 하였으나,

실질적으로 테스트 했을때는 그러지 않았습니다. 

동일한 현상에 대해서 테스한 코드가 있어서 참조하였습니다. 

 

string url = "https://www.google.com";
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
 
var resp = req.GetResponse();
var outStream = resp.GetResponseStream();
string output = "";
using (StreamReader rdr = new StreamReader(outStream))
{
    output = rdr.ReadToEnd();
}

http://csharp.tips/tip/article/802-using-tls-1-2-in-csharp

 

저희 코드의 개발환경은 2016 Server에 .NET Framework 4.8 이였습니다. 

 

 

 

 

 

 

 

TLS 1.2 활성화

 

위에 처럼 진행했을 경우, TLS 가 1.0 버전으로 통신이 되어, 아래처럼 코드를 수정해서 테스트 했습니다. 

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
 
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
...
...

 

http://csharp.tips/tip/article/802-using-tls-1-2-in-csharp

(HttpWebRequest)WebRequest.Create(url) 이전에 

추가로 프로토콜을 명시해 줌으로써, TLS 1.2 로 통신하는 모습을 확인 할 수 있었습니다. 

동일한 현상을 겪었으나, 이미지 캡쳐본이 사라져서 타 blog 의 이미지를 첨부하였습니다. 

 

 

 

 

 

MSDN

MSDN 에서는 .NET Framework 애플리케이션이 안전하게 유지되도록 하려면, TLS 버전을 하드 코드 하면 안된다고 합니다. .NET Framework 애플리케이션에서는 OS가 지원하는 TLS 버전을 사용해야 한다고 하지만, 

기본적으로 사용하도록 설정된다고 하는데, 실질적으로는 코드상에서 프로토콜을 명시해줬어야 했습니다. 

추가적으로 설정이 필요한것인지는 모르겠으나, regist 파일까지 수정해가면서 하고싶진 않아서, 코드상에서 처리하였습니다. 

 

 

 

 

 

 

 

참조

http://csharp.tips/tip/article/802-using-tls-1-2-in-csharp

https://learn.microsoft.com/ko-kr/dotnet/framework/network-programming/tls#support-for-tls-12

 

 

 

 

END


 

 

 

 

 

 

 

728x90