본문 바로가기
c#

구 닷넷프레임워크 버전에서 TLS1.2 사용 절차

by ┌(  ̄∇ ̄)┘™ 2024. 12. 7.
728x90
728x90

오래된 .NET Framework(4.0 이하)로 만든 애플리케이션이 외부 API를 호출할 때, 상대 서버가 TLS 1.2 이상만 허용하도록 바뀌면 통신이 갑자기 실패하기 시작합니다. 코드를 고치려 해도 이런 컴파일 오류를 만나게 되죠.

System.Net.SecurityProtocolType.Tls12 definition not found

원인: .NET Framework 4.0 이하의 SecurityProtocolType 열거형에는 Tls12 값 자체가 정의되어 있지 않고, 기본 프로토콜도 SSL3/TLS 1.0이기 때문입니다. 해결은 두 단계 — OS에서 TLS 1.2를 활성화하고, 코드에서 열거형 값을 숫자로 직접 지정합니다.

1. 서버(OS)에서 TLS 1.2 활성화

레지스트리에서 SCHANNEL의 TLS 1.2를 Client·Server 양쪽 모두 활성화합니다. (구버전 Windows Server 2008 R2/2012에서 특히 필요하며, 적용 후 재부팅해야 반영됩니다)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server

각 키에 아래 값 생성:
Enabled (DWORD): 1
DisabledByDefault (DWORD): 0

2. C# 코드에서 프로토콜 지정

Tls12 열거형이 없으므로 해당하는 숫자 값을 직접 캐스팅합니다.

System.Net.ServicePointManager.SecurityProtocol =
    (System.Net.SecurityProtocolType)(0xc0 | 0x300 | 0xc00);

숫자의 의미는 다음과 같습니다 — 열거형에 이름만 없을 뿐 런타임은 값을 처리할 수 있기 때문에 이 방식이 동작합니다.

  • 0xc0 (192) = TLS 1.0
  • 0x300 (768) = TLS 1.1
  • 0xc00 (3072) = TLS 1.2

3. 코드 수정 없이 해결하는 방법 (권장 대안)

.NET Framework 4.5 이상이 설치된 서버라면, 코드를 건드리지 않고 레지스트리로 강력한 암호화를 기본값으로 만들 수 있습니다. 배포된 바이너리를 다시 빌드할 수 없는 상황에서 특히 유용합니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319
  SchUseStrongCrypto (DWORD): 1

; 32비트 앱이 64비트 OS에서 돌 때는 Wow6432Node 쪽도 함께:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319
  SchUseStrongCrypto (DWORD): 1

정리

  • .NET 4.0 이하: OS TLS 1.2 활성화 + 코드에서 (SecurityProtocolType)3072 캐스팅
  • .NET 4.5~4.6: Tls12 열거형 사용 가능 — SecurityProtocolType.Tls12 명시 또는 SchUseStrongCrypto 레지스트리
  • .NET 4.7 이상: 기본적으로 OS 설정을 따르므로 별도 지정 없이 동작 (가장 근본적인 해결은 프레임워크 업그레이드)
728x90

댓글