這是一篇來自[raywenderlich](http://www.raywenderlich.com)的教程,內容翔實!結構簡單透徹、講解循序漸進、文章質量上乘!是一篇難的的博文!使用半瓶的英語水平翻譯了一下:
1.【iOS push全方位解析】(一) [push的概述](http://blog.csdn.net/hherima/article/details/45583787)
2.【iOS push全方位解析】(二) 生成push證書,生成Provisioning Profile(本篇)
3.【iOS push全方位解析】(三) [一個極簡的demo,并測試一下push](http://blog.csdn.net/hherima/article/details/45624075)
[這里查看原文](http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1)
### Provisioning Profile和證書,Oh My!
為了App中push通知好用,App需要provisioning profile簽名。另外,App Server需要用SSL證書對push通知簽名。provisioning profile和SSL 證書是緊密連接在一起的,并且僅對一個App ID可用,這么做可以保證只有你的App Server可以發送push消息到你的App而不是別人的App。
正如你所知,App使用不同的provisioning profile分別用于開發和發布。同樣,也有兩種push證書:
● Development 被開發者provisioning profile簽名的app,App Server必須使用開發者證書發送通知。
● Production 按照Ad Hoc或者APP Store發布的app,App Server必須使用production證書。如果兩者混淆,那么App則收不到push通知。
本教程僅使用development 證書

### 生成Certificate Signing Request(CSR)
還記得你是如何為App真機聯調生成Development 證書么?如果記起來了,下面的步驟會很熟悉。但,我建議你還是嚴格按照步驟操作。大多數做push通知開發的時候,都遇到了證書問題。
數字證書是基于公-私鑰的密碼學。你不必知道cryptography如何使用證書:,但是你有必要了解:證書總是跟私鑰一起工作的。證書只是“公-私鑰”的公開部分。發給其他人是安全的,然而,私鑰應該被保護好,它是一個秘密。私鑰不是別人的事兒,而是你自己的事!有一點很重要:沒有私鑰,不能使用證書。
無論什么時候,請求一個數字證書,需要提供一個Certificate Signing Request(簡寫CSR)。當生成CSR,一個新的私鑰被放到mac的鑰匙串中了。接著,你發送CSR到一個證書機構(這里就是iOS developer protal),該機構將基于你提交的CSR生成SSL證書。
打開mac中的“鑰匙串”,選擇菜單,“Request a Certificate from a Certificate Authority”

(圖)請求證書1
如果你沒有這個菜單選項或者顯示“Request a certificate from a certificate Authority with key”,你下載并安裝[WWDR InterMediate Certificate](https://developer.apple.com/certificationauthority/AppleWWDRCA.cer)?,并確保在鑰匙串窗口中沒有選中任何一個私鑰。
你應該看到下圖:

(圖)請求證書2
輸入email地址。我聽說需要使用,用于App簽名的email相同。但是,好像其他什么email都ok。
輸入“PushChat”作為名字,這兒可以輸入任何字符,找一個好記的,方便后面我們發現私鑰。選中【 Saved to disk】點擊“Continue”。將文件保存為“PushChat.certSigningRequest”。在“密鑰”這個欄中可以看到剛剛申請的private,右鍵,并選擇“Exprot”

(圖)導出證書
保存私鑰為PushChatKey.p12并輸入一個密碼。本教程中,我使用“pushchat”作為p12文件的密碼,但是你應該選一個容易記的密碼。這個密鑰(p12)文件需要保密。
### 生成App ID和SSL證書
登錄iOS Dev Center選擇右側面板的“Certificate,Identifiers&Profile”。

(圖)iOS dev center
下面的界面出現了

(圖)Certificate,Identifiers&Profile大綱
既然我們搞iOS app,在iOS Apps中選擇“certificates”。現在你可以生成一個新的App ID。每一個push App需要唯一的ID,因為push通知是發送給指定的app
在左側點擊“App IDs”,點擊“+”按鈕

(圖)添加App id
輸入下面的信息:
● App ID Description:PushChat
● App Services Check the push Notification Checkbox
● Explicit App ID
你最好使用自己的BundleIdentifier-com.yoursite.PushChat-而不是使用我的。你還需要在Xcode中設置相同的Bundle ID。輸入這些信息后,點擊“Continue”。將詢問你是否確定這些信息,如果一切無誤后點擊“Submit”
哈哈!你已經成功注冊了一個新的App ID

(圖)App ID生成了
接下來幾分鐘,你還會生成SSL證書,App Server將使用這個SSL證書跟APNS建立一個安全連接。這個證書跟App ID相連。APP Server只能發送push通知給這個App ID的程序,而不是其他App。
生成App ID后,它看在列表中這個位置:

(圖)App id的展示
在列表中點擊這個PushChat App id,一個相關的窗口出現了:

(圖)App id詳情
注意在“Push Notification”這一行,兩個橙色的原點,“Configurable”分別在Develop和Distribution欄。這表示你的App ID可以用于push,但是你還需要設置一下。點擊“setting”按鈕,配置一下:

(圖)App id config
向下滾動到“Push Notification”這一段,選擇Develop SSL Certificate這一行的“Create Certificate”按鈕。

(圖)生成證書
“Add iOS Certificate”向導出現了:

(圖)向導
第一件事,詢問你生成Certificate signing Request,這一步你已經做完了,點擊“continue”。下一步,你該上傳CSR文件。選擇剛才生成的CSR,點擊“Generate”。
生成SSL 證書這將花費幾秒鐘,當它進行完成,點擊“Continue”。

現在點擊“Download”來獲取證書,它自動被命名為“aps_development.cer”

(圖)下載證書
正如你看到的,你已經有一個可用的證書,現在開發可以用push了。如果有需要,你還可以下載這個證書。開發者push證書三個月有效。
當你發布app,重復上面的操作。獲取一個production 證書。步驟是相似的。production證書的有效期是一年,你需要確保在期限前。
沒必要添加這個certificate到鑰匙串,當然你可以雙擊aps_development.cer文件,你會發現它跟私鑰關聯起來了。
### 制造PEM文件
到目前位置,你有三個文件:
● CSR文件
● PushChatKey.p12私鑰文件
● SSL證書(aps_development.cer)
將這三個文件保存好。你可以把CSR扔了,但是我覺得存著更容易一些。當證書過期,你可以使用那個CSR來生成一個新的證書。如果你生成一個新的CSR,還要導出一個新的私鑰(p12)。通過復用CSR你可以使用已有的私鑰,僅.cer文件會變化。
你得將證書和私鑰轉成更容易使用的格式。因為,我們的app Server是用PHP寫的,所以你需要將證書和私鑰合成為PEM格式。PEM格式對PHP來說更容易使用。如果你的app Server使用其他語言寫的,下面這些步驟不使用了。
你將使用OpenSSL命令行來操作。打開命令行執行下面的步驟,進入證書的下載文件夾,我的是桌面:
$ cd ~/Desktop/
轉換cer為pem文件
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
轉換p12為pem文件
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
Enter Import Password:?
MAC verified OK
Enter PEM pass phrase:?
Verifying - Enter PEM pass phrase:?
你第一次需要輸入p12的密碼,這樣opensll可以讀取它。接著你還為PEM需要輸入一個新的密碼。這兒我還使用“pushchat”,你可以使用更安全的密碼。
注意:如果你沒有輸入PEM密碼,openssl不會提示錯誤信息,但是生成的pem文件并沒有私鑰。
最后,合成證書和key為一個pem文件
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
至此,檢查一下證書是否正常。執行下面的命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
上面是一個普通,沒有加密的連接到APNS Server。看到以上的信息,說明你的mac可以連接到APNS。Ctrl + C關閉連接。如果得到錯誤消息,確保防火墻對2195是放開的。
我們再連接一次,這次使用SSL證書和私鑰建立安全連接
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195?
? ? -cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:?
你應該看到一大堆輸出,這些是openssl想讓你知道后面在干什么。如果連接成功,你可以鍵入一些字符。輸入回車,服務器關閉了連接。如果建立連接的時候有問題,openssl會給出錯誤信息,但是你得向上滾動查找到并查看。
【注意】:有兩個APNS服務器:沙盒服務器用于測試,線上live用于生產模式。這里,我們使用沙盒服務器,因為我們的證書是development的,不是distribution的
-----------------------------------------------------------------------------------------------------------------------------
譯者加:
生成openssl證書和ck.pem的過程可以歸納為:

-----------------------------------------------------------------------------------------------------------------------------
### 制造provisioning profile
在iOS Dev Center 還沒有,點擊左側欄的Provisioning profiles按鈕,點擊“+”按鈕。

(+provisioning file)
**Step1:選擇類型**
選擇“iOS App development”選項按鈕,點擊continue

(provision develop)
**Step2:配置**
選擇PushChat app ID,可以保證provisioning profile準確的綁定了PushChat App

(選擇app id)
**Step3:生成**
選擇要包含的證書,這一步現在應該很常規。

(選擇證書)
**Step4:選擇devices**
選擇你想包含的設備,

**Step5:profile的名字**
設置provisioning profile的名字為“PushChat Development”

(provisioning name)
你幾乎已經完成了,最后,點擊“Download”按鈕,下載最新生成的provisioning profile。
雙擊provisioning profile添加到Xcode或者拖拽到xcode中。
如果你是發布App,可重復相似的過程。生成一個Ad Hoc或者App Store發布的profile。