[notarytool] faster and simpler

정유진·2022년 7월 29일
1

swift

목록 보기
8/24
post-thumbnail

🌚 들어가며

회사에서 Mac CLI tool을 공증받을 때에 xcrun altool 명령어를 사용해왔다. 그런데 altool을 대체하는 🌟notarytool🌟의 존재에 대해 최근 알게되어서 (노답 주니어) WWDC21, 22 자료를 기반으로 짧은 정리를 해보려한다.

공증은 왜 필요합니까?

처음에 내가 공증이라는 단어를 들었을 때에? 예? 공..뭐요? 했던 기억이 나서 공증이 왜 필요한지에 대한 공감대 형성이 먼저라는 생각이 든다.

우리는 흔히 앱스토어에서 소프트웨어를 다운로드를 받지만 개발자가 제공한 링크를 통하여 소프트웨어를 다운로드받기도 한다. 하지만 이 경우에 해당 소프트웨어가 악성코드가 아니라는 것을 누가 보장할 것인가? 그래서 애플이 소프트웨어를 분석하고 '이 소프트웨어는 안전합니다 야호 🎉' 하고 딱지를 붙여주는 것이 notarization이다. 공증을 받은 소프트웨어를 사용자가 다운로드 후 열게되면 사용자의 mac은 해당 소프트웨어가 유효한 공증 ticket을 받은 프로그램인지를 확인한다. 이를 통해 사용자는 최소한 이 소프트웨어가 내 mac을 갈아엎지는 않을 것이라는 것을 신뢰할 수 있다.(공증을 받기 이전에 codesign이 먼저 선행되어야 하는데 이에 관해서는 일단 넘어간다. pkgbuild 로 가능하다.)

🌪 altool

과거의 altool의 코드는 어떻게 쓰여져 있었는지 한 번 볼까?

requestUUID=$(xcrun altool --notarize-app -f path/to/submission.zip
	--primary-bundle-id "$BUNDLE_ID"
    --username "$user_account" 
    --password "$user_password"
    --file "$file_path"
    --asc-provider "$team_name"
    | awk '/RequestUUID/ { print $NF; })'
    
while true; do
	INFO_OUT=$(2>&1 xcrun altool 
    --notarization-info "$requestUUID" 
    --username "$user_account"
    --password "$user_password")
    STATUS=$(echo "$INFO_OUT" | grep "Status:" | sed -Ee "s|.*(.*)$|\1|")
    if [["$STATUS" != "in progress"]]; then
    	break
    fi
    sleep 30
done
    )
  • 첫 번째 단락이 공증을 받는 코드
  • while 단락은 공증에 대한 정보를 출력하는 코드
  • shell script 때문에 좀 헷갈릴 수 있는데 공증시도가 성공하면 UUID가 반환된다.
  • 반환 결과에서 awk로 RequestUUID key를 찾아서 ($NF는 the last field in a record를 의미함) 변수에 저장하고 그 UUID는 notarization-info를 받기위해 사용된다.

http://cwyang.github.io/2020/12/09/osx-codesign-notarization.html (altool 사용 관련)
https://zzsza.github.io/development/2017/12/20/linux-6/ (awk 관련)
참고하기에 좋은 소스입니다 🍯

그렇다면 우리의 notarytool은 이 과정을 어떻게 헤쳐나갈까? 두둥 (넷플릭스 효과음)

🌻 notarytool

notarytool submit path/to/submission.zip --wait
--keychain-profile "notary-profile.com"

ontarytool log $SUBMISSION_ID notary-log.json
  • one line command로 해결
  • altool의 App store support 필요 없음
  • notary service만을 위한 백엔드를 구축했다고 함
  • 공증이 완료되면 log 확인도 간단하다.
  • 프로세스가 끝나고 server callback을 받는 --webhook 옵션 제공
  • credential을 저장하고 추후 notarytool을 사용할 때 끌어와서 쓸 수 있다.
xcrun notarytool store-credential --apple-id "apple@account.com" --team-id "ABCD12345"

Profile name:
notary-profile.com
Password for apple@account:
Validating your credentials...
Success. Credentials validated.
Credential saved to Keychain.
To use them, specify '--keychain-profile "notary-profile.com"'
  • credential을 저장할 때에 profile name을 입력하는데
  • submit할 때 keychain-profile value로 위 profile name을 넣으면 된다.
  • 애플 계정은 필수!

필수는 아니지만 공증 이후에 stapler를 할 수도 있다.

https://scriptingosx.com/2021/07/notarize-a-command-line-tool-with-notarytool/
notary tool 전반에 대하여 아주 정리가 잘 된 글을 찾았다. 🐶🍯

🤔 정리하기

WWDC2022에 따르면 altool 방식은 2023 Fall 까지 Sunset이라고 하니 아직 시간은 넉넉히? 남았다 싶으면서도 notarytool이 더 쉽고 빠른 것 같아서 얼른 갈아타도 좋지 않을까. Xcode 14에 built-in 되어 있는 것 같으니 조만간 다운로드해서 확인해봐야지. (beta는 이미 출시되었지만!) 그리고 개인적으로 Notary REST API에도 관심이 간다. 추후에 자세히 살펴보도록 하겠다.

profile
느려도 한 걸음 씩 끝까지

0개의 댓글