Lined Notebook

인증서와 코드 사이닝(signing:서명)과 배포

by 사슴비행기

이 글은

http://la-stranger.blogspot.kr/2014/04/ios.html

 

[iOS] 인증서와 코드 사이닝 이해하기

iOS개발을 하면서 가장 헷갈리는 컨셉중 하나는 개발중인 앱을 실제 디바이스에서 실행되도록 하는 과정이다. 이 과정은 개인키, 공개키, 인증서, 프로비저닝 프로파일등 뭐가 뭔지 모르겟는 컨셉들이 마구 등장하기 때문인데 앱을 사이닝하면서 배포하는 과정에...

la-stranger.blogspot.com

이 링크의 글을 기반으로 하여 재정리(개행, 문장을 약간 수정 등)한 것입니다.

원래의 글의 가독성 때문에 따로 정리하여 추후에 지속적으로 볼 용도로 작성한 글이므로

글을 열심히 작성하신 '끄적끄적' 블로거분을 위해서 되도록이면 원글을 읽어주시면 감사하겠습니다.

문제가 될 시 바로 비공개 조치할 예정이며 댓글로 알려주시기 바랍니다.

 

앱을 실제 디바이스에서 실행하는 과정에는 '개인키, 공개키, 인증서, 프로비저닝 프로파일 등'의 알 수 없는 것들이 등장한다.

앱을 사이닝하고 배포하는 과정(앱을 실제 디바이스에서 실행하는 과정)에서 어떤 일이 일어나는지 알바 보며, 어려운 개념을 이해해보자.

 

애플은 자신들의 하드웨어에 허락된 주체의 소프트웨어만 동작하도록 하고 있다.

앱을 실행할 때마다 매번, 애플로부터 인증을 받았는지, 앱을 실행할 수 있는 권한이 주어졌는지를 확인한다.

이러한 시스템이 싫으면 탈옥하여 사용하기도 한다.

 

** Apple 인증서

 

원래는 애플만이 앱을 실행할 권한을 가지지만 개발자들은 권한을 부여받아서 애플로부터 신뢰를 받은 다음, 디바이스로 테스트를 할 수 있다.

이것은, iOS Developer program의 개발자 센터에서 인증서를 받는 것부터 시작한다.

이 인증서를 받으면 개발자가 애플 대신 앱을 sign할 수 있는 권한을 인증받을 수 있다.

이 인증서를 받기 위해선, '키체인 접근'이라는 앱에서 Certificate Signing Request(CSR)을 생성해야 한다.

Request a Certificate from a Certicicate Authority 과정이라고도 하는데, 이 과정에서는 두가지 일이 일어난다.

 

1. 먼저 키체인 앱은 공개키와 개인키를 자동으로 생성한다.

   이 키들은 키체인 앱의 'Key'라는 카테고리에서 확인할 수 있다.

   이 키들은 당신이 누구인지 애플에 알리는 중요한 키이다.

   이 키를 분실하면 더이상 앱스토어에 배포할 수 없는 상황이 생기기 때문에 적절한 곳에 잘 보관해두어야 한다.

2. 그 다음으로 이 키를 이용해서 애플에 보낼 CertSigningRequest 파일을 생성한다.

   이 파일은 당신의 이름, 이메일, 공개키를 포함하고 있고, 개인키를 이용해서 sign이 된다.

   이렇게 공개키와 개인키 매커니즘은 애플에서 이것(?)을 당신이 만들었음을 알 수 있게 해준다.

 

CRS을 애플에 업로드하면서 인증서를 요청하면, 애플에서는 간단한 확인 작업을 거친 후 개발 인증서를 발급해준다.

개발자는 이 인증서를 받아, 키체인 앱에 드래그 앤 드롭으로 추가할 수 있고, My Certificate(나의 인증서) 카테고리에 추가된 것을 확인할 수 있다.

인증서를 더블클릭하여 열어보면, 이 인증서가 애플로부터 발급되었고 애플이 당신을 신뢰한다는 내용을 볼 수 있다.

이 인증서는 이후에 앱을 sign할 때 사용된다.

 

** Provisioning Profile

 

위의 과정을 거치면 애플로부터 앱을 sign할 수 있도록 허락받은 상태이다.

한가지 더 필요한 게 있는데, 당신의 아이폰(외 아이패드 기기)가 당신을 신뢰해야 앱을 설치할 수 있다.

여기서 프로비저닝 프로파일이 필요한 것이다.

 

프로비저닝 파일을 만든다는 것은 당신의 iOS 디바이스들을 앞 단계의 인증서와 연결하는 것을 의미한다.

그 결과로 *.mobileprovision 파일이 만들어지고, 이 파일은 당신의 앱을 컴파일하는 과정에서 사용된다. 또한 앱을 테스트할 디바이스에 설치되어야 한다.

프로비저닝 파일을 설치하는 방법은, Provisioning Portal에서 다운받은 파일을 더블클릭하면 XCode가 인식하고 자동으로 프로비저닝 프로파일 목록에 저장한다.

개발자는 이러한 프로비저닝 프로파일을 여러개 가질 수 있다.

하지만 프로비저닝 파일을 생성할 때 연동한 App ID실제 컴파일하려는 앱에 설정된 ID일치하여야 하므로, 결국에는 각 프로젝트마다 프로비저닝 프로파일을 만들게 될 것이다.

 

** 앱을 빌드하고 실행하는 과정에서 일어나는 일

 

위의 과정을 통해, 당신은 당신을 증명하는 공개키와 개인키를 가졌고,

