인디노트

xcode 에서 직접 app 에 서명 본문

소스 팁/Objective C, Swift, iOS, macOS

xcode 에서 직접 app 에 서명

인디개발자 2023. 4. 4. 02:00

흔히 xcode 에서 빌드한 앱은 archive 를 해서 배포 파일을 만들어야 다른 맥에서 실행이 된다.

이렇게 되면 Developer ID 로 싸이닝하게되는 것이다.

번거롭다.

run script 에 xcode 로 빌드 한 후 다음의 코드싸인 처리하자.

codesign --force --sign - "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}"

이제 직접 빌드한 app 을 다른 맥에 복사해서 사용할 수 있다.

주의해야 할 것은 배포버전과 싸이닝 값이 다르므로

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

같은것을 처리할 때 대상이 다르기 때문에 각각 놀게 된다. 즉, 개발할 때 배포할 때 다르다.

추가: 이렇게 서명한 앱을 실행하면 pkg 파일 만들어 실행할 때 제약이 없어지는 것 같은데. 이것은 명확하지 않다.

애플 코드싸인 인증서에는  DEV, DIST, Developer ID 등이 있다. 이때 배포용 DIST 로 싸이닝해야 다른 컴에서 실행하는제 제약사항이 없어지는것 같다. 특히, Developer ID 로 싸이닝하면 제약사항 (특히 /tmp 폴더 같은 엑세스 권한 등) 이 따른다.

xcode 의 아카이브를 이용하여 싸이닝해서 배포는 스토어를 통해야 한다. 직접 (export) 배포하면 패키지 설치는 되지만 설치후 앱의 실행시 에러가 발생한다.

결론적으로 스토어를 통해서 배포를 하지 않으면서 다른 컴에서 권한등의 이슈없이 동작하기 위해서는 위의 방법으로 해야 하지만 이게 정상적인 방법인지는 잘 모르겠다. 더 조사를 해볼 필요가 있다. 근데 왜 Developer ID 로 싸이닝하면 권한 문제를 겪게 되는지...

그리고 위와 같은 방법으로 싸이닝하는것은 AI 가 알려준 것이다. 이 방법으로 싸이닝하면 어떤 인증서를 사용하고 있는지 확인해 봐야 겠다.

 

다음은 다양한 싸이닝 옵션들에 대한 조사를 해 본 결과이다. 참고하면 좋을 듯 싶다.

 

만약 자신의 코드싸인 인증서가 별도로 있다면 다음과 같이 키체인에 저장되어 있는 자신의 인증서 이름을 입력하여 싸이닝 할 수 있다.

codesign --force --sign 'Certchip' "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}"

 

이와 같은 관점에서 볼때 codesign -dvvv 로 해당 app 을 확인해 보면

내 인증서로 싸이닝할 때

Authority=Certchip
Authority=Sectigo Public Code Signing CA R36
Authority=Sectigo Public Code Signing Root R46
Authority=AAA Certificate Services
Signed Time=Apr 4, 2023 3:11:59 AM

와 같이 정상적인 인증서 체인들이 표시되며 싸이닝을 한 날짜 및 시간이 표시되는 반면

- 옵션으로 그냥 싸이닝 했을때는

Signature=adhoc

이렇게 adhoc 이라고만 적히게 된다. 즉, 출처가 불명확하며 adhoc 으로 배포되는 앱이라는 뜻이다.

 

그러면... 호기심에 나의 Apple 배포용 인증서로 싸이닝 한다면? 예를 들어 다음과 같이...

codesign --force --sign 'Apple Distribution: Certchip (***********)' "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/MacOS/${PRODUCT_NAME}"

Authority=Apple Distribution: Certchip (**********)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Apr 4, 2023 3:21:50 AM
Info.plist entries=25
TeamIdentifier=**********

요렇게 서명값이 저장되어 있는것을 확인 할 수 있다. TeamIdentifier 값까지 정상적으로 들어가 있게 된다.

 

그럼... 나의 애플 개발자 인증서로 서명 한다면?

Authority=Apple Development: admin@certchip.com (AAAAAAAAAA)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Apr 4, 2023 3:27:56 AM
Info.plist entries=25
TeamIdentifier=BBBBBBBBBB

이와같이 서명된다. 여기서 보면 나의 개발자 ID 와 TeamIdentifier 값이 다르며, 특히, 여기서의 TeamIdentifier 는 Dist 의 TeamIdentifier 와 다르다는데 주의 해야 한다. 즉, 개발팀의 ID 이며 그 개발자 계정의 Apple ID 값이 아니라는 점이다.

 

내친김에 제3자 개발자 인스톨러 인증서로 해 보자

3rd Party Mac Developer Installer: Certchip (**********) <= 요런 인증서

Authority=Apple Development: admin@certchip.com (AAAAAAAAAA)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Apr 4, 2023 3:27:56 AM
Info.plist entries=25
TeamIdentifier=BBBBBBBBBB

보다시피 그냥 애플 개발자 인증서로 서명된다. 왠 사기? 아니다. 이것은 인스톨러 인증서라서 인스톨 패키지 같은데 서명하는 것이다.

 

이제 제2자 개발자 앱 인증서는?

3rd Party Mac Developer Application: Certchip (**********) <= 요런 인증서

Authority=3rd Party Mac Developer Application: Certchip (**********)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=Apr 4, 2023 3:35:58 AM
Info.plist entries=25
TeamIdentifier=**********

당연히 잘 된다.

 

필요에 의해서 인증서를 사용하면 되는데 가장 현명한 것은 일단 배포 앱에 대해서는 "Apple 배포용 인증서" 로 하거나...

혹은, 자신의 코드싸이닝 인증서가 별도로 있다면 그것으로 하면 좋을 듯 하다. 자신의 코드싸이닝 인증서를 사용하면 자신의 회사 이름 등이 함께 기록되기 때문에 신뢰성이 있지 않을까 싶다. 단, 애플 정책은 다르다. 애플은 자기들이 싸이닝 한것만 신뢰가 있다고 하는 그런 부류의 회사임을 명심하자.

 

 

반응형
Comments