macOS Catalina 공증과 이것이 .NET 다운로드 및 프로젝트에 미치는 영향

macOS Catalina(버전10.15)부터, 2019년 6월 1일 이후에 빌드되어 개발자 ID로 배포되는 모든 소프트웨어는 공증을 받아야 합니다. 이 요구 사항은 .NET 런타임, .NET SDK, .NET으로 만든 소프트웨어에 적용됩니다. 이 문서에서는 .NET 및 macOS 공증과 관련하여 자주 발생하는 시나리오에 대해 설명합니다.

.NET 설치

.NET(런타임 및 SDK 둘 다)용 설치 프로그램은 2020년 2월 18일부터 공증되었습니다. 그 전에 릴리스된 버전은 공증되지 않았습니다. 공증되지 않은 버전의 .NET은 먼저 설치 프로그램을 다운로드한 다음, sudo installer 명령을 사용하여 수동으로 설치할 수 있습니다. 자세한 내용은 Download and manually install for macOS(macOS에 대해 다운로드 및 수동 설치)를 참조하세요.

네이티브 appHost

.NET SDK 7 이상 버전에서는 네이티브 Mach-O 실행 파일인 appHost가 앱에 대해 생성됩니다. 이 실행 파일은 일반적으로 프로젝트가 dotnet run 명령을 통해 컴파일, 게시 또는 실행될 때 .NET에 의해 호출됩니다. 앱의 appHost가 아닌 버전은 dotnet <app.dll> 명령으로 호출할 수 있는 dll 파일입니다.

로컬로 실행하면 SDK는 임시 서명을 사용하여 apphost에 서명합니다. 그러면 앱이 로컬로 실행될 수 있습니다. 앱을 배포할 때 Apple 지침에 따라 앱에 올바르게 서명해야 합니다.

apphost 없이 앱을 배포하고 사용자가 dotnet을 사용하여 앱을 실행할 수도 있습니다. appHost 생성을 끄려면 프로젝트 파일에 UseAppHost 부울 설정을 추가하고 이를 false로 설정합니다. 명령줄에서 -p:UseAppHost 매개 변수를 사용하여 실행하는 특정 dotnet 명령에 대해 appHost를 켜거나 끌 수도 있습니다.

  • 프로젝트 파일

    <PropertyGroup>
      <UseAppHost>false</UseAppHost>
    </PropertyGroup>
    
  • 명령줄 매개 변수

    dotnet run -p:UseAppHost=false
    

자체 포함을 게시할 때 appHost가 필요하며 사용하지 않도록 설정할 수 없습니다.

UseAppHost 설정에 대한 자세한 내용은 MSBuild properties for Microsoft.NET.Sdk(Microsoft.NET.Sdk의 MSBuild 속성)를 참조하세요.

appHost의 컨텍스트

프로젝트에서 appHost가 사용하도록 설정된 상태에서 dotnet run 명령을 사용하여 앱을 실행하면 앱이 기본 호스트(기본 호스트는 dotnet 명령임)가 아닌 appHost의 컨텍스트에서 호출됩니다. 프로젝트에서 appHost를 사용하지 않도록 설정된 경우 dotnet run 명령이 기본 호스트의 컨텍스트에서 앱을 실행합니다. appHost를 사용하지 않도록 설정된 경우에도 앱을 자체 포함 방식으로 게시하면 appHost 실행 파일이 생성되고, 사용자가 해당 실행 파일을 사용하여 앱을 실행할 수 있습니다. dotnet <filename.dll>을 사용하여 앱을 실행하면 기본 호스트인 공유 런타임으로 앱이 호출됩니다.

appHost를 사용하는 앱이 호출될 경우, 앱에서 액세스하는 인증서 파티션은 공증된 기본 호스트와 다릅니다. 앱에서 기본 호스트를 통해 설치된 인증서에 액세스해야 하는 경우, dotnet run 명령을 사용하여 앱을 프로젝트 파일에서 실행하거나 dotnet <filename.dll> 명령을 사용하여 앱을 직접 시작하세요.

ASP.NET Core 및 macOS와 인증서 섹션에서 이 시나리오에 대한 자세한 내용을 확인할 수 있습니다.

ASP.NET Core, macOS 및 인증서

.NET은 macOS 키체인에서 System.Security.Cryptography.X509Certificates 클래스로 인증서를 관리하는 기능을 제공합니다. macOS 키체인에 대한 액세스에서는 어느 파티션을 고려해야 할지 결정할 때 애플리케이션 ID를 기본 키로 사용합니다. 예를 들어, 서명되지 않은 애플리케이션은 비밀을 서명되지 않은 파티션에 저장하지만, 서명된 애플리케이션은 비밀을 해당 애플리케이션에서만 액세스할 수 있는 파티션에 저장합니다. 앱을 호출하는 실행 파일의 소스가 어느 파티션을 사용할지를 결정합니다.

.NET은 appHost, 기본 호스트(dotnet 명령), 사용자 지정 호스트와 같은 3가지 소스의 실행을 제공합니다. 각 실행 모델에는 서명되었거나 서명되지 않은 서로 다른 ID를 가질 수 있으며, 키체인 내의 서로 다른 파티션에 대한 액세스를 갖습니다. 하나의 모드로 가져온 인증서는 다른 모드에서 액세스하지 못할 수 있습니다. 예를 들어, .NET의 공증된 버전에는 서명된 기본 호스트가 있습니다. 인증서는 그 ID에 따라 보안 파티션으로 가져와집니다. appHost가 임시로 서명되었으므로 생성된 appHost에서 이러한 인증서에 액세스할 수 없습니다.

또 다른 예로, 기본적으로 ASP.NET Core는 기본 호스트를 통해 기본 SSL 인증서를 가져옵니다. appHost를 사용하는 ASP.NET Core 애플리케이션은 이 인증서에 액세스할 수 없으며, .NET에서 이 인증서에 액세스할 수 없다는 사실을 감지하면 오류가 발생합니다. 오류 메시지는 이 문제를 해결하는 방법에 대한 지침을 제공합니다.

인증서 공유가 필요한 경우, macOS는 security 유틸리티를 통해 구성 옵션을 제공합니다.

ASP.NET Core 인증서 문제를 해결하는 방법에 대한 자세한 내용은 Enforce HTTPS in ASP.NET Core(ASP.NET Core에서 HTTPS 강제 적용)를 참조하세요.

기본 자격

.NET의 기본 호스트(dotnet 명령)에는 기본 자격 세트가 있습니다. 이러한 자격은 .NET이 올바르게 작동하는 데 필요합니다. 애플리케이션에 그 밖의 자격이 필요한 경우가 있는데, 이 경우 appHost를 생성하여 사용한 다음 로컬에서 필수 자격을 추가해야 합니다.

.NET의 기본 자격 세트:

  • com.apple.security.cs.allow-jit
  • com.apple.security.cs.allow-unsigned-executable-memory
  • com.apple.security.cs.allow-dyld-environment-variables
  • com.apple.security.cs.disable-library-validation

.NET 앱 공증

애플리케이션을 macOS Catalina(버전 10.15) 이상에서 실행하려면 앱을 공증해야 합니다. 공증을 위해 애플리케이션과 함께 제출하는 appHost에는 .NET Core의 기본 자격과 같거나 높은 기본 자격을 사용해야 합니다.

다음 단계