본문 바로가기

C/Objective C/ios

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

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


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

먼저 왜 앱개발자들이 이런 것들을 이해를 해야 하냐고 따진다면,

단지 애플만이 자신들의 하드웨어에서 어떤 소프트웨어가 동작하도록 허락된 주체이기 때문이다.

이것은 절대명제이며 많은 사람들이 이런 컨셉을 싫어해서 아이폰을 탈옥시켜서 애플로부터 해방되려고 애쓰는 이유이기도 하다.

실제로 매번 앱이 실행될때마다 앱은 애플로 부터 인증을 받았는지 그래서 앱을 실행할 수 있는 권한이 주어졌는지 확인을 한다.


Apple 인증서


애플만이 앱을 실행할 권한을 가진다면 개발자들은 어떻게 디바이스에서 테스트를 할 수 있나? 해답은 애플이 개발자를 신뢰하여 애플 대신 앱을 실행할 수 있는 권한을 부여받는다.

iOS Developer program의 개발자 센터에서 인증서를 받는 것으로 시작한다. 여기서 인증서란 매우 특별한 인증서로 개발자가 애플 대신 앱을 사인할 수 있는 권한을 인증받음을 의미한다. 이 인증서를 받기 위해서는 키체인 접근 앱에서 Certificate Signing Request(CSR)를 생성해야한다. 이때 "Request a Certificate from a Certificate Authority" 과정에서 두가지 일들이 일어나는데,


1. 먼저 키체인 앱은 공개키와 개인키를 자동으로 생성한다. 이 키는 Keychain앱의 "Key" 카테고리에서 확인할 수 있다. 이 키는 당신이 정말로 누구인지 애플에 알리는 정말로 중요한 키이므로 앱을 배포후 키를 잃어버려 더이상 앱스토어에 배포할 수 없는 상황을 맞이할지도 모르므로 적절한 곳에 잘 보관하여야한다.

2. 다음이자 마지막으로 이 키를 이용하여 애플에 보낼 CertSingingRequest 파일을 생성한다. 이 파일은 당신의 이름, 이메일, 공개키를 포함하고 있고 개인키를 이용하여 사인된다. 이 공개키, 개인키 매커니즘으로 애플은 정말 당신이 이것을 만들었다는것을 알 수 있게 된다.


이 CSR을 애플에 업로드하면서 인증서를 요청하면 애플측에서는 간단한 확인 작업을 거친후 개발 인증서를 발급해준다. 개발자는 이 인증서를 받아서 키체인앱에 드래그드롭으로 추가하면 "My Certificate" 카테고리에 추가됨을 확인할 수 있고 더블클릭하여 자세한 내용을 보면 이 인증서는 애플을 통해 발급되었고 애플은 당신이 누구인지를 신뢰한다는 정보를 담고 있다. 이 인증서는 잠시후 앱을 사인할 때 사용된다.


Provisioning Profile


당신이 누구인지를 애플에 알림으로써 애플이 당신에게 인증서를 발급함으로써 앱을 사인할 수 있도록 허락은 받은 상태라고 볼 수 있는데 한가지 더 필요한것은 당신의 아이폰/아이패드가 당신을 신뢰할 수 있는지를 알아야 앱 설치를 허락할지 말지를 결정할 수 있다. 여기서 프로비저닝 프로파일 파일이 필요성이 발생한다.

프로비저닝 프로파일을 만든다는 것은 당신의 iOS디바이스들을 앞 단계에서 만든 인증서와 연결하는 것을 의미한다. 그 결과로 만들어진 *.mobileprovision 파일은 당신의 iOS앱을 컴파일하는 과정에서 사용 되며 또한 앱을 테스트하려고 하는 디바이스에 설치가 되어야 한다. 프로비저닝 프로파일을 설치하는 방법은 Provisioning Portal에서 다운 받은 파일을 더블클릭하면 XCode가 인식하고 자동으로 프로비저닝 프로파일 목록에 저장한다.

