This page details the process of code signing and notarization for macOS applications.
Code signing is the process of creating a code signature for an application. This signature guarantees the integrity of applications and safeguards from any tampering. Apple devices use an application’s code signature to detect changes made after the code signature was created. If an application doesn’t have a code signature, the device warns the end user before they open it. Unity automatically code signs any application it builds for macOS.
Notarization is when Apple verifies your application to ensure it has a Developer ID code signature and doesn’t contain malicious content. For more information about notarization, refer to Apple’s documentation on macOS Code Signing in Depth and Notarizing macOS Software Before Distribution.
If you develop on an Apple device, you can use Xcode, Xcode command-line tools, or Unity Cloud Build to notarize your application. If you don’t have an Apple device, use Unity Cloud Build.
This page has information on the following notarization methods:
Note: Notarization isn’t required to distribute your application through the Mac App Store. The Mac App Store’s upload process includes similar content validation to notarization. Refer to Delivering to the Mac App Store for more information.
Unity can create an Xcode project that represents your Unity project during the build process. You can use this Xcode project to notarize your application. Follow the macOS application build steps to create an Xcode project from your Unity project. For information on notarizing the Xcode project, see Apple’s documentation on Notarizing macOS Software Before Distribution.
If you can’t notarize your application in the Xcode environment or want to control notarization manually, you can use Xcode’s command-line tools. To do this, you need the following:
To notarize your application with the Xcode command-line tools, you must first code sign the application. This section explains how to code sign your application using Xcode’s command-line tools.
Unity adds a code signature to every macOS build it produces. This simple code signature doesn’t identify you as the developer. To notarize an application, Apple requires the code signature to include a cryptographic signature that identifies the developer. This is called a signing identity. Usually, you use a Developer ID certificate.
새로운 개발자 ID 인증서를 만들려면 새로운 인증서 생성으로 이동하여 다음을 수행합니다.
.cer
입니다.애플리케이션을 공증하려면 Apple은 해당 애플리케이션을 식별해야 합니다. 애플리케이션 식별자를 가져오려면 Unity에서 가져오는 방법과 빌드된 애플리케이션의 정보 프로퍼티 리스트 파일에서 가져오는 방법이 있습니다.
애플리케이션 식별자가 있으면 Apple에 등록할 수 있습니다. 등록하려면 다음을 수행하십시오.
Entitlements are permissions or restrictions your code signature includes that allow or prevent your application from taking specific actions.
애플리케이션에 대한 자격을 설정하려면 다음을 수행하십시오.
.entitlements
파일 확장자로 애플리케이션과 동일한 이름을 가진 파일을 생성합니다. 예를 들어 애플리케이션 이름이 Sample인 경우 Sample.entitlements
라는 이름의 파일을 생성합니다.<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
</dict>
</plist>
이러한 자격은 Hardened Runtime을 갖기 위해 macOS 애플리케이션에서 필요한 최소한의 자격입니다. 애플리케이션에 더 많은 자격이 필요한 경우 이 리스트에 추가합니다.
코드 서명 프로세스는 커맨드 라인을 사용합니다. 시작하려면 터미널을 열고 애플리케이션이 있는 디렉토리로 이동합니다. 코드 서명을 처리하는 데 필수 읽기 권한이 있는지 확인하려면 "application_name.app"
가 애플리케이션의 이름으로 있는 다음의 커맨드를 실행합니다.
chmod -R a+xr "application_name.app"
A code signature uses a particular signing identity. Usually, this is your Developer ID Application signing identity. However, some digital distribution services, such as the Mac App Store require a different signing identity.
애플리케이션을 코드 서명하려면 다음의 위치에 있는 커맨드를 실행합니다.
"application_name.app"
은 빌드된 애플리케이션입니다."Developer ID Application : XXX (YYY)"
는 서명 ID입니다.codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements "application_name.entitlements" --sign "Developer ID Application : XXX (YYY)" "application_name.app"
이 커맨드는 애플리케이션 번들 폴더를 통해 재귀적으로 이동하며 모든 파일을 서명하고 안전한 타임스탬프를 추가하며 해당 서명에 설정한 자격을 포함합니다.
Warning: Using the --deep
option might cause issues with your code signature. This is because:
서명한 모든 코드에 동일한 코드 서명 옵션과 자격을 적용합니다.
발견한 코드 파일만 서명합니다. 시스템이 데이터를 찾으리라 예상되는 위치에 코드 파일이 있는 경우 --deep
을 사용하면 이러한 코드 파일을 서명하지 않습니다.
For more information about the --deep
option and how to resolve issues with it, refer to Sign your code.
After you code sign your application, you must upload it to Apple for notarization. To fulfill the upload requirements, the following items are necessary:
Apple에서는 공증하기 위해 애플리케이션을 업로드하기 전에 압축해야 합니다. 압축하려면 다음을 수행하십시오.
터미널을 열고 애플리케이션이 있는 디렉토리로 이동합니다.
"application_name.app"
은 빌드된 애플리케이션입니다."application_name.zip"
은 생성할 압축 파일 이름입니다.ditto -c -k --sequesterRsrc --keepParent "application_name.app" "application_name.zip"
이는 애플리케이션을 압축하고 압축한 파일을 애플리케이션과 동일한 디렉토리로 출력합니다.
애플리케이션을 공증하려면 Apple에는 특정 포맷으로 된 고유한 비밀번호가 필요합니다. 애플리케이션 비밀번호를 생성하려면 Apple ID가 있어야 합니다. Apple ID가 없는 경우 Apple Id 관리로 이동하여 ID를 만듭니다.
For information on how to generate an application password, refer to How to generate an app-specific password. The password you generate uses the following format: xxxx-xxxx-xxxx-xxxx
.
공급자 약칭은 개인이나 회사를 식별하는 단일 단어 레이블입니다. Apple은 Apple ID가 둘 이상의 조직과 연관될 때 공증할 조직을 결정하는 데 공급자 약칭을 사용합니다. 공급자 약칭을 가져오려면 다음을 수행하십시오.
apple_id
는 Apple ID입니다.xxxx-xxxx-xxxx-xxxx
는 애플리케이션 비밀번호입니다.xcrun iTMSTransporter -m provider -u apple_id -p xxxx-xxxx-xxxx-xxxx
Apple에서 애플리케이션을 공증할 경우 공증 서버에 업로드해야 합니다. 업로드하려면 다음을 수행하십시오.
apple_id
는 Apple ID입니다.xxxx-xxxx-xxxx-xxxx
는 애플리케이션 비밀번호입니다.provider_short_name
은 공급자 약칭입니다.application_bundle_id
는 애플리케이션의 애플리케이션 식별자입니다.application_name.zip
은 압축 애플리케이션입니다.xcrun altool --notarize-app --username apple_id --password xxxx-xxxx-xxxx-xxxx --asc-provider provider_short_name --primary-bundle-id application_bundle_id --file application_name.zip
업로드를 성공한 경우 Apple은 요청 ID가 포함된 터미널에 리스폰스를 표시합니다. 이 요청 ID를 사용하여 요청 상태를 확인할 수 있습니다. 이는 서비스의 트래픽에 따라 공증 프로세스에 몇 시간씩 걸릴 수도 있기 때문에 유용합니다. 요청 상태를 확인하려면 다음을 수행하십시오.
request_id
는 Apple이 이전 커맨드에서 반환한 요청 ID입니다.apple_id
는 Apple ID입니다.xxxx-xxxx-xxxx-xxxx
는 애플리케이션 비밀번호입니다.provider_short_name
은 공급자 약칭입니다.xcrun altool --notarization-info request_id --username apple_id --password xxxx-xxxx-xxxx-xxxx --asc-provider provider_short_name
공증 프로세스가 완료되면 Apple은 Apple ID와 연결된 이메일 주소로 확인 메일을 보냅니다. 그러면 공증이 성공했는지 확인할 수 있습니다. 확인하려면 다음을 수행하십시오.
application_name.app
는 애플리케이션 이름입니다.spctl -a -v application_name.app
공증을 성공한 경우 Apple이 애플리케이션을 수락하였으며 개발자 ID를 포함하고 있다는 점을 표시하는 메시지가 반환됩니다.
After notarizing your application, any device that runs it can verify that it has a code signature and contains no malicious content. However, the device can only perform this verification online. To verify your application on a device without an internet connection, you must staple the application. For information about stapling, refer to Staple the Ticket to Your Distribution.
To staple your application,
"ApplicationName.app"
is the name of your application: xcrun stapler staple "ApplicationName.app"
.Unity Cloud Build can notarize and staple your macOS application during the build process. To do this, Unity requires the following:
.p12
파일을 생성하는 데 사용한 비밀번호Depending on the platform you are developing on, the process for some of these requirements differs. If you develop on an Apple device, you can use Xcode command-line tools to get the information and create the relevant files. If you develop on Windows or Linux, you won’t have access to Apple-specific Xcode command-line tools.
사용 중인 플랫폼에 상관 없이 Apple ID, 비밀번호, 자격 파일을 가져오는 프로세스는 다음과 같이 플랫폼 애그노스틱입니다.
이 단계를 완료한 후 다음을 수행합니다.
Apple 기기에서 개발하는 경우 Xcode 커맨드 라인 툴을 사용하여 Unity 클라우드 빌드를 사용한 공증에 나열된 요구 사항을 충족할 수 있습니다. 그런 다음 Unity 클라우드 빌드를 설정하여 빌드 프로세스의 일환으로 애플리케이션을 공증하고 스테이플할 수 있습니다. 요구 사항을 충족하려면 다음을 단계를 수행하십시오
.p12
) format. For information on how to do this, refer to Import and export keychain items using Keychain Access on Mac.요구 사항을 충족하고 나면 Unity 클라우드 빌드 공증 양식을 채워 제출합니다.
If you develop on Windows or Linux and want to build, notarize, and staple your application for macOS, you can’t use Xcode command-line tools. To meet the requirements listed in Notarization using Unity Cloud Build to set up Unity Cloud Build to notarize and staple your application as part of the build process:
요구 사항을 충족하고 나면 Unity 클라우드 빌드 공증 양식을 채워 제출합니다.
.p12
파일은 개발자 ID 인증서와 프라이빗 키를 번들로 묶습니다. 개발자 ID 인증서에서 만드는 방법은 다음과 같습니다.
Open a command-line interface and go to the directory that contains your Developer ID certificate file. If you didn’t download your Developer ID certificate, refer to Signing identity.
.cer
파일 포맷을 사용합니다. 이 파일을 .pem
파일 포맷으로 전환합니다. 전환하려면 다음의 위치에 있는 커맨드를 실행합니다.
developer_identity.cer
은 전환할 개발자 ID 인증서입니다.developer_identity.pem
은 출력할 파일 이름이자 파일 타입입니다.openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
mykey.key
is the file name of the private key to output.openssl genrsa -out mykey.key 2048
.p12
파일을 생성합니다. 이 파일을 생성하려면 다음의 위치에 있는 커맨드를 실행합니다.
mykey.key
는 3단계에서 생성한 프라이빗 키 파일입니다.developer_identity.pem
은 2단계에서 생성한 .pem
파일입니다.openssl pkcs12 -export -inkey mykey.key -in developer_identity.pem -out iphone_dev.p12
Unity 클라우드 빌드를 사용한 공증에서 설명한 요구 사항을 충족하고 나면 다음의 단계를 따라 Unity 클라우드 빌드 공증을 설정합니다.
.p12
파일입니다..p12
파일을 생성할 때 제공한 비밀번호입니다.--deep --force --verify --verbose --timestamp --options runtime
플래그를 사용하여 codesign
커맨드를 실행합니다. 현재는 커스텀 플래그를 지정할 수 없습니다.FASTLANE_NOTARIZE_VERBOSE=true
in your build target Environment Variables.