Unity Package Manager 의 HTTPS 인증서 검증 실패 원인 및 진단 방법

방화벽 규칙보다 SSL 신뢰 체인 검증 실패를 우선 확인하십시오

Unity 개발 환경에서 Package Manager 가 패키지 목록을 로드하지 못하는 경우, 대부분 Windows Defender 방화벽이나 네트워크 포트 차단 문제를 먼저 의심합니다. 그러나 실제 통신 패킷을 분석해 보면 포트 개방 여부보다는 TLS 핸드셰이크 단계에서 연결이 거부되는 경우가 많습니다.

Unity Package Manager 는 HTTPS 프로토콜을 사용하지만, 운영체제의 기본 인증서 저장소 (Windows Certificate Store 또는 macOS Keychain) 를 참조하지 않습니다. 대신 엔진 내부에 하드코딩된 별도의 인증서 신뢰 체인을 사용하며, 서버 인증서의 전체 경로를 강제적으로 검증합니다. 따라서 기업 네트워크에서 Zscaler, Netskope 와 같은 중간자 프록시나 자체 서명 CA 를 사용하는 경우, Unity 는 인증서 체인의 무결성을 확인하지 못해 연결을 종료합니다. 브라우저처럼 경고 메시지를 표시하지 않고 silently fail 하는 것이 특징입니다.

이 현상은 Unity 2020.3 LTS 부터 2022.3 버전 구간에서 주로 발생하며, 보안 정책이 엄격한 금융 또는 공공 기관 개발 환경에서 빈번하게 관찰됩니다. 스크립트 작성이나 씬 실행에는 지장이 없으나, com.unity.textmeshpro 와 같은 패키지를 설치하거나 URP 를 업데이트할 때 Package Manager 창이 로딩 상태로 멈추게 됩니다. 근본적인 원인은 Unity 편집기 프로세스가 네트워크 요청을 보낼 때 .NET Core 보다 엄격한 SSL/TLS 인증서 경로 검증을 수행하기 때문입니다.

Unity PackageManager 의 HTTPS 요청 체인 구조 분석

문제 해결을 위해서는 Unity Package Manager 의 요청 방식을 이해해야 합니다. 일반 브라우저와 달리 시스템 네트워크 스택을 그대로 사용하지 않습니다. Unity Editor 는 내부적으로 특정 버전의 libcurl 를 정적 링크하여 사용하며, Windows 의 SChannel 이나 macOS 의 SecureTransport 를 우회하여 OpenSSL 호환 계층을 통해 TLS 핸드셰이크를 수행합니다. 이로 인해 다음과 같은 제약 사항이 발생합니다.

  • 시스템 인증서 저장소 (certmgr.msc 등) 를 읽지 않습니다.
  • 브라우저의 프록시 설정 (PAC 파일 등) 을 상속하지 않습니다.
  • HTTP_PROXY 또는 HTTPS_PROXY 환경 변수에 자동으로 반응하지 않습니다.
  • 인증서 체인 무결성 검증이 매우 엄격하여, 중간 인증서 추적 실패 시 OCSP/CRL 检查에서도 연결을 중단합니다.

이 동작을 검증하기 위해 편집기 실행 시 상세 로그를 활성화할 수 있습니다. 아래 스크립트는 Unity 2022.3 버전을 기준으로 HTTP 통신 로그를 생성하는 예시입니다.

$unityVersion = "2022.3.15f1"
$editorPath = "C:\Program Files\Unity\Hub\Editor\$unityVersion\Editor\Unity.exe"
$projectPath = "D:\Projects\NetworkDebug"
$logFile = "D:\Logs\unity_network_trace.log"

$env:UNITY_LOG_LEVEL = "3"
$env:UNITY_ENABLE_HTTP_LOGGING = "1"

Start-Process -FilePath $editorPath -ArgumentList "-projectPath `"$projectPath`" -logFile `"$logFile`""

Package Manager 창에서 목록을 새로고침 한 후 생성된 로그 파일을 확인하면 TLS 핸드셰이크 과정에 대한 상세 정보를 볼 수 있습니다.

[Unity] [Package Manager] Request GET https://packages.unity.com/manifests/2022.3.15f1.json
[Unity] [libcurl]   Trying 54.230.159.88:443...
[Unity] [libcurl] Connected to packages.unity.com (54.230.159.88) port 443 (#0)
[Unity] [libcurl] ALPN, offering http/1.1
[Unity] [libcurl] Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
[Unity] [libcurl] TLSv1.2 (OUT), TLS handshake, Client hello (1):
[Unity] [libcurl] TLSv1.2 (IN), TLS handshake, Server hello (2):
[Unity] [libcurl] TLSv1.2 (IN), TLS handshake, Certificate (11):
[Unity] [libcurl] TLSv1.2 (IN), TLS handshake, Server key exchange (12):
[Unity] [libcurl] TLSv1.2 (IN), TLS handshake, Server finished (14):
[Unity] [libcurl] TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
[Unity] [libcurl] TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
[Unity] [libcurl] TLSv1.2 (OUT), TLS handshake, Finished (20):

로그에서 핸드셰이크 과정이 완료되지 않고 중단된다면, 이는 네트워크 방화벽 규칙 문제가 아니라 Unity 내부의 인증서 검증 로직이 특정 루트 CA 를 신뢰하지 못하기 때문입니다.

태그: Unity PackageManager SSL TLS libcurl

8월 7일 03:39에 게시됨