소개
Quill은 Anchore Inc가 개발한 명령줄 도구로, macOS 바이너리에 대한 코드 서명과 노테라이제이션을 어떤 플랫폼에서든 수행할 수 있게 해줍니다. Apple이 제공하는 codesign 유틸리티를 크로스 플랫폼 환경에서 대체하기 위한 목적으로 만들어졌으며, Go로 작성되어 단일 바이너리로 동작합니다. GoReleaser 같은 크로스 플랫폼 빌드 체인이나 CI 환경에서 macOS 빌드 단계에 의존하지 않고 서명 및 공증을 처리하려는 사용자에게 적합합니다.
상세정보
macOS 바이너리 코드 서명
Apple이 발급한 코드 서명 인증서(.p12)와 비밀번호를 사용해 macOS 실행 바이너리에 서명을 적용합니다. Apple 루트 및 중간 인증서를 Quill 바이너리에 내장해 두어, 별도로 인증서 체인을 내려받지 않아도 사용할 수 있습니다. 필요 시 사용자의 P12 파일에 전체 인증서 체인을 직접 결합해 사용할 수도 있습니다.
Apple Notary 서비스를 통한 노테라이제이션
서명된 macOS 바이너리를 Apple의 노터리 서비스에 제출해 노테라이제이션을 수행합니다. Apple Developer 계정의 API 키, 키 ID, 발급자 ID를 환경 변수로 전달해 인증하며, 제출 목록 조회, 상태 확인, 로그 조회 같은 후속 작업도 같은 도구에서 처리할 수 있습니다.
서명 및 노테라이제이션 일괄 처리
별도 단계로 분리하지 않고 sign과 notarize를 한 번에 실행하는 명령을 제공합니다. CI에서 스냅샷 빌드일 때는 드라이런과 임시(ad-hoc) 서명만 수행하고, 프로덕션 릴리스일 때 실제 서명 및 노테라이제이션을 적용하는 식의 분기도 가능합니다.
macOS 바이너리 검사 및 인증서 추출
서명된 바이너리의 세부 정보를 확인하거나 포함된 인증서를 추출하는 명령도 함께 제공합니다. P12 파일에 대해 누가 발급했고 어떤 체인이 포함되어 있는지 설명하는 명령도 있어, 노테라이제이션 실패 시 원인을 진단할 때 유용합니다.
GoReleaser 파이프라인에서 릴리스 자동화
GoReleaser의 post 훅에 quill sign-and-notarize “{{ .Path }}” –dry-run={{ .IsSnapshot }} –ad-hoc={{ .IsSnapshot }} -vv 형태로 호출해 darwin 빌드의 산출물을 자동으로 공증할 수 있습니다. CI에서 QUILL_SIGN_P12, QUILL_SIGN_PASSWORD, QUILL_NOTARY_KEY, QUILL_NOTARY_KEY_ID, QUILL_NOTARY_ISSUER 환경 변수가 설정되어 있어야 프로덕션 릴리스에서 실제 서명 및 노테라이제이션이 수행되며, 스냅샷 빌드에서는 임시 서명과 드라이런만 진행됩니다.
서명 실패 시 진단과 재처리
quill submission list로 과거 노터리 제출 목록을 확인하고, quill submission status [id]로 개별 요청의 상태를 조회할 수 있습니다. Apple에서 거절된 경우 quill submission logs [id]로 상세 로그를 받아 어떤 조건이 실패했는지 확인할 수 있습니다.
Quill은 어떤 플랫폼에서 동작하나요?
Windows, macOS, Linux 등 주요 운영체제에서 단일 바이너리로 실행되며, Apple 바이너리 서명 단계가 필요한 모든 환경에서 사용할 수 있습니다.
노테라이제이션을 위해 인터넷 연결이 필요한가요?
서명 자체는 오프라인에서 가능하지만, Apple의 노터리 서비스를 이용하는 노테라이제이션 단계에서는 Apple 서버와의 통신이 필요합니다.
Apple 계정과 인증서는 어떻게 준비하나요?
Apple 개발자 포털에서 코드 서명용 비밀 키와 인증서를 .p12 파일 형태로 내려받고, Apple Notary 서비스용 API 키를 발급받아 환경 변수로 지정해야 합니다.
시스템 요구사항
macOS 바이너리 서명을 위해서는 Apple이 발급한 코드 서명 인증서와 .p12 파일이 필요하며, 서명 시점에 전체 인증서 체인이 사용 가능해야 합니다. 노테라이제이션에는 Apple Notary 서비스의 자격 증명이 추가로 필요하며, Apple 서버와의 통신이 요구됩니다. 환경 변수로는 QUILL_SIGN_P12(또는 base64 인코딩 본문)와 QUILL_SIGN_PASSWORD, QUILL_NOTARY_KEY, QUILL_NOTARY_KEY_ID, QUILL_NOTARY_ISSUER 등이 사용됩니다. p12 attach-chain 명령은 키체인 접근을 위해 macOS에서만 실행할 수 있습니다.


