TLS1.2 지원하는 서버와의 HTTPS 통신 구현

SSL3.0, TLS1.0 및 TLS1.1의 취약점이 발견되었으며 TLS1.2로 마이그레이션하는 많은 웹 사이트가 있습니다. TLS1.2의 이행에 수반해, SSL3.0, TLS1.0, TLS1.1의 입구도 남겨두면 문제 없지만, 폐지된 경우, 지금까지 외부로부터 HTTPS 통신으로 API 제휴하는 프로그램도 재기록할 필요가 있습니다.

기존 TLS1.0만 대응의 경우
/// <summary>
/// Get Response From TLS Support Server
/// </summary>
private void GetDataByHttps()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}

TLS1.2로 이행한 후, TLS1.0, TLS1.1이 폐지된 경우, 아래와 같은 예가 출력된다
System.Net.WebException: 연결이 끊어졌습니다. 전송할 때 예기치 않은 오류가 발생했습니다. .
---> System.IO.IOException: 원격 당사자가 전송 스트림을 종료했기 때문에 인증에 실패했습니다.
위치 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
···

해결하려면 .NET4.5를 사용하고 Tls1.2의 SecurityProtocol을 사용합니다.
.NET 4.0 supports up to TLS 1.0 while .NET 4.5 supports up to TLS 1.2
/// <summary>
/// Get Response From TLS or Above Support Server
/// </summary>
private void GetDataByHttpsTls10Above()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}

.NET4.0 이하로 대응하고 싶은 경우, 스스로 포트를 정의

/// <summary>
/// Get Response From TLS or Above Support Server with .Net 3.5 or 4.0
/// </summary>
private void GetDataByHttpsTls10Above()
{
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
      try
      {
            var client = new HttpClient();
            var res = await client.GetAsync("https://対象サイトFQDN/");
            res.Dump();
      }
      catch (Exception e)
      {
            logger.Write("Exception:" + e.ToString());
      }
}

대상 서버가 TLS를 어디까지 지원하는지 이하 분석 서비스를 이용하면 알기 쉽다.
htps //w w.ぁbs. 이 m/sl로 st/아나 ly 꼭. HTML? d=오후우세. 야호오. 이. jp
※d= 다음에는 FQDN을 붙입니다.
yahoo 예제, TLS1.2도 지원되었지만 기존 SSL, TLS1.0, TLS1.1도 그대로 유지

좋은 웹페이지 즐겨찾기