-
[iOS] Certificate & Provisioning야매 iOS 2023. 8. 7. 07:20
사전 지식
비대칭키 암호화
Public key로 암호화 하면 Private key로 복호화한다.
iOS 개발에서 자주 사용하는 비대칭키 암호화 방식은
- RSA
- ECDSA
암호화 해시 함수
메시지를 받아 해시 함수를 거치면 고정된 길이의 변환된 텍스트(digest)가 생성된다
one way function
- 암호화된 텍스트 복호화 안됨
original digest와 생성한 digest를 비교해서 변조됐는지 알 수 있다.
전자서명
전자서명을 통해 메시지가 믿을 만한 사람으로부터 생성되고 메시지가 변조되지 않았다는 것을 알 수 있다
→ 문서 또는 메시지를 믿을 수 있는지 (믿을 만한 사람 & 내용 변조 ㄴ)
위에 두 기술을 사용해 전자 서명 생성할 수 있다.
전자 서명은 비대칭키 암호화와 다르게 private key로 암호화 하고 public key로 복호화 한다.
전자 서명 플로우
- 메시지에 해시 함수를 적용해 digest를 생성한다.
→ digest를 사용해 signature를 생성하는 것이 전체 메시지를 사용하는 것보다 효율적이다 - Private key를 사용해 digest를 암호화 하고 signature를 생성한다
→ sigining - Receiver에게 signature, public key 그리고 메시지를 전달한다.
- Receiver는 메시지에 해시 함수를 적용해 digest를 생성한다
- public key를 사용해 signature를 복호화해 Sender가 생성한 digest를 얻는다
- Receiver가 생성한 digest와 Sender가 생성한 digest를 비교해서 똑같은지 확인한다.
애플리케이션이 실행되기 위한 플로우
- Xcode 설치
- Apple Developer 계정
- App ID 생성 (다른 앱과 구분 지을 수 있는 identifier)
- Apple Developer Website에서 생성
- 필요한 capability 활성화
- 인증서 생성
- app을 sign 할 수 있게 Development와 Distribution 인증서 생성
- Provisioning Profile 생성
- 어느 기기에서 앱을 실행할 것인지, 어느 인증서를 사용해 앱을 sign 할 것인지 app의 entitlement 등에 대한 정보
- 현재 환경설정에 맞는 provisioning profile 선택
- 컴파일하고 실행
Code Signing
sign한 이후 앱의 변조된 내용이 없다는 것을 보증한다.
💡 기기에 앱을 설치하기 전에, 앱 스토어에 제출하기 전에 애플에서 발급한 인증서를 통해 sign해야 한다.
사전 지식에 있는 전자 서명처럼 코드 서명iOS 앱과 전자 서명
iOS 앱 개발에서 메시지는 전체 앱 코드
Xcode가 코드를 sign하고 App Store에 제출 또는 다른 기기에 배포한다(TestFlight)
하지만 다른 사람들이 public key, 메시지, signature를 생성할 수 있으므로 public key가 믿을 수 있는 사람으로부터 받았는지를 알기 위해 전자 인증서를 사용한다.
Certificate
Public Key Certificate(digital certificate)는 public key의 유효성을 증명할 수 있다.
CA에서 제공받은 digital certificate로 신원을 확인한다.
인증서는 유효 기간을 가지며 그 시간이 지나면 인증서로서 기능할 수 없다.
Certificate 종류
Development Certificates
개발과 테스트할 때 사용
- 개발자가 설치하고 디바이스에서 실행할 수 있도록 함
Distribution Certificates
배포할 때 사용
- AppStore에 제출 또는 TestFlight
기타 타입
https://en.wikipedia.org/wiki/Public_key_certificate
인증서 구성 요소
인증서의 여러 포맷이 존재하지만 그 중 iOS 개발에서 가장 많이 사용되는건 .cer과 .p12
cer
X.509 포맷 인증서
Apple Developer Website에서 다운로드를 받을 때 얻는 인증서 타입
구성품
- public key
- sign된 앱을 복호화해서 앱의 무결성을 확인할 때 사용
- private key는 주로 키체인에 저장된다.
- Information
- 앱 정보 또는 개발자 저오
- 전자 사명
- CA에서 얻으며 인증서가 믿을만 하다는 것을 입증한다.
p12
PKCS #12 포맷 인증서
private key와 X.509 인증서를 포함한다
- Xcode에서 인증서를 생성하거나 누군가 키체인에서 인증서를 추출해 공유할 때 이 포맷 형태를 띈다.
Certificate Authority (CA)
CA는 인증서를 관리하는 기관
iOS 개발자의 인증서는 end-entity certificate 또는 leaf certificate
- Apple Worldwide Developer Relations Certifications Authority(AppleWWDRCA)에서 발급 받음
AppleWWDRCA
Apple Root CA가 발행한 intermediate certificate
개발자가 제출한 앱의 signature를 입증할 때 사용
- Xcode를 설치할 때 자동으로 사용된다.
Apple Root CA
iPhone, MAC 또는 다른 애플 기기에 디폴트로 있는 최상위 CA
인증 플로우
각 Certificate가 상위 node의 sign을 받아 마지막 노드에서 sign을 받으면서 인증 절차를 수행한다.
→ Chain of trust
- signature은 private key를 이용해 sign 된다.
- CA의 public key를 사용해 복호화 한 결과로 owner의 public key와 정보를 얻을 수 있다.
- 인증서에 있는 정보가 1 단계에서 얻은 정보와 같은지 비교한다.
- 만약 같다면 인증서는 믿을 만한 소스에서 받아온 것이고 public key도 믿을 만하다.
이 과정을 통해 owner의 public key가 공인되었다는 정보를 얻을 수 있다.
하지만 이때까지의 정보로 코드 서명이 인가 된 사람은 누구인지, 누가 다운로드 받을 수 있는지는 알 수 없다.
이러한 정보를 provisoning profile에 저장되어 있으며 archive할 때 같이 패키징 된다.
Provisioning Profile
Provisioning Profile은 pList
- 개발과 배포에 필요한 config 정보를 갖는다
Flow
- Xcode는 App ID, entitlements 그리고 인증서가 provisioing profile과 일치하는 지 확인한다.
- archive할 때 Xcode는 .ipa 파일 내부에 provisioing profile을 포함한다.
- iOS 기기는 앱의 config가 provisioning profile과 일치하는지 확인한다.
- App Store에 앱 제출했을 때 App Store는 앱이 제대로 sign되었는지 그리고 config가 provisioning profile과 일치하는지 확인한다.
Development Provisioning Profile
- 테스트 기기에 개발 앱 설치 가능하도록 함
- 설치할 수 있는 기기 리스트를 가짐
- 여러 개발 인증서 포함
Distribution Provisioing Profile
전체 프로세스
'야매 iOS' 카테고리의 다른 글
[Swift] Copy on Write (0) 2023.08.07 [iOS/Swift] SwiftUI 계산기 (0) 2023.08.07 [Swift] some & any (0) 2023.08.07 [Swift] Protocol Oriented Programming (0) 2023.08.07 [iOS/Swift] @StateObject vs @ObservedObject (0) 2023.08.07