먼저 키체인에서 해당 인증서를 이용해 .p12파일로 내보내기를 하여야 합니다.
PUSH인증서를 마우스 오른쪽 클릭하여 내보내기 합니다. (ex : cert.p12)
그리고 PUSH인증서에 물려있는 개인키 또한 내보내기 합니다. (ex : key.p12)

터미널을 열어서 2개의 파일이 있는 곳으로 이동하여 아래는 명령어를 입력합니다.

openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
openssl pkcs12 -nocerts -out key.pem -in key.p12
openssl rsa -in key.pem -out key.unencrypted.pem
cat cert.pem key.unencrypted.pem > ck.pem


이렇게 하면 최종 산출물인 ck.pem 파일이 생성됩니다.
이 하나의 파일을 서버에 업로드 하면 됩니다.

아래는 서버단의 PHP소스 코드 입니다. 간단하게 인터넷에 널린 소스로 작성해 봤습니다.

<?php
$pass = 'C:\\APM_Setup\\htdocs\\ck.pem'; // 파일 경로

$token64 = '0fb09763c1278d20ec92045321501130fe16963728ecf98f3201b9c651e9a047'; // 테스트할 토큰..

// The actual notification payload
$body = array();
$body['aps'] = array('alert' => 'Message received from Bob');// 보낼 메세지

/* End of Configurable Items */

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $pass);
   
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
    echo "Failed to connect $err $errstr\n";
    return;
}      
       
$payload = json_encode($body);
// Thank you to the Perl example
$msg = chr(0).pack("n",32).pack('H*',$token64).pack("n",strlen($payload)).$payload;
fwrite($fp, $msg);
fclose($fp);

echo $err."  bbbb<br/>";
echo $errstr."    cccc";

?>
파일경로와 토큰만 제대로 써주시면 테스트하는데는 무리 없으리라 봅니다.

위와 같은 소스가 인터넷에 널려있는데.. 아무리 해도 안되길래..
$msg 쪽을 계속 바꿔봤더니 되더군요.. 소스마다 조금씩 틀리더군요..
그리고 php의 경우 openssl을 사용할 수 있도록 PHP에 설정을 해야합니다.

apmsetup의 경우 php확장 탭에 php_openssl.dll을 체크해주시고 restart 해주시면 됩니다.
리눅스 쪽은 찾아보진 않았지만 수정하면 되겠죵?ㅋ 참고하세요