애플로하여금 당신이 누구인지 확인받고 앱을 서명할 수 있음을 허락받은 인증서를 가지고 있다.

그리고 인증서를 이용하여 서명된 앱을 당신의 디바이스에서 사용할 수 있도록 해주는 프로비저닝 프로파일까지 가지게 됐다.

이제 앱을 빌드하여 실제 디바이스에 배포할 때 필요한 것은 모두 가졌다.

 

빌드하기 위해 XCode를 어떻게 설정해야 하는지는 다른 글에서 정보를 얻길 바라며, 빌드된 앱을 어떤식으로 (앞에서 설명한) signing(서명), 인증서, 프로비저닝 프로파일이 사용되는지 알아보자.

 

XCode에서 빌드를 하면 .app파일을 얻게 된다.

사실 이것은 하나의 파일이 아닌 앱의 모든 것을 담고 있는 하나의 폴더이다.

Finder에서 .app 파일을 우클릭 하면 Show Package Contents라는 목록이 보이는데 이걸 클릭하면 앱이 담고 있는 내용을 볼 수 있다.

이 중에 주목할만한 것은 이 두가지 이다.

1. 실제 프로비저닝 프로파일(이것은 컴파일할 때 사용한 것과 같은 프로비저닝 프로파일의 복사본이다.)

2. _CodeSignature 폴더(CodeResources라는 파일을 담고 있는데, 이것은 단순한 plist 파일이지만 패키지 내 모든 파일의 암호화된 해쉬정보를 담고 있다.)

 

앱이 최종적으로 디바이스에 설치될 때 iOS에서는 많은 일이 일어난다.

먼저, 앱에 포함된 프로비저닝 프로파일이 애플에서 서명된 것인지를 확인한다.

그 다음, CodeResources라는 파일에 기록된 각 파일의 해쉬정보를 실제 파일들과 확인하여 빌드 후에 어떤 파일도 수정되지 않았음을 확인한다.

이 중, 어떤 과정에서라도 문제가 생기면 앱은 설치되지 않는다.

마지막으로, 앱을 실행할 때도 확인과정을 거치는데, iOS는 앱이 변조되지 않았음을 확인하고 디바이스에 '앱에 포함된 프로비저닝 프로파일'과 같은 프로비저닝 프로파일을 가지고 있는지 확인한다.

 

** 다른 배포 과정

 

Ad-Hoc 배포는 위에서 설명한 과정과 거의 같은 과정을 거치고 같은 과정으로 앱이 설치되고 실행된다.

하지만 Enterprise 배포는 약간 다르다.

당신의 회사가 수많은 iPhone 유저들을 가진다고 하면, 그 회사는 더 신뢰할 수 있는 충분한 이유가 된다.

그래서 애플에서는 당신에게 정말로 애플인것처럼 개발한 앱들을 서명할 수 있는 인증서를 발급해준다.

즉, 이 인증서로 서명된 앱들은 따로 확인과정을 거치지 않고 모든 디바이스를 애플에 등록하지 않고도 개발된 앱을 디바이스에서 바로 실행할 수 있도록 해주는 것이다. 와우!

그 외에는 비슷한 과정을 거치지만..

 

** 앱스토어 배포과정

 

Enterprise 배포와 비슷하지만 이 배포과정에 포함되는 프로비저닝 프로파일은 빌드된 앱이 어떤 디바이스에서도 실행이 되지 않도록 한다.

앱스토어를 위해 빌드된 앱은 앱스토어 제출 용도 말고는 어디에서도 쓸 수 없다.

그리고 애플측에 앱이 제출되었을 때는, 이 앱이 당신에 의해 이미 서명되었고, 프로비저닝 파일을 가지고 있기 때문에 애플에 인증된 개발자가 제출한 앱임을 확인할 수 있다. 그리고 애플측에서 이 앱을 승인하면 애플에서 자신들의 서명을 다시 함으로서 이 세상 모든 iOS 디바이스에서 실행될 수 있도록 해주는 것이다.

 

** 요약을 해보면

어쨌거나 저쨌거나 앱을 빌드하려면 공개키, 개인키, 인증서, 프로비저닝 프로파일은 모두 있어야 하며

작은 프로젝트 - 디바이스마다 확인절차를 가짐.

큰 프로젝트 - 디바이스를 따로 등록하지 않아도 앱을 실행할 수 있음.

배포 - 인증된 개발자라는 것을 확인할 수 있도록 앱을 만들면, 애플측에서 확인하고 승인을 해줌. 승인이 되면 애플의 재서명을 하므로서 세상 모든 디바이스에서 실행될 수 있게 함. 단, 이 용도로 빌드된 앱은 제출용 외에는 사용할 수 없어 디바이스에서 실행되지 않음.

 

즉, 앱을 테스트 용으로 빌드하거냐 제출용으로 빌드할거냐에 따라서 약간의 배포과정이 다른 것이다.

 

뭔 빌드 과정이 이렇게 복잡한가 했더니

작은 프로젝트를 빌드할거냐 / 큰 프로젝트를 빌드할거냐 / 배포용으로 빌드할거냐에 따라서 다른 거였다.

이제 좀 이해가 간다.

잘 설명해준 '끄적끄적' 블로거님 감사합니다.

 

 

 

나의 문제는 이것이었으며 어떻게 해결했는지 링크를 걸어 놓음.

https://doorganizedcoding.tistory.com/5

블로그의 정보

Beautiful Coding

사슴비행기

활동하기