개발자는 복수의 프로비저닝 프로파일을 가질 수 있다. 그러나 프로비저닝 프로파일을 생성할때 연동한 App Id와 실제 컴파일하려는 앱에 설정된 ID가 일치하여야 하므로 결국은 각 프로젝트마다 각각의 프로비저닝 프로파일을 만들게 될 것이다.


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


이제 당신이 누구인지를 증명하는 공개키와 비밀키를 가지고 있고 애플에서 당신이 누구인지를 확인받고 앱을 서명할 수 있음을 허락받은 인증서를 가지고 있다. 또한 서명된 앱을 당신의 디바이스에서 사용할 수 있도록 해주는 프로비저닝 프로파일을 가지고 있다. 이제 앱을 빌드하여 실제 디바이스에 배포할 수 있는 모든것을 갖추었다고 볼 수 있다.

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

Xcode에서 빌드를 하면 .app 파일을 얻게 되는데 사실 이것은 하나의 파일이 아니고 앱의 모든 것을 답고있는 하나의 폴더라는 것을 알 수 있다. Finder에서 .app 파일을 오른쪽 클릭 후 "Show Package Contents"를 클릭하면 그안에 있는 내용을 볼 수 있다. 다른 모든 포르젝트 파일들 중 주목할 만한 것은


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

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


앱이 최종적으로 디바이스에 인스톨 될 때 iOS에서는 많은 일들이 일어난다. 먼저 앱에 포함된 프로비저닝 프로파일이 애플에서 서명된 것인지를 확인하고 다음으로 "CodeResources"란 파일에 기록된 각 파일의 해쉬 정보를 실제의 파일들과 확인을 하여 어떤 파일도 빌드 후에 수정이 되지 않았음을 확인한다. 이중 어떤 과정에 문제가 있으면 앱은 설치되지 않는다. 그리고 마지막으로 앱을 실행할때도 확인과정을 거친다. iOS는 앱이 변조되지 않았음을 확인하고 디바이스에 앱에 포함된 프로비저닝 프로파일과 같은 프로비저닝 프로파일을 가지고 있는지 확인한다.


다른 배포 과정


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

Enterprise 배포는 약간 다른데, 당신의 회사가 수많은 iPhone유저들을 가진다고 하면 애플은 그런 회사를 더 신뢰할 수 있는 충분한 이유가 있으므로 개발자에게 개발자가 정말로 애플인것처럼 개발한 앱들을 서명할 수 있는 인증서를 발급해준다. 따라서 이 인증서로 서명된 앱들은 따로 확인을 거치지 않고, 모든 디바이스를 애플에 등록하지 않고도 개발된 앱을 디바이스에서 바로 실행할 수 있도록 해준다. 그 외는 비슷한 과정을 거친다.

마지막으로 설명할 것은 앱스토어 배포과정인데, Enterprise배포와 비슷하지만 이 배포과정에 포함되는 프로비저징 프로파일은 빌드된 앱이 어떤 디바이스에서도 실행이 되지 않도록 한다. 앱스토어를 위해 빌드된 앱은 앱스토어 제출 용도 말고는 어디에서도 쓸 수가 없다. 그리고 애플측에 앱을 제출되었을때는 이 앱은 당신에 의해 이미 서명되었고 프로비저닝 파일을 가지고 있기 때문에 애플에 인증된 개발자가 제출한 앱임을 확인할 수 있다. 그리고 애플측에서 이 앱을 승인하면 애플에서 자신들의 서명을 다시 함으로써 이 세상의 모든 iOS 디바이스에서 실행될 수 있도록 해주는 것이다.

나도 iOS 앱을 개발하면서 이것들이 대체 죄다 뭐하는 거며 어디에 쓰길래 이렇게 사람을 귀찮게 하나 궁금했는데 과정을 하나하나 풀어보니 아 이래서 이런것들이 필요하구나 하는 감이 이제야 잡힌다.



출처 : http://la-stranger.blogspot.jp/2014/04/ios.html