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.00x300(768) = TLS 1.10xc00(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
'c#' 카테고리의 다른 글
| 기본 연결이 닫혔습니다. 보내기에서 예기치 않은 오류가 발생했습니다. (0) | 2023.11.07 |
|---|---|
| <string xmlns="http://tempuri.org/"> </string> 없애기 (0) | 2022.06.15 |
| System.Web.Helpers.Json..cctor() 메서드가 System.Web.Helpers.Json.CreateSerializer() 메서드에 액세스하지 못했습니다 (0) | 2015.09.07 |
| zedgraph (0) | 2013.04.27 |
| EventType clr20r3 P9 system.io.fileloadexception (0) | 2013.04.27 |
댓글