관리 메뉴

DirTy™의 생활연구소

[IOS] APNS 인증서 만들기 본문

DirTy™의 하루일과/DirTy™의 가당찮은iOS

[IOS] APNS 인증서 만들기

더리 DirTy™ 2015.10.27 13:42

APNS 인증서를 만들때마다 매번 까먹고

검색하는 것도 귀찮아서 내 블로그에 포스팅 해본다.


이포스팅을 하는데 사용한 환경은 아래와 같다.

1. OS X El Capitan ver10.11.1

2. XCode ver 7.1(7B91b)

3. iOS 9.1


1. 개인 인증서를 만들자.

APNS 인증서를 만들기 위해서는 먼저 키체인을 이용하여 CertificateSigningRequest.certSigningRequest라는 인증서를 만들어야 한다.


이 개인인증서는 Notification인증서를 만들때 반드시 필요하니 우선 키체인(Keychain)을 실행한 후 아래와 같이 차례대로 따라 해보자.


키체인 실행 > 키체인 접근 > 인증서 지원 > 인증 기관에서 인증서 요청... 을 클릭.


디스크에 저장됨 + 본인이 키 쌍 정보 지정을 꼭 체크!!!

이메일은 꼭 자기가 사용하는 개발자 이메일을 넣자.


그림과같이 설정.(기본설정이 이화면 일거임)


이로써 개인 인증서가 생성 되었다.


CertificateSigningRequest.certSigningRequest 파일이 자신이 저장된 경로에 있는지 확인하자!

나는 데스크탑에 TEST_APNS폴더를 만들고 CertificateSigningRequest.certSigningRequest 파일을 넣어두었다. 후에 포스팅에서는 TEST_APNS폴더에 모든 파일을 생성 한다.


2. APNS인증서를 만들자.

위에서 개인인증서를 만들었으니 애플 개발자 사이트(https://developer.apple.com)로 이동해보자.

애플 개발자 사이트에서 가장 하단으로 이동하면 아래와 같이 보인다.


화살표가 있는 곳을 선택해보자.

클릭하면 아래의 페이지로 이동한다.


다시 화살표가 있는 곳을 선택.


App IDs메뉴가 불려진 모습이다. 모두 알듯이 자신이 만든 앱아이디를 한눈에 볼 수 있는 탭이다.

APNS사용을 하기 원하는 앱아이디를 선택한다.


선택하면 해당앱에서 사용중인 서비스를 한눈에 알아볼수 있게 표시가 된다.

우리는 Push Notification을 사용해야한다. Edit를 선택해보자.


나는 이미 app id를 만들때 Push Notifications를 활성화 해놓았다.

활성화가 되어있지 않다면 일단 파란색 체크 마크가 있는곳을 체크하자.

위의 그림과 같이 개발용과 배포용으로 인증서를 만들수 있다.

일단은 개발용으로 만들어보자. 개발용 Create Certificate...를 선택하자.


이과정은 아까 1번과정을 설명해 놓은 글이다. 우리는 이미 1번과정에서 만들어 놓았으니 아무것도 할거없이 Continue를 선택.


1번에서 만들어놓은 인증서를 업로드 해야한다. Choose File을 선택하여 CertificateSigningRequest.certSigningRequest 파을을 선택한다.


선택후 위와같이 Generate를 눌러 개발용 APNS인증서를 발급받아 보자.


드디어 개발용 인증서가 만들어졌다. Download 선택후(파일잘보관해야함) Done을 선택하자.

Download받은 파일을 실행하여 키체인에 인증서를 추가하자.


위와 같은 방법으로 배포용도 만들수 있다.


3. APNS 서버에서 사용할 인증서를 만들자.

서버에서 사용할 인증서를 만들 마지막 관문이다.


java를 이용할 경우 p12파일을 필요로 하고 php를 이용할 경우 pem파일을 이용하는데

우선 java를 이용한 인증서를 만들어보자.


java를 이용한 서버에서는 키체인에서 아래와같이 해당 Push Service를 찾아서 인증키와 개인키 두개를 묶어서 2개항목 내보내기를 한다.



보낸항목에 대한 암호를 설정해 주면 내가 원하는 서버에서 사용할 APNS p12 파일이 만들어졌다.

이파일과 비밀번호를 해당 APNS 코드에 설정하면 된다. 이쪽이 간단하다.

회사에서도 Javapns를 이용하여 사용하고 있어서 이방법으로 사용중이다.

 

<-- 추가2016.02.26 -->

이번에 푸시인증서 갱신을 하는데 푸시 메시지가 안와서 찾아보았다.
예전 키체인에서 내보내기 하는 방법을 사용하지 않고,
터미널에서 openssl 커맨드로 생성하는 방법으로 하라는 포스팅을 보았다.

아래와 같은 방법으로 하니 정상동작 한다.


aps_production.cer <= 애플 개발자 사이트에서 다운로드 받은 푸쉬 배포용 인증서 파일
mykey.p12 <= 키체인에서 내보내기 한 개인키 파일


openssl x509 -in aps_production.cer -inform DER -out aps_production.pem -outform PEM
openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem
openssl pkcs12 -export -inkey mykey.pem -in aps_production.pem -out apns_pro.p12

 

최종적으로 apns_pro.p12 파일을 사용하면 된다.

<-- 추가 끝 -->


다음으로 php에서 사용하게 될 pem 파일을 생성하여 보자. 위과정보다 상당히 복잡하다.


일단 키체인에서 Push Service목록을 찾아서 옆의 화살표를 클릭하면 개인키가 아래와 같이 나타나니 개인키가 보이도록 해놓자.


우선 인증키를 우클릭해 그림과 같이 보내기 선택.


선택 후 저장을 위한 창이 뜬다. 별도 저장에 이름을 cert로 변경하고 저장하자.

아래는 OS 버그인지 뭔지 12만 보이는데 파일 포맷은 개인 정보 교환(.p12)이다.


저장을 하면 암호를 넣으라는 위와같은 창이 나타난다. 원하는 패스워드를 입력 후 승인을 누르자.


인증서 아래에 딸려 있는 개인키도 위와같은 방법으로 저장한다.

키를 우클릭 하여 보내기를 선택.


인증서와 마찬가지로 개인키도 같은 작업을 반복한다. 별도 저장에 key로 변경하여 저장한다.


키에서 사용할 비밀번호를 설정하고 승인을 누르자.


이작업후에 TEST_APNS폴더를 보면 cert.p12와 key.p12 파일들이 만들어져 있을 것이다.

이제부터가 중요하다!!!


인증서의 형식을 변환하기 위해 Terminal을 실행해보자.

나는 Desktop/TEST_APNS폴더에 인증서, 키 파일을 생성하였다.

아래와 같이 생성한 cert.p12, key.p12 파일이 있는곳으로 이동하자.


cd Desktop/TEST_APNS/


폴더로 이동하였으면 이제부터 4가지 명령어를 실행하면 끝이난다.

첫번째로 인증키에 대한 아래의 명령어를 실행해보자.

openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12 


그러면 아래와같이 패스워드를 입력하라고 나온다. 위에서 비밀번호 입력해 놓은것을 입력 하면 

Enter Import Password:

아래와같이 OK라고 나오면 성공.

MAC verified OK


이러면 해당 Desktop/TEST_APNS 폴더에 cert.pem 파일이 생성 되었을 것이다.


두번째로 개인키에 대한 아래의 명령어를 실행해보자.

openssl pkcs12 -nocerts -out key.pem -in key.p12 


전에 key에대해 입력해 놓은 비밀번호를 입력한다.

위의 cert와 동일하지만...

Enter Import Password:

MAC verified OK


마지막에 pem파일에 대한 패스워드를 입력하는 작업 해주어야한다.

비밀번호를 입력해보자.

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:


이러면 해당 Desktop/TEST_APNS 폴더에 key.pem 파일이 생성 되었을 것이다.


세번째로 key.pem으로 key.unencrypted.pem 파일을 만들기위해 아래의 명령어를 실행해 보자.

openssl rsa -in key.pem -out key.unecrypted.pem


그러면 위의 key.pem을 생성할때 넣은 비밀번호를 넣으라는 문구가 나온다.

비밀번호를 입력하자.

Enter pass phrase for key.em:

RSA키가 입력되었다고 하면 성공.

writing RSA key


마지막 네번째로 아래의 명령어를 실행해보자.

cat cert.pem key.unecrypted.pem > apns.pem


이러면 해당 Desktop/TEST_APNS 폴더에 apns.pem 파일이 생성 되었을 것이다.


개발용으로 만들어본 인증서의 폴더에 아래와같이 6개의 파일이 있으면 성공이다.

cert.p12

key.p12

cert.pem

key.pem

key.unencryped.pem

apns.pem


이제 만들어진 apns.pem파일로 php로 만든 푸시 테스틑용 코드에 적용하여 테스트 해보면 끝이다.

배포용 인증서도 위의 방법과 동일하게 실행하여 만들수 있다.


정말 푸시메시지 인증서 하나에 왜이렇게 많은 공을 들여야 하는지 의문인 애플 시스템에 가끔은 현기증이 날 지경이다.





 





6 Comments
  • 프로필사진 2016.05.12 16:22 신고 정말 공감 동감입니다. ^^ 포스팅 고맙습니다.
  • 프로필사진 더리 DirTy™ 2016.05.13 11:15 신고 댓글 감사합니다 ^^
  • 프로필사진 ji 2016.05.19 21:06 신고 안녕하세요! 푸시알림을 만들어 보려고 하는 학생입니다. 처음 만드는것이라 천천히 따라하면서 하고 있고 6개 파일까지는 만들었습니다 ㅠㅠㅠ 그런데 php코드로 만든 푸시 테스트용 코드는 어디서 알아볼 수 있을까요? 관련 정보가 있는 곳이나 찾을 수 있는 곳을 알려주시면 감사하겠습니다
  • 프로필사진 더리 DirTy™ 2016.05.20 09:58 신고 제가 사용하는 코드로 수정해서 쓰세요.
    간단히 테스트만 해보신다면 맥 앱스토어에 Apn Tester Free라는 앱도 있습니다.

    <?php
    $token = "your device token"; // iphone
    $apnsPort = 2195;
    $passphrase = 'your pem password';
    // dev
    $apnsHost = 'gateway.sandbox.push.apple.com';
    $apnsCert = 'Plusapns.pem';

    // production
    //$apnsHost = 'gateway.push.apple.com';
    //$apnsCert = 'apns-production.pem';

    $message = $_POST['message'];
    $sender = 'admin';
    $type = $_POST['type'];
    $program = 'libplus';
    $schoolnumber = $_POST['schoolnumber'];
    $sendtime = '2014-04-04 12:00:00';

    $message = urldecode($message);
    $message = iconv('euc-kr', 'utf-8', $message);

    $streamContext = stream_context_create();
    stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
    stream_context_set_option($streamContext, 'ssl', 'passphrase', $passphrase);

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);
    if ($apns) {
    $payload['aps'] = array('alert' => '테스트테스트', 'badge' => 0, 'sound' => 'default', 'type' => '1', 'bSeqNo' => '111','schoolNo' => '200031559');
    $output = json_encode($payload);
    $token = pack('H*', str_replace(' ', '', $token));
    $apnsMessage = chr(0) . chr(0) . chr(32) . $token . chr(0) . chr(strlen($output)) . $output;
    fwrite($apns, $apnsMessage);

    fclose($apns);
    }
    ?>
  • 프로필사진 devjms 2016.05.31 16:59 신고 포스트 내용 출처 포함해서 퍼가겠습니다~ 내용 보고 javapns쪽 해결 할 수 있었습니다. :)
  • 프로필사진 더리 DirTy™ 2016.06.01 09:57 신고 ^_^ 해결돼셨다니 다행이네요.
댓글쓰기 